跳到主要内容

长任务计时器

DeepSeek V3 中英对照 Long Task Timers

长任务计时器是一种特殊类型的计时器,它允许你在被测量的事件仍在运行时测量时间。而普通的计时器只能在任务完成后记录持续时间。

长任务计时器至少发布以下统计信息:

  • 活动任务数量

  • 活动任务的总持续时间

  • 活动任务的最大持续时间

与普通的 Timer 不同,长任务计时器不会发布有关已完成任务的统计信息。

考虑一个后台进程来刷新数据存储中的元数据。例如,Edda 缓存了 AWS 资源,如实例、卷、自动扩展组等。通常所有数据可以在几分钟内刷新完毕。如果 AWS 服务出现问题,可能会花费更长时间。可以使用长任务计时器来跟踪刷新元数据的活动时间。

例如,在一个 Spring 应用程序中,通常使用 @Scheduled 来实现这些长时间运行的进程。Micrometer 提供了一个特殊的 @Timed 注解,用于通过长任务计时器来监控这些进程:

@Timed(value = "aws.scrape", longTask = true)
@Scheduled(fixedDelay = 360000)
void scrapeResources() {
// find instances, volumes, auto-scaling groups, etc...
}
java

这取决于应用程序框架如何处理 @Timed。如果你选择的框架不支持它,你仍然可以使用长任务计时器:

LongTaskTimer scrapeTimer = registry.more().longTaskTimer("scrape");
void scrapeResources() {
scrapeTimer.record(() => {
// find instances, volumes, auto-scaling groups, etc...
});
}
java

如果我们希望在这个过程超过阈值时发出警报,使用长任务计时器,我们会在超过阈值后的第一个报告间隔收到该警报。而使用常规计时器,我们只有在过程完成后的第一个报告间隔才会收到警报,这可能需要一个多小时之后!

该接口包含一个用于长时间任务计时器的流式构建器:

LongTaskTimer longTaskTimer = LongTaskTimer
.builder("long.task.timer")
.description("a description of what this timer does") // optional
.tags("region", "test") // optional
.register(registry);
java