
micrometer 的 counter 是单调递增的,无法递减;若需支持增减双向操作,应改用 gauge 或其他可变指标类型。
micrometer 的 counter 是单调递增的,无法递减;若需支持增减双向操作,应改用 gauge 或其他可变指标类型。
在 Micrometer 中,Counter 的设计初衷是记录不可逆的累计事件数量(如请求总数、错误发生次数),因此其底层实现严格遵循“只增不减”原则。调用 counter.increment(-1) 不会报错,但也不会产生实际效果——该操作被静默忽略,计数值保持不变。这是由 Micrometer 的语义契约决定的,而非 Bug。
✅ 正确做法:根据业务语义选择合适的指标类型:
-
✅ 使用
Counter:仅适用于纯粹累加场景Counter counter = meterRegistry.counter("http.requests.total"); counter.increment(); // 合法:+1 counter.increment(5); // 合法:+5 // counter.increment(-1); // 无效:无副作用,值不变 -
✅ 使用
Gauge:适用于可动态增减、实时反映状态的数值(如活跃连接数、缓存命中率、当前队列长度)AtomicInteger gaugeValue = new AtomicInteger(0); Gauge.builder("active.connections", gaugeValue, AtomicInteger::get) .register(meterRegistry); // 增减均有效 gaugeValue.incrementAndGet(); // +1 gaugeValue.decrementAndGet(); // -1 gaugeValue.addAndGet(-3); // -3
⚠️ 注意事项:
-
Gauge本身不提供线程安全保证,推荐配合AtomicInteger、AtomicLong等原子类使用; - 避免在 Gauge 的 value supplier 中执行耗时或阻塞逻辑,否则会影响指标采集性能;
- 若需统计变化量(如“每秒增减次数”),可结合
FunctionCounter或TimeGauge,但核心值仍需由可变容器承载; - 不要试图通过
Counter模拟减法(例如用两个 Counter 分别记录增/减),这会破坏指标语义,增加监控理解成本。
总结:Micrometer 的类型设计强调语义清晰性。选择 Counter 还是 Gauge,本质是回答“这个数字代表什么?”——如果是总量(total)、累计值(cumulative),选 Counter;如果是瞬时状态(current state)、可上下波动的量(如内存使用、线程数),请果断选用 Gauge。










