繁体   English   中英

Prometheus 查询计算一段时间内的唯一标签值

[英]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 功能:

  • count()聚合函数,用于计算每个唯一job值的时间序列数。
  • last_over_time()汇总函数,它返回方括号中给定后视窗口d上每个时间序列的最后一个值。
  • @ 用于在给定时间戳t执行查询的修饰符

如果在记录规则告警规则中执行,可以简化查询。 例如,以下查询计算最后一小时每个唯一job标签值的唯一时间序列数:

count(last_over_time(cpu_usage[1h])) by (job)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM