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的累加特性。
根因解析
- /actuator/metrics端点的指标来源:
MetricEndpoint会遍历CompositeMeterRegistry中的所有子注册表,返回第一个匹配指标名称的结果。 - 注册表遍历顺序的不确定性:
CompositeMeterRegistry内部使用IdentityHashMap存储子注册表,遍历顺序不固定。 - 不同注册表的计数器类型差异:
InfluxMeterRegistry采用StepCounter:这类计数器会周期性重置,仅统计固定时间窗口内的增量SimpleMeterRegistry(Composite默认包含的基础注册表)采用CumulativeCounter:持续累加计数,不会主动重置
- 当遍历顺序中
InfluxMeterRegistry排在前面时,端点返回StepCounter的数值,表现为周期性重置;若先遍历到SimpleMeterRegistry,则返回CumulativeCounter的累加值,这就是顺序改变导致现象变化的核心原因。
解决方案
若希望/actuator/metrics端点始终返回累加型计数,可通过以下方式处理:
- 显式配置
CompositeMeterRegistry的子注册表顺序,确保SimpleMeterRegistry(或其他使用CumulativeCounter的注册表)排在InfluxMeterRegistry之前 - 自定义
MetricEndpoint的逻辑,指定优先获取累加型计数器的数值,避免依赖不确定的遍历顺序
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

