指标类型(Counter / Gauge / Histogram / Summary)
一个工程师在排查延迟问题时,发现两种不同的指标:Histogram 显示 P99 是 80ms,但用户反馈接口很慢。反复检查后发现:Histogram 的 Bucket 边界设置不当,真实的 P99 其实是 3 秒,但被错误地归入了 le="1" 这个 Bucket。
这个案例说明:理解指标类型的本质,才能正确配置和使用它们。Counter/Gauge/Histogram/Summary 不是功能名称,而是数学模型——选择错误的模型,数据就会说谎。
四种指标类型速览
Counter(计数器)
什么是 Counter
Counter 是一个只增不减的累计值。它的数学特性是:t2 时刻的值 >= t1 时刻的值(单调递增)。Counter 不记录「当前是多少」,而是记录「从开始到现在一共发生了多少次」。
使用场景
Counter 适合描述「发生次数」类指标:
错误用法
代码示例
Gauge(仪表)
什么是 Gauge
Gauge 是一个可增可减的瞬时值。它代表某个指标在测量时刻的状态,不具有累积性。
使用场景
Gauge 适合描述「当前状态」类指标:
Gauge 的陷阱
Gauge 的数值不代表增量,只代表当前值。如果你想知道「变化了多少」,需要自己计算差值:
代码示例
Histogram(直方图)
什么是 Histogram
Histogram 将测量的值分布到多个 Bucket(桶)中,每个桶记录落入该区间的样本数量。Histogram 是可聚合的——多个实例的 Histogram 可以合并计算。
Bucket 边界设计
Histogram 的核心在于 Bucket 边界设计。边界决定了你能精确计算哪些分位数:
Bucket 边界与分位数精度
Bucket 边界决定了你能否精确计算特定分位数:
结论:Bucket 边界应该覆盖你的目标分位数,并且边界之间的间隔要足够细。
计算分位数
代码示例
Summary(摘要)
什么是 Summary
Summary 在服务端直接计算分位数,输出预计算好的 quantile 值。相比 Histogram,Summary 不需要你配置 Bucket,精度更高。
Summary vs Histogram 的关键区别
Summary 的不可聚合问题
Summary 的致命弱点:服务端计算的分位数无法跨实例聚合。
生产环境强烈建议使用 Histogram。
代码示例
选型决策树
质量判断标准
读完本节后,你应该能够回答:
- Counter 为什么只能增不能减?如果一个指标「当前活跃的请求数」,用 Counter 会产生什么问题?
- Histogram 的 Bucket 边界设计为什么如此重要?如果 Bucket 边界是
[0.1, 1, 10],你能否精确计算 P99? - 为什么说 Summary 的 P99 是「不可聚合的」?这在多实例部署场景下意味着什么?
- 如果你有 10 个服务实例,每个实例的 P99 延迟都是 100ms,但用户反馈「有时很慢」,最可能的原因是什么?
- 在选择 Histogram 的 Bucket 边界时,应该考虑哪些因素?为什么说「边界要覆盖目标分位数」?