4

使用@Timed注解,我们可以计算方法运行所需的时间:

@Timed 
public void loopInput(int counter){
    for (int i = 0; i < counter; i++){
        i++;
    }
}

但是,假设我们的方法有一些输入,它的大小可以显着改变运行方法所需的时间(如上面的示例)。

@Timed如果没有关于输入大小的一些额外潜在信息,那么这个时间测量是没有意义的吗?

如果输出大小不同,它也将毫无意义:

    @Timed
    public void printStudentCourses(int studentId){
       //get student from DB
       // ...
       for (Course cource: Student.getCourses()) {
          System.out.println(cource);
       }
    }

当然,打印具有较大课程列表的学生将需要更长的时间。

所以:

  1. 我们可以从@Timed测量中获得哪些真正的见解?
  2. 有没有办法为@Timed测量添加一些额外的信息?
4

2 回答 2

2

@Timed旨在成为添加计时器的简单方法。这对于了解一种方法需要多长时间以及让您质疑为什么它需要比预期更长的时间很有用。仅这些数据就会告诉您可能存在异常值并且需要单独测量这些异常值。

为了获得单独的见解,添加有助于在不同计时器之间划定的标签可能是值得的。

在这里,我根据被迭代的数量添加一个标签(桶可能是 1、2-5、> 5)

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);
     }
   })
}
于 2018-04-30T13:11:07.647 回答
0

的用法@Timer因不同的应用程序而异。我个人用它来测量 servlet 请求的运行时间。因此,在这种情况下,您可以获得每个请求的运行时间的高级视图,并且您可以创建有趣的图表,让您了解应用程序的工作方式,如果出现问题,您可以创建警报(使用其他指标集合Prometheus 等工具)。所以回答你的问题:

  1. 您可以随时间测量函数的时间(不关心输入大小)、创建直方图、监控应用程序运行状况
  2. 一种解决方案是添加自定义标签(如答案中提到的@checketts),或者如果它太复杂而无法放入现有库中,您可以创建自己的逻辑。您可以使用您觉得舒服的任何逻辑导出自己的指标
于 2018-04-30T13:27:19.917 回答