Prometheus 来源的时间序列:如何将空值设置为零?

pet*_*e19 9 counter grafana prometheus

使用 Docker Grafana 8.1.5。使用时间序列图,我将一个Prometheus Counter源(有一个label)绘制为time series(按标签),并且需要将所有 null/缺失值填充为零

这是应用于源的查询Prometheus counter,绘制标签code

my_metric{code!=""}
Run Code Online (Sandbox Code Playgroud)

图形显示有效(只需查看每个标签变体的当前计数器值,以及所选时间范围内的差异),但新的 Grafanatime series graph缺少Graph (old)下的选项Display > Stacking and null value > null value: null as zero,因此现在在出现空值。

不幸的是,我无法使用Graph (old)图表,因为我需要图例值difference,该图例值仅在新图表中可用time series

我尝试添加or on() vector(0)到查询的末尾,但条件不会应用于每个标签变体的数据系列,而是添加一个全部填充零的新数据系列...

感谢您的任何建议!

Fel*_*ipe 20

我也遇到了这个问题,我无法仅or on() vector(0)按照您提到的方式使用,因为主查询正在返回NaN。就我而言,我除以零。

我可以通过首先评估查询是否有值>= 0然后使用or on() vector(0). 尝试类似的事情:

((my_metric{code!=""}) >= 0) OR on() vector(0)
Run Code Online (Sandbox Code Playgroud)

  • 这在我的情况下无法将所有空值/缺失值填充为零,它还只是添加另一个由零组成的单独行 (4认同)

val*_*ala 12

以下技术可用于填充查询返回的单个时间序列中的空白q

sum(q) or vector(0)
Run Code Online (Sandbox Code Playgroud)

q包装成 是sum()为了删除返回的时间序列的所有标签q,因此时间序列可以vector(0)根据运算符的匹配规则or与时间序列进行匹配。sum()不带:的查询q or on() vector(0)将在图表上返回两个时间序列,而不是单个时间序列:一个时间序列具有q自己的一组标签,另一个时间序列具有零标签和零值,其中q时间序列包含间隙。

q不幸的是,如果返回具有不同标签集的多个时间序列,Prometheus 无法提供用零填充空白的简单功能。其他类似 Prometheus 的解决方案,例如 VictoriaMetrics(我正在研究它)default为这种情况提供了操作符。例如,以下MetricsQL查询将从 中返回的所有时间序列用零填充空白q

q default 0
Run Code Online (Sandbox Code Playgroud)

  • 我认为所有内容都应该嵌套在`sum()`中,如下所示:`sum(q or vector(0))`。至少这对我有用 (2认同)