[英]Prometheus query to count unique label values over a period
我想计算一段时间内不同标签的总数。
例如。 我有以下 4 个示例数据
指标标签时间戳值
cpu_usage{instance="192.168.100.10:20001",job="node2"}@1646225640 => 4
cpu_usage{instance="192.168.100.10:20001",job="node1"}@1646225700 => 5
cpu_usage{instance="192.168.100.10:20001",job="node3"}@1646225760 => 3
cpu_usage{instance="192.168.100.10:20001",job="node2"}@1646225820 => 4
因此,如果我检查 startdate=1646225640、enddate=1646225700,我会得到 2 个不同的作业,即 node2 和 node1
如果我检查开始日期=1646225640,结束日期=1646225820,我得到了 3 个不同的作业,它们是节点 1、节点 2 和节点 3。
promql 有没有办法做到这一点?
找到一种方法来实现这一目标
count by (job_temp) (count_over_time(cpu_usage[1h]))
要么
sum(count by (job) (count_over_time(cpu_usage[1h])))
PromQL 是基于时间序列的,所以我发现用图像来说明更有用:
假设我们要在 1646225640 和 1646225820 之间进行检查
prometheus 数据是基于 metrics{labels} 的一系列时间戳,因此 count_over_time 将返回包含 3 条记录的结果:
instance=192.168.100.10:20001,job=node1 values=[[1646225700, 1]] instance=192.168.100.10:20001,job=node2 values=[[1646225640, 1], [1646225820, 1]] instance=192.168. 100.10:20001,job=node3 值=[[1646225760, 1]]
对于上面的结果,如果我们按工作统计,就像按工作分组一样,所以我们也有 3 个结果
如果我们按指标中不存在的标签进行计数,那么 prometheus 将不会将标签作为 group by filter,那么我们将只有 1 个结果,因为它们根本没有被分组,这是第二种查询求和方法影响
以下 PromQL 查询应返回时间范围(td... t]
上指标cpu_usage
的唯一job
标签值:
count(last_over_time(cpu_usage[d] @ t)) by (job)
此查询使用以下 PromQL 功能:
job
值的时间序列数。d
上每个时间序列的最后一个值。t
执行查询的修饰符。 如果在记录规则或告警规则中执行,可以简化查询。 例如,以下查询计算最后一小时每个唯一job
标签值的唯一时间序列数:
count(last_over_time(cpu_usage[1h])) by (job)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.