如何将两个普罗米修斯指标加在一起

时间:2019-11-03 04:19:27

标签: prometheus prometheus-node-exporter

如果我查询一个指标,则得到结果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

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

1 个答案:

答案 0 :(得分: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

我在普罗米修斯文档中找到了一个有关Vector matching

的示例
  

一对一地从操作的每一侧找到一对唯一的条目。在默认情况下,这是遵循格式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