如何为单个进程实现 dropwizard 指标?

how to implement dropwizard metrics for a single process?

您好,我是 java 的新手,我正在尝试学习如何使用 Dropwizard Metrics 库来衡量单个进程的性能。我查看了他们的入门指南,并了解了他们为 MetricsRegistry 编写的内容 运行,但不明白如何将流程和 metricsRegistry 合二为一(它衡量我的流程所花费的时间,而不是运行).

所需的时间

我的措辞可能有很多错误,但希望我的问题足够清楚。提前感谢我能得到的任何 help/clarification!我在下面粘贴了我想要测量的代码(pi 数字到第 n 个数字)以及 Dropwizard Metrics 为他们的入门提供的内容:

package decimals;

import java.util.Scanner;
import java.math.BigDecimal;


public class Decimals {


    public static void main(String[] args) {

        BigDecimal seven = new BigDecimal(7.0);
        Scanner input = new Scanner(System.in);
        System.out.println("to what nth?");
        int i = input.nextInt();
        BigDecimal pi = new BigDecimal(22.0).divide(seven, i, BigDecimal.ROUND_UP);

        if ( i < 0) {
            System.out.println("can't be less than 0");
        } else {
            System.out.println(pi);
        }
    }
}

//dropwizardmetrics:


package com.***.***;
import com.codahale.metrics.*;
import java.util.concurrent.TimeUnit;

public class MetricsRegistry {
    static final MetricRegistry metrics = new MetricRegistry();
    public static void main(String args[]) {
        startReport();
        Meter requests = metrics.meter("requests");
        requests.mark();
        wait5Seconds();
    }

    private static void startReport() {
        ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .build();
        reporter.start(2, TimeUnit.SECONDS);
    }

    private static void wait5Seconds() {
        try {
            Thread.sleep(5*1000);
        }
        catch(InterruptedException e) {}
    }



}

将你所有的 Pi 计算逻辑放入一个名为 computePi() 的方法中,然后在你的主方法中试试这个:

public static void main(String args[]) {
    startReport();
    Timer timer = metricRegistry.timer("computePi");    
    Timer.Context context = timer.time();
    try {
        computePi();
    } finally {
        context.stop();
    }
}

在您的示例中,您使用的是 Meter,它不测量执行所需的时间(它测量发生率和总计数)。我把它改成一个计时器,它也可以测量时间。当我调用 timer.time() 时计时器开始计时。然后我在 try 块中执行您的 computePi() 过程。无论 computePi() 内部发生什么,我都使用 "finally" 块来停止计时器。这就是您如何获得执行流程所需的确切时间。