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