使用@Timed注释计算方法 - 与输入大小相关

时间:2018-04-29 13:14:07

标签: java spring-boot graphite micrometer

使用@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测量添加一些额外信息?

2 个答案:

答案 0 :(得分:1)

@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);
     }
   })
}

答案 1 :(得分:0)

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

  1. 您可以测量功能随时间推移的时间(不关心输入大小),创建直方图,监控应用程序运行状况
  2. 一个解决方案是添加自定义标签(如答案中提到的@checketts)或者如果它太复杂而无法适应现有库,您可以创建自己的逻辑。您可以使用任何逻辑导出自己的指标你觉得很舒服