1

如果我查询一个指标,那么我会得到一个结果1

node_systemd_unit_state{name="web.service",state="active",type="simple"}

如果我查询相同的指标但使用不同的标签,那么我会得到一个结果0

node_systemd_unit_state{name="web.service",state="inactive",type="simple"}

但是如果我尝试将它们加在一起,那么我会得到no data

node_systemd_unit_state{name="web.service",state="active",type="simple"} + node_systemd_unit_state{name="web.service",state="inactive",type="simple"}

但是通过阅读https://prometheus.io/docs/prometheus/latest/querying/examples/#using-functions-operators-etc我希望我的表达能够起作用:

如果我们有两个具有相同维度标签的不同指标,我们可以对它们应用二元运算符,并且两侧具有相同标签集的元素将被匹配并传播到输出。例如,此表达式为每个实例返回 MiB 中未使​​用的内存(在一个虚构的集群调度程序上,公开有关它运行的实例的这些指标):

(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024

  • 如何将我的两个指标加在一起?
  • 我的查询有什么问题?
4

1 回答 1

0

关键是ignoring出于可能与线性代数有关的原因使用该函数,但这就是您要寻找的:

node_systemd_unit_state{name="web.service",state="active",type="simple"} * 4 + ignoring(state) node_systemd_unit_state{name="web.service",state="inactive",type="simple"} * 3

我在普罗米修斯文档中找到了一个关于:向量匹配的示例

一对一从操作的每一方找到一对唯一的条目。在默认情况下,这是一个遵循 vector1 vector2 格式的操作。如果两个条目具有完全相同的一组标签和相应的值,则它们匹配。ignoring 关键字允许在匹配时忽略某些标签,而 on 关键字允许将考虑的标签集减少到提供的列表:

<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>

示例输入:

method_code:http_errors:rate5m{method="get", code="500"}  24
method_code:http_errors:rate5m{method="get", code="404"}  30
method_code:http_errors:rate5m{method="put", code="501"}  3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21

method:http_requests:rate5m{method="get"}  600
method:http_requests:rate5m{method="del"}  34
method:http_requests:rate5m{method="post"} 120

示例查询:

method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
于 2019-11-03T04:34:29.853 回答