问题描述
我有一个带有 Micrometer 的响应式 Spring Webflux 应用程序。
我想创建一个“仪表”指标,如:
Gauge gauge = Gauge
.builder("gaugeName",list,List::size)
.register(registry);
或供应商版本,例如:
Gauge gauge = Gauge
.builder("gaugeName",() -> getValue())
.register(registry);
但是,我有一个值的异步源,即一个返回 Mono 的方法。
如何从异步值创建千分尺?
解决方法
目前我只找到了以下解决方案:
- 使用返回
gauge()
子类型的Number
方法在仪表注册表中注册仪表
AtomicLong gauge = meterRegistry.gauge("name",new AtomicLong(0));
- 现在可以使用
set()
方法手动更新它
gauge.set(value);
- 创建一个计划任务,该任务将运行反应链并根据固定时间间隔更新仪表:
@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/
这种方法有明显的缺点:
- 指标会急切地更新,而不是按需更新
- metric 不显示实际值,总是滞后于时间
如果有人提出基于异步计算值创建千分尺的更好方法,我将不胜感激。
,您可以考虑监听当前呼叫者,而不是为您的仪表安排更新。
例如,如果当前调用 getValue()
的代码返回 Mono
,您可以在订阅前使用 doFinally
根据返回的值更新仪表。
这意味着如果没有发生呼叫,仪表将不会更新。