System.Diagnostics.Metrics.Histogram 存储桶中的值错误

问题描述 投票:0回答:1

我正在学习遥测指标,以便将它们发送到

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
排序。 我知道它看起来像一个百分位,但这不是我所期望的。 是否可以配置一个视图来计算特定存储桶中的计量值?

c# histogram prometheus open-telemetry open-telemetry-collector
1个回答
0
投票
Prometheus 中的

直方图累积直方图,这意味着每个存储桶还包含之前存储桶的计数。

可以在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 提供这种直方图,所以这不应该是问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.