You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot-Micrometer复合注册器顺序影响/actuator/metrics页面行为

Micrometer指标端点计数异常问题分析

背景

  • 已创建三个Micrometer注册表Bean:
    0 = {InfluxMeterRegistry@7201} 
    1 = {AutoConfiguredCompositeMeterRegistry@7339} 
    2 = {PrometheusMeterRegistry@7330} 
    
  • 业务类注入了被@Primary修饰的AutoConfiguredCompositeMeterRegistry,通过以下代码实现计数器递增:
    Counter.builder("cmp.listener.dispatch.count")
          .tags(commonTags)
          .tag("success", "false")
          .description("Count off failed dispatch by event listener")
          .baseUnit("event")
          .tag("uri", uri)
          .register(meterRegistry).increment();
    

异常现象

指标已成功推送至Influx和Prometheus,但/actuator/metrics/cmp.listener.dispatch.count页面的计数会周期性重置,表现为StepCounter的特性;修改注册表Bean的加载顺序后,该页面的计数器又会恢复为CumulativeCounter的累加特性。

根因解析

  1. /actuator/metrics端点的指标来源:MetricEndpoint会遍历CompositeMeterRegistry中的所有子注册表,返回第一个匹配指标名称的结果。
  2. 注册表遍历顺序的不确定性:CompositeMeterRegistry内部使用IdentityHashMap存储子注册表,遍历顺序不固定。
  3. 不同注册表的计数器类型差异:
    • InfluxMeterRegistry采用StepCounter:这类计数器会周期性重置,仅统计固定时间窗口内的增量
    • SimpleMeterRegistry(Composite默认包含的基础注册表)采用CumulativeCounter:持续累加计数,不会主动重置
  4. 当遍历顺序中InfluxMeterRegistry排在前面时,端点返回StepCounter的数值,表现为周期性重置;若先遍历到SimpleMeterRegistry,则返回CumulativeCounter的累加值,这就是顺序改变导致现象变化的核心原因。

解决方案

若希望/actuator/metrics端点始终返回累加型计数,可通过以下方式处理:

  • 显式配置CompositeMeterRegistry的子注册表顺序,确保SimpleMeterRegistry(或其他使用CumulativeCounter的注册表)排在InfluxMeterRegistry之前
  • 自定义MetricEndpoint的逻辑,指定优先获取累加型计数器的数值,避免依赖不确定的遍历顺序

内容的提问来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:46:14