如何为单个流程实施dropwizard指标?

时间:2015-08-13 17:00:38

标签: java metrics dropwizard

您好我是java的新手,我正在尝试学习如何使用Dropwizard指标库来衡量单个流程的效果。我已经看过他们的入门并运行他们为MetricsRegistry编写的内容,但不了解如何将流程和metricsRegistry合并为一个(它衡量我的流程所需的时间而不是它需要自己运行的时间。)

我可能会写很多错误,但希望我的问题很清楚。在此先感谢我的任何帮助/澄清!我用下面的代码粘贴了我想要测量的代码(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) {}
    }



}

1 个答案:

答案 0 :(得分:0)

将所有Pi计算逻辑放入名为computePi()的方法中,并在main方法中尝试:

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()过程。我用了#34;终于&#34;无论在computePi()内部发生什么,都阻止停止计时器。这就是您获得执行流程所需的确切时间的方法。