很多朋友在学习 Prometheus 的过程中对于 Summary 类型经常会有这样的疑惑?
Prometheus 中 Summary 类型的一个度量下通常有多个 quantile 标签值不同的指标,但同时也有以
_sum
和_count
结尾的度量指标,这个标签不同可以理解是采集不同的对应数据,但这两个_sum
和_count
结尾的指标分别做什么的?
大家都知道,在 Prometheus 中一共有四种类型的指标,分别为:Counter,Gauge,Histogram 和 Summary,其中 Histogram 和 Summary 会用到直方图统计相关的知识,具体参考维基百科 Histogram 。
今天我们就来一起好好学习 Prometheus 中的 Summary 类型。
数据存储
对于一个 Summary 类型的 metric, 通常除了有多个带 quantile
的同名 metric 外还会多出两个以 _sum
和 _count
结尾的 metric,例如一个叫做 go_gc_duration_seconds
的 Summary 类型 metric 对应的存储数据为:
go_gc_duration_seconds{quantile="0"} 3.2851e-05
go_gc_duration_seconds{quantile="0.25"} 6.8908e-05
go_gc_duration_seconds{quantile="0.5"} 9.2441e-05
go_gc_duration_seconds{quantile="0.75"} 0.00011411
go_gc_duration_seconds{quantile="1"} 0.000322082
go_gc_duration_seconds_sum 0.004255185
go_gc_duration_seconds_count 41
PS: 数据来源 Prometheus Server GC 时长统计。
这些不同的 metric 其实并不是独立存在的,它们共同表示了 go_gc_duration_seconds
的耗时分布情况。
数据解读
对于一个 Summary 类型的数据,我们该如何解读呢?例如上面例子中的 GC 时长。
首先将所有从小到大 GC 耗时排序,可以得出如下的统计信息:
1. 0 ~ 25% 的 GC 操作耗时在 3.2851e-05 ~ 6.8908e-05 之间
2. 25 ~ 50% 的 GC 操作耗时在 6.8908e-05 ~ 9.2441e-05 之间
3. 50 ~ 75% 的 GC 耗时在 9.2441e-05 ~ 0.00011411 之间
4. 75 ~ 100% 的 GC 耗时在 0.00011411 ~ 0.000322082 之间
5. GC 总耗时为 go_gc_duration_seconds_sum = 0.004255185
6. GC 总次数为 go_gc_duration_seconds_count = 41
注意: go_gc_duration_seconds_count
和 go_gc_duration_seconds_count
在这里相当于 Counter 类型。
数据应用
假如我们有上面的数据,如果我们想:
求最近 5 分钟平均 GC 耗时,可以为:
rate(go_gc_duration_seconds_count[5m]) / rate(go_gc_duration_seconds_count[5m])
求 GC 耗时的 95 值(95% GC 耗时小于某个值),可以为:
go_gc_duration_seconds{quantile="0.95"}
但是这样求 95 值真的好吗?因为 Summary 类型的统计逻辑是在客户端完成的,所以如果想要计算某个特定的 quantile
(非提前计算),那么需要做一定的近似计算来拟合。
通常在这方面有高要求的情况,更推荐使用 Histogram 类型,故这个例子可以改写为:
histogram_quantile(0.95, rate(go_gc_duration_seconds_bucket[5m]))
PS: 更多精彩提问和回复,请关注我们的知识星球:





