使用 Docker Grafana 8.1.5。使用时间序列图,我正在绘制一个
Prometheus
Counter
源(有一个 label
)作为 time series
(按标签),并且需要 将所有空/缺失值填充为零。
这是应用于
Prometheus
counter
源的查询,绘制标签 code
:
my_metric{code!=""}
图表显示有效(只需查看每个标签变体的当前计数器值,以及所选时间范围内的差异),但新的 Grafana
time series graph
缺少 Graph (old)
在 Display > Stacking and null value > null value: null as zero
下的选项,因此当出现空值时,它现在会以断线结束。
不幸的是,我无法使用
Graph (old)
图表,因为我需要图例值 difference
,该值仅在新的 time series
图中可用。
我尝试将
or on() vector(0)
添加到查询末尾,但条件不会应用于每个标签变体的数据系列,而是添加一个全部用零填充的新数据系列...
感谢您的任何建议!
我也遇到了这个问题,正如您提到的,我无法仅使用
or on() vector(0)
,因为主查询返回 NaN
。就我而言,我除以零。
我可以通过首先评估查询是否有值
>= 0
然后使用 or on() vector(0)
来解决这个问题。尝试类似的事情:
((my_metric{code!=""}) >= 0) OR on() vector(0)
以下技术可用于填充查询返回的单个时间序列中的空白
q
:
sum(q) or vector(0)
将
q
包装到sum()
中,是为了删除从q
返回的时间序列的所有标签,因此可以根据vector(0)
的匹配规则将时间序列与or
时间序列进行匹配运算符。没有 sum()
的查询:q or on() vector(0)
将在图表上返回两个时间序列,而不是单个时间序列:来自 q
的一个时间序列具有自己的一组标签,另一个时间序列具有零标签和零值,其中q
时间序列包含间隙。
不幸的是,如果
q
返回具有不同标签集的多个时间序列,Prometheus 无法轻松地用零填充空白。其他类似 Prometheus 的解决方案,例如 VictoriaMetrics(我正在研究它)为这种情况提供了 default
运算符。例如,以下 MetricsQL 查询将从 q
返回的所有时间序列用零填充空白:
q default 0
my_metric{code!=""} 或按 (your_label0,your_label1) (other_your_metric) 进行分组 < bool 0