在 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"
如何避免它并正确绘制比率?
这里的 PromQL 查询应该是:
rate(label_replace({name=~"camel_proxy.*count"},"name_label","$1","name", "(.+)")[5m:])
请注意:您需要在
:
中添加冒号5m:
,而不是5m
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()
函数继续处理数据库中存储的原始样本。