如何为单个进程实现 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" 块来停止计时器。这就是您如何获得执行流程所需的确切时间。
您好,我是 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" 块来停止计时器。这就是您如何获得执行流程所需的确切时间。