Java 使用@Timed annotation对方法计时-与输入大小相关
使用Java 使用@Timed annotation对方法计时-与输入大小相关,java,spring-boot,graphite,micrometer,Java,Spring Boot,Graphite,Micrometer,使用@Timed注释,我们可以计算方法运行所需的时间: @Timed public void loopInput(int counter){ for (int i = 0; i < counter; i++){ i++; } } 当然,用更大的课程列表打印学生需要更长的时间 因此: 我们可以从@定时测量中获得哪些真正的见解 有没有办法为@Timed测量添加一些附加信息 @Timed是一种添加计时器的简单方法。这有助于了解一种方法需要多长时间,并让您质疑为
@Timed
注释,我们可以计算方法运行所需的时间:
@Timed
public void loopInput(int counter){
for (int i = 0; i < counter; i++){
i++;
}
}
当然,用更大的课程列表打印学生需要更长的时间
因此:
@定时测量中获得哪些真正的见解
@Timed
测量添加一些附加信息@Timed
是一种添加计时器的简单方法。这有助于了解一种方法需要多长时间,并让您质疑为什么它需要比预期更长的时间。单凭这些数据就可以告诉您,可能存在异常值,需要单独测量这些异常值
为了获得独立的见解,添加有助于区分不同计时器的标记是值得的
在这里,我添加了一个基于迭代次数的标记(bucket可能是1,2-5,>5)
@Timer
的用法因不同的应用程序而异。我个人使用它来测量servlet请求的运行时间。因此,在本例中,您可以获得每个请求的运行时间的高级视图,并可以创建有趣的图表,让您了解应用程序的工作方式,如果出现问题,您可以创建警报(使用其他度量收集工具,如Prometheus)。因此,要回答您的问题:
因此,似乎@Timed本身并没有提供足够的信息。我们需要收集更多的信息,以便从中获得真正的见解。这不是真的吗?不一定。可以在代码中插入标记,但也可以在外部添加标记。例如,普罗米修斯添加了“实例id”、“作业”和其他“静态”信息。对于每个事务都会更改的内容,您必须使用自己的计时器(而不是@Timed)
@Timed
public void printStudentCourses(int studentId){
//get student from DB
// ...
for (Course cource: Student.getCourses()) {
System.out.println(cource);
}
}
public void printStudentCourses(int studentId){
//get student from DB
// ...
Metrics.timer("my.timer", Tags.of("bucket", chooseBucket(student.getCourses().size()))).record(() -> {
for (Course course: student.getCourses()) {
//Assuming there is something more expensive worth measuring here
System.out.println(course);
}
})
}