Meter Provider
这是一个常见的用例,即动态地将标签附加到 Meter
上。假设我们执行一个作业,并且希望使用 Timer
来对其进行监控:
Timer.Sample sample = Timer.start(registry);
Result result = job.execute();
Timer timer = Timer.builder("job.execution")
.tag("job.name", "job")
.tag("status", result.status())
.register(registry);
sample.stop(timer);
这让我们能够根据我们计时的操作的最终状态动态确定 status
标签。这样做有两个缺点:
-
每次执行上述代码时,都会创建一个新的
Timer.Builder
实例。这会增加垃圾回收器(GC)需要收集的数据量。 -
上述代码有些样板化,它不允许你定义
Timer
的通用属性,并附加动态变化的内容,而是所有内容始终存在。
在某些情况下,你可以使用 registry.timer("job.execution", "job.name", "my-job", "status", result.status())
来替代 Timer.Builder
,这样可以节省一些额外的对象,但这并不总是可行的。
你可以通过使用 MeterProvider
来解决这两个问题。它是一个方便的接口,用于通过标签从公共的“模板”中创建新的计量器。
并非每个 Meter
都能做到这一点,MeterProvider
可以与 Counter
、Timer
、LongTaskTimer
和 DistributionSummary
一起使用。
你可以做以下事情来代替上述操作:
private MeterProvider<Timer> timerProvider = Timer.builder("job.execution")
.tag("job.name", "my-job")
.withRegistry(registry); 1
// ...
Timer.Sample sample = Timer.start(registry);
Result result = job.execute();
sample.stop(timerProvider.withTags("status", result.status())); 2
定义
Timer
的MeterProvider
,包含所有必要的“静态”字段。请注意withRegistry
方法的调用。定义动态标签。请注意,这里只定义了那些动态的标签,其他所有内容都在创建
MeterProvider
的地方定义。withTags
方法返回一个Timer
,该Timer
使用withTags
中定义的标签以及MeterProvider
定义的所有其他内容创建。
这个例子和之前的例子产生相同的输出,唯一的区别在于代码中的样板文件量以及在堆中创建的构建器对象的数量。