从多个指标(相同的标签集,不同的名称)绘制 rate() 时如何避免 "vector cannot contain metrics with the same labelset" 错误

How to avoid "vector cannot contain metrics with the same labelset" error when plotting rate() from several metrics (same labelset, different names)

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

{name=~"camel_proxy.*count"}

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

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

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

所以,这里的方法是让标签集不一样,把__name__移动到某个标签上,让每个标签集都是唯一的:

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

但我们仍然收到类似

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

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

这里的 PromQL 查询应该是

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

请注意 5m**:** 而不是 5m

rate() 中的 label_replace() 触发 subquery processing,这可能会 return 意想不到的结果,因为 rate() 开始使用 计算 个样本 return 来自 label_replace() 而不是存储在数据库中的原始样本。

VictoriaMetrics 的

MetricsQLvector cannot contain metrics with the same labelset 错误 - keep_metric_names 修饰符提供了更优雅的解决方案。只需将此修饰符放在去除指标名称的函数之后,以指示它保留指标名称:

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

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