如何从异步值创建千分尺?

问题描述

我有一个带有 Micrometer 的响应式 Spring Webflux 应用程序。
我想创建一个“仪表”指标,如:

Gauge gauge = Gauge
  .builder("gaugeName",list,List::size)
  .register(registry);

或供应商版本,例如:

Gauge gauge = Gauge
  .builder("gaugeName",() -> getValue())
  .register(registry);

但是,我有一个值的异步源,即一个返回 Mono 的方法
如何从异步值创建千分尺?

解决方法

目前我只找到了以下解决方案:

  1. 使用返回 gauge() 子类型的 Number 方法在仪表注册表中注册仪表
AtomicLong gauge = meterRegistry.gauge("name",new AtomicLong(0));
  1. 现在可以使用 set() 方法手动更新它
gauge.set(value);
  1. 创建一个计划任务,该任务将运行反应链并根据固定时间间隔更新仪表:
@Scheduled
public void scheduleTask() {
    Mono.from(getValue()).subscribe(value -> gauge.set(value));
}

步骤 1-2 取自此处:https://micrometer.io/docs/concepts#_manually_incrementingdecrementing_a_gauge
第 3 步取自此处:https://spring.io/guides/gs/scheduling-tasks/

这种方法有明显的缺点:

  1. 指标会急切地更新,而不是按需更新
  2. metric 不显示实际值,总是滞后于时间

如果有人提出基于异步计算值创建千分尺的更好方法,我将不胜感激。

,

您可以考虑监听当前呼叫者,而不是为您的仪表安排更新。

例如,如果当前调用 getValue() 的代码返回 Mono,您可以在订阅前使用 doFinally 根据返回的值更新仪表。

这意味着如果没有发生呼叫,仪表将不会更新。