You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenTelemetry .NET直方图:Grafana中如何正确展示时长Y轴与百分位线?

解决Histogram百分位指标显示异常的问题

核心原因

你的Histogram默认桶边界未覆盖实际耗时区间(20000ms),所有超过10000ms的请求都被归入le="10000"的桶中。histogram_quantile函数在所有样本都落在最大桶时,会直接返回该桶的边界值,导致99分位线固定在10000ms。

解决步骤

1. 自定义Histogram桶边界

在.NET代码中为Histogram设置包含20000ms及以上的桶边界,确保大耗时请求能被正确归类到对应桶中。

方式一:创建Histogram时指定边界

using var meter = new Meter("MyApp.Posts");
// 自定义桶边界,覆盖0到30000ms区间,可根据实际需求调整
var completionTimeHistogram = meter.CreateHistogram<double>(
    name: "my_metric",
    unit: "ms",
    description: "Posts completion time in milliseconds",
    boundaries: new double[] { 0, 100, 500, 1000, 5000, 10000, 20000, 30000 }
);

方式二:通过OpenTelemetry配置视图指定边界

如果使用依赖注入配置OpenTelemetry Metrics,可通过AddView为指标设置自定义桶:

builder.Services.AddOpenTelemetry()
    .WithMetrics(metrics => metrics
        .AddMeter("MyApp.Posts") // 替换为你的Meter名称
        .AddView(
            instrumentName: "my_metric",
            new ExplicitBucketHistogramConfiguration
            {
                Boundaries = new double[] { 0, 100, 500, 1000, 5000, 10000, 20000, 30000 }
            }
        )
    );

2. 验证指标生成

重启应用后,通过Prometheus查询my_metric_bucket,确认存在le="20000"、le="30000"等桶的计数数据。

3. 确认查询语句有效性

保持原查询语句不变(若需按维度拆分,可在sum by中添加对应标签,比如sum by(le, post_type)):

histogram_quantile(0.99, sum by(le) (rate(my_metric_bucket)[5m]))

此时99分位线应显示为20000ms左右,与实际耗时一致。

4. 调整Grafana可视化配置

在Grafana时间序列面板中:

  • 确认Y轴单位设置为milliseconds(或匹配你的指标单位)
  • 确保面板时间范围与查询的[5m]窗口匹配,避免数据聚合异常

内容的提问来源于stack exchange,提问作者Ed T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:12:41