普罗米修斯返回“仅允许向量选择器的范围”

yas*_*eco 7 prometheus

这是我的查询,它应该显示表单的每个计数器的增量taskcnt.*

delta(label_replace({__name__=~"taskcnt.*"}, "old_name", "$1", "__name__", "(.+)")[1w])
Run Code Online (Sandbox Code Playgroud)

我越来越:

执行查询时出错:1:83:解析错误:范围只允许向量选择器

基本上,没有label_replace我会得到:

向量不能包含具有相同标签集的度量

我怎样才能使这个查询工作?

小智 7

子查询正是您所需要的(感谢上面的评论者 M. Doubez)。这应该对您有用 - 它通过每天计算子查询来计算每周增量(请参阅[1w:1d]

delta(label_replace({__name__=~"desired_metric_prefix_.+_suffix"}, "metric_name", "$1", "__name__", "desired_metric_prefix_(.+)_suffix")[1w:1d])
Run Code Online (Sandbox Code Playgroud)

确保与您的正则表达式匹配的所有指标都与label_replace和 函数兼容delta。如果您在 Grafana 中显示此内容,请使用Legend表达式来显示每个系列的{{ metric_name }}提取内容。metric_name


val*_*ala 6

可能{__name__=~"taskcnt.*"}会返回具有相同标签集但具有不同度量名称的多个时间序列。例如,它可能返回以下时间序列:

taskcnt_foo{job="x",instance="y"}
taskcnt_bar{job="x",instance="y"}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这些时间序列具有相同的标签集 - {job="x",instance="y"},但它们具有不同的指标名称:taskcnt_foo​​vs taskcnt_bar

delta ()函数从结果中删除指标名称,因此当将系列选择器传递给它时,它会从原始时间序列中删除taskcnt_foo并命名并返回具有相同标签集的两个时间序列。这会导致错误,因为返回的时间序列无法彼此区分。taskcnt_bar{job="x",instance="y"}{__name__=~"taskcnt.*"} vector cannot contain metrics with the same labelset

不幸的是,Prometheus 不允许使用类似label_replace()函数内的任何其他函数delta(),这些函数接受例如range vector以方括号结尾的系列选择器(例如,{__name__=~"taskcnt.*"}[1w])。

有一个使用子查询的半工作解决方案,在这个答案中推荐。不幸的是,这个解决方案有以下缺点:

  • Prometheus 子查询在执行期间可能会占用大量额外的 CPU、内存和磁盘 IO,特别是如果该值与方括号中的interval后向查找相比太小: 。window[window:interval]
  • interval当方括号太大时,Prometheus 子查询在计算过程中可能会丢失原始数据。
  • 如果普罗米修斯子查询的行为没有被清楚地理解,那么它们很容易被误用。

这些问题由VictoriaMetricsMetricsQL中通过修饰符解决keep_metric_names,该修饰符可以应用于任何函数。例如,以下 MetricsQL 查询不会从结果中删除指标名称,因此它既不返回也不返回vector cannot contain metrics with the same labelset错误ranges only allowed for vector selectors

increase({__name__=~"taskcnt.*"}[1w]) keep_metric_names
Run Code Online (Sandbox Code Playgroud)