普罗米修斯:我如何用两个不同的指标求和

Dus*_*Dus 15 prometheus

我有 2 个不同的指标: metric_a 具有字段类型 metric_b 具有字段类型(相同)

我试图总结同一类型的 a 和 b。如果类型仅存在于 metric_a 而不是 metric_b - 它应该返回 metric_b 的结果。我在普罗米修斯上尝试了很多选项:

sum by (type)(metric_a{job=~"provision-dev"}) or vector(0) + sum by(type)(metric_b{job=~"provision-dev"}) or vector(0):仅返回metric_a的值,不计算metric_b的结果。

sum by (type)(metric_a{job=~"provision-dev"}) + sum by(type)(metric_b{job=~"provision-dev"}):仅返回 metric_b 的值,不计算 metric_a 的结果。

sum by (cluster_id)(provision_scale_out_failures{job=~"provision-dev"} + provision_scale_out_success{job=~"provision-dev"}):这甚至不是一个正确的查询

基本上这是一个成功的例子:

指标_a:

  • 类型 = 类型_1,总和 = 5
  • 类型 = type_2,总和 = 2

指标_b:

  • 类型 = 类型_1,总和 = 4
  • 类型 = type_3,总和 = 3

查询结果:

  • 类型 = 类型_1,总和 = 9
  • 类型 = type_2,总和 = 2
  • 类型 = type_3,总和 = 3

Mic*_*bez 15

这是使用二元运算符时的预期行为:双方都必须具有要考虑的匹配标签集。

如果您希望能够聚合两侧并获得单个,您首先必须 使用标签获得不同指标的并集__name__

 sum by(__name__,type)(metric_a{job=~"provision-dev"}) or on(__name__) sum by(__name__,type)(metric_b{job=~"provision-dev"})
Run Code Online (Sandbox Code Playgroud)

您可以级联聚合运算符:

sum by (type) (sum by (__name__,type)(metric_a{job=~"provision-dev"}) or on(__name__) sum by(__name__,type)(metric_b{job=~"provision-dev"}))
Run Code Online (Sandbox Code Playgroud)

最后,您还可以将所有内容压缩为:

sum by (type) ({__name__=~"metric_a|metric_b",job=~"provision-dev"})
Run Code Online (Sandbox Code Playgroud)


val*_*ala 8

以下 PromQL 查询应 summetric_ametric_bby type

(sum(metric_a) by (type) + sum(metric_b) by (type))
or
(sum(metric_a) by (type) unless sum(metric_b) by (type))
or
(sum(metric_b) by (type) unless sum(metric_a) by (type))
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

  • 根据匹配规则将两侧标签值sum(metric_a) by (type) + sum(metric_b) by (type)匹配的时间序列相加type+
  • 返回sum(metric_a) by (type) unless sum(metric_b) by (type)中缺少标签值sum(metric_a) by (type)的结果。请参阅有关运算符的文档typesum(metric_b) by (type)unless
  • 返回sum(metric_b) by (type) unless sum(metric_a) by (type)中缺少标签值sum(metric_a) by (type)的结果。typesum(metric_a) by (type)

然后将这三个查询的结果与or运算符连接起来。

该查询相当于 Michael 提出的查询:sum({__name__=~"metric_a|metric_b"}) by (type)

PS 使用MetricsQL时可以进一步简化此查询:

sum(metric_a, metric_b) by (type)
Run Code Online (Sandbox Code Playgroud)

此查询有效,因为MetricsQL 中的sum()函数接受任意数量的参数并对其求和。