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

问题描述 投票:0回答:2

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

{name=~"camel_proxy.*count"}

它工作得很好,相同的标签集线用不同的名称绘制。

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

rate({name=~"camel_proxy.*count"}[5m])

所以,这里的方法是让标签集不相同,并将

__name__
移动到某个标签上,使每个标签集都是唯一的:

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

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

1:90: parse error: ranges only allowed for vector selectors"

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

prometheus grafana promql
2个回答
11
投票

这里的 PromQL 查询应该是:

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

请注意:您需要在

:
中添加冒号
5m:
,而不是
5m


1
投票

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

此解决方案避免触发

subquery processing
,因此
rate()
函数继续处理数据库中存储的原始样本。

© www.soinside.com 2019 - 2024. All rights reserved.