从多个指标(相同标签集,不同名称)绘制rate()时如何避免“向量不能包含具有相同标签集的指标”错误

Ily*_*iev 7 grafana prometheus promql

在 Prometheus 中,有时我们需要同时绘制多个指标(例如,具有名称、拟合相同的正则表达式),就像 PromQL 查询一样:

{name=~"camel_proxy.*count"}
Run Code Online (Sandbox Code Playgroud)

它工作正常,相同的标签集线用不同的名称绘制。

当我们想要绘制它们的rate()时,我们面临标题中的错误:

rate({name=~"camel_proxy.*count"}[5m])
Run Code Online (Sandbox Code Playgroud)

因此,这里的方法是使标签集不相同,并将 移动__name__到某个标签,使每个标签集都是唯一的:

rate(label_replace({name=~"camel_proxy.*count"},"name_label","$1","name", "(.+)")[5m])
Run Code Online (Sandbox Code Playgroud)

但我们仍然收到这样的错误

1:90: parse error: ranges only allowed for vector selectors"
Run Code Online (Sandbox Code Playgroud)

如何避免它并正确绘制比率?

Ily*_*iev 10

这里的 PromQL 查询应该是:

rate(label_replace({name=~"camel_proxy.*count"},"name_label","$1","name", "(.+)")[5m:])
Run Code Online (Sandbox Code Playgroud)

请注意:您需要添加冒号:, 而5m:不是5m


val*_*ala 0

内部label_replace()触发rate()查询处理,这可能会返回意外结果,因为它rate()开始使用从数据库返回的计算样本label_replace()而不是存储在数据库中的原始样本。

VictoriaMetrics 的MetricsQL(这是我从事的类似 Prometheus 的监控解决方案)为vector cannot contain metrics with the same labelset错误keep_metric_names修饰符提供了更优雅的解决方案。只需将此修饰符放在函数后面即可删除指标名称,以指示它保留指标名称:

rate({name=~"camel_proxy.*count"}[5m]) keep_metric_names
Run Code Online (Sandbox Code Playgroud)

此解决方案避免了触发subquery processing,因此该rate()函数继续处理存储在数据库中的原始样本。