我有一个直方图指标来测量完成一篇文章所需的时间。我正在使用 OpenTelemetry 的 .NET 库和 .NET 的内置直方图类。通过这个,我得到了一个带有
bucket
前缀的指标,该指标上有 le
属性,其中包含每个存储桶的计数。根据我读到的内容,我应该能够在 Grafana 中使用 Prometheus 查询,如下所示,通过时间序列可视化来查看 Y 轴上的持续时间、X 轴上的时间以及显示所选分位数的线:
histogram_quantile(0.99, sum by(le) (rate(my_metric_bucket)[5m]))
当我这样做时,Y 轴似乎与我的预期不匹配,如下所示,当我有一个特定实体,我知道该实体需要大约 20 秒才能响应,但 0.99 分位数图被固定在10,000ms(如果 Y 轴确实是预期的 ms)。
我的代码还有一个测量所用时间的仪表(我的计时器抽象创建了一个仪表和一个直方图并记录两者),因此我可以确认这实际上花费了大约 20 秒,如以下查询所示:
avg(my_metric)
有没有办法让 Y 轴成为持续时间,并用线条来显示请求的百分位数随着时间的推移需要多长时间?
根据 @markalex 的评论,这里的问题是我的直方图存储桶达到了 10000 的最高值,因此当该值高于该值时,分位数无法显示这一点。我已经调整了存储桶以更准确地覆盖该值的预期范围,现在一切看起来都更好了。
一些了解
histogram_quantile
函数如何运作的好资源(也由 @markalex 提供)是:
普罗米修斯关于分位数估计错误的文档(我看到了一个极端的例子)
@Ace的这个答案非常详细地介绍了
histogram_quantile
函数的具体运作方式。