如何解决如何从异步值创建千分尺?
我有一个带有 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
根据返回的值更新仪表。
这意味着如果没有发生呼叫,仪表将不会更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。