我正在学习遥测指标,以便将它们发送到
Prometheus
。
我编写了一个 C# 控制台应用程序 (.NET 7)。
我想计量 ping 时间并将值保存到具有自定义边界的直方图中。 这是直方图配置代码:
using System.Diagnostics.Metrics;
var meter = new Meter("MeterUsing");
var pingHistogram = meter.CreateHistogram<int>("ping", "ms", "The ping time");
var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter(meter.Name)
.AddView(pingHistogram.Name,
new ExplicitBucketHistogramConfiguration { Boundaries = new double[] { 100, 200, 500, 1000 } })
.Build();
然后我记录值:
pingHistogram.Record(rand.Next(30, 2000));
我把它推到
OpenTelemetry Collector
。然后 Prometheus
抓取数据。
当我打开收集器指标端点时,我看到以下内容:
# HELP ping The ping time
# TYPE ping histogram
ping_bucket{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing",le="100"} 2
ping_bucket{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing",le="200"} 5
ping_bucket{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing",le="500"} 13
ping_bucket{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing",le="1000"} 23
ping_bucket{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing",le="+Inf"} 64
ping_sum{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing"} 69801
ping_count{instance="280616b2-1c17-426a-9cf0-f33183ef7dfc",job="MeterUsing"} 64
我觉得很奇怪。我期望在桶中看到适合桶范围的值的计数。 但我看到
ping_count
值等于 ping_bucket{le="+Inf"}
。桶中的计数按 le
排序。
我知道它看起来像一个百分位,但这不是我所期望的。
是否可以配置一个视图来计算特定存储桶中的计量值?
直方图是累积直方图,这意味着每个存储桶还包含之前存储桶的计数。
可以在here找到存储桶累积的原因。简而言之:这允许在摄取时丢弃一些存储桶,但仍然保持直方图功能。
并且
_count
度量预计等于 {le="+Inf"}
通过设计:
已观察到的事件的计数,显示为
(与上面的<basename>_count
相同)<basename>_bucket{le="+Inf"}
据我所知,没有办法一次性将 Prometheus 的直方图指标转换为类似于非累积直方图的东西:要么像
ping_bucket{le="200"} - ignoring(le) group_left() ping_bucket{le="100"}
那样手动为每个存储桶编写查询,要么在 Prometheus 之外计算它。
另一方面,像 Grafana 这样的可视化工具期望 Prometheus 提供这种直方图,所以这不应该是问题所在。