跳到主要内容

Meter Provider

DeepSeek V3 中英对照 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);
java

这让我们能够根据我们计时的操作的最终状态动态确定 status 标签。这样做有两个缺点:

  1. 每次执行上述代码时,都会创建一个新的 Timer.Builder 实例。这会增加垃圾回收器(GC)需要收集的数据量。

  2. 上述代码有些样板化,它不允许你定义 Timer 的通用属性,并附加动态变化的内容,而是所有内容始终存在。

备注

在某些情况下,你可以使用 registry.timer("job.execution", "job.name", "my-job", "status", result.status()) 来替代 Timer.Builder,这样可以节省一些额外的对象,但这并不总是可行的。

你可以通过使用 MeterProvider 来解决这两个问题。它是一个方便的接口,用于通过标签从公共的“模板”中创建新的计量器。

备注

并非每个 Meter 都能做到这一点,MeterProvider 可以与 CounterTimerLongTaskTimerDistributionSummary 一起使用。

你可以做以下事情来代替上述操作:

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
java
  • 定义 TimerMeterProvider,包含所有必要的“静态”字段。请注意 withRegistry 方法的调用。

  • 定义动态标签。请注意,这里只定义了那些动态的标签,其他所有内容都在创建 MeterProvider 的地方定义。withTags 方法返回一个 Timer,该 Timer 使用 withTags 中定义的标签以及 MeterProvider 定义的所有其他内容创建。

这个例子和之前的例子产生相同的输出,唯一的区别在于代码中的样板文件量以及在堆中创建的构建器对象的数量。