如何在Grafana中正确展示Prometheus直方图?
针对Prometheus直方图的Grafana可视化方案
1. 原始样本趋势展示:澄清误区与替代方案
Prometheus直方图不会存储原始样本值,它仅记录三类聚合数据:
my_metric_bucket{le="<上限>"}:累积样本数(耗时≤该上限的所有样本总数)my_metric_count:总样本数my_metric_sum:所有样本的耗时之和
你之前的查询:
sum(rate(my_metric_sum[$__rate_interval]))/sum(rate(my_metric_count[$__rate_interval]))
本质是计算操作的平均耗时,而非原始样本的趋势。如果你的需求是追踪耗时的整体变化趋势,这个查询逻辑是正确的,但数值不符合预期可能是因为:
- 未正确聚合标签:若指标带有实例、接口等多维度标签,需确保
sum按业务所需维度聚合,避免跨维度平均失真 - 时间区间适配:
$__rate_interval是Grafana动态区间变量,若指标上报频率极高,可尝试缩小固定区间(如1m)验证结果
如果确实需要查看单个样本的耗时,你需要将指标类型改为Gauge(每次上报单个样本的耗时)或Summary(可配置分位数,但同样不存储原始值)。
2. 时间X轴 + 桶区间Y轴:Heatmap面板正确配置
你的查询sum(rate(my_metric_bucket[$__rate_interval])) by (le)得到的是累积样本数(即≤该桶上限的所有样本数),这会导致Heatmap数值是累加的,不符合“每个桶单独样本数”的预期。正确做法是计算每个桶的非累积样本数:
方法1:手动计算桶增量
针对你的桶区间(10ms=0.01s、50ms=0.05s、100ms=0.1s、500ms=0.5s、1s=1、2s=2),分别编写查询:
- 10ms桶:
sum(rate(my_metric_bucket{le="0.01"}[$__rate_interval])) by (le) - 50ms桶:
sum(rate(my_metric_bucket{le="0.05"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.01"}[$__rate_interval])) - 100ms桶:
sum(rate(my_metric_bucket{le="0.1"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.05"}[$__rate_interval])) - 以此类推,直到2s桶
将所有查询添加到Heatmap面板后,在设置中:
- 选择“Data format”为“Time series buckets”
- Y轴单位设为“seconds”,手动匹配桶区间值
方法2:利用Grafana转换简化操作
- 先执行累积查询:
sum(rate(my_metric_bucket[$__rate_interval])) by (le) - 进入面板“Transform”选项卡,添加“Reduce”转换,选择“Calculation: Difference”,并按
le标签排序 - 该转换会自动计算相邻桶的差值,得到每个桶的单独样本数
3. 桶区间X轴 + 样本数量Y轴:Bar面板实现
使用Grafana的Bar面板,查询逻辑同样是计算每个桶的非累积样本数:
- 编写组合查询(匹配你的桶区间):
sum(rate(my_metric_bucket{le="0.01"}[$__rate_interval])) by (le) or sum(rate(my_metric_bucket{le="0.05"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.01"}[$__rate_interval])) or sum(rate(my_metric_bucket{le="0.1"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.05"}[$__rate_interval])) or sum(rate(my_metric_bucket{le="0.5"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.1"}[$__rate_interval])) or sum(rate(my_metric_bucket{le="1"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="0.5"}[$__rate_interval])) or sum(rate(my_metric_bucket{le="2"}[$__rate_interval])) - sum(rate(my_metric_bucket{le="1"}[$__rate_interval]))
- 在Bar面板设置中:
- X轴设为“Series”,按
le标签分组 - 通过“Override”功能将
le标签值替换为易读的桶名称(如le="0.01"改为“10ms”) - Y轴设为“Count”,单位选择“samples per second”
内容的提问来源于stack exchange,提问作者sOltan
相关产品推荐
相关产品推荐

