微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个带有 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 根据返回的值更新仪表。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。