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

标签 java spring-webflux project-reactor micrometer

我有一个带有 Micrometer 的响应式(Reactive) Spring Webflux 应用程序。
我想创建一个“计量”指标,例如:

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

或供应商版本,例如:

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

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

最佳答案

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

  1. 使用返回 Number 子类型的 gauge() 方法在仪表注册表中注册仪表
AtomicLong gauge = meterRegistry.gauge("name", new AtomicLong(0));
  • 现在可以使用 set() 方法手动更新它
  • gauge.set(value);
    
  • 创建一个计划任务,该任务将运行 react 链并根据固定时间间隔更新仪表:
  • @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. 指标不显示实际值,并且总是滞后于时间

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

    关于java - 如何从异步值创建千分尺?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68532426/

    相关文章:

    java - Spring boot Web服务/微服务和调度

    java - 使用 Java AWT Robot 类的问题

    spring - 如何全局处理 Spring WebFlux 中 WebFilter 抛出的错误?

    java - 使用 reactor netty 为 spring-webflux WebClient 配置 HostnameVerifier

    java - 使用 HTML 表单文本输入框在 SQL 数据库中添加/编辑数据

    java - 通过 JDBC 将 MATLAB 连接到 Apache Derby 数据库

    java - 出错时再次调用并在 webflux 中重试

    Spring 5 Web Reactive - 我们如何使用 WebClient 在 Flux 中检索流数据?

    spring - 在 Flux react 器中过滤重复对象

    java - 在 Flux/Mono 中应该使用什么来加入一对项目