Prometheus查询计算唯一标签值的数量

61

我想要统计唯一标签值的数量。有点像

select count (distinct a) from hello_info
例如,如果我的指标“hello_info”具有标签a和b。我想要计算唯一a的数量。在这里,对于a =“1”,“2”,“3”,计数将为3。
hello_info(a="1", b="ddd")
hello_info(a="2", b="eee")
hello_info(a="1", b="fff")
hello_info(a="3", b="ggg")
4个回答

103
count(count by (a) (hello_info))

首先你需要一个按照每个a值返回结果的汇聚器,然后你才能计算它们。


1
对我来说好像不起作用,第一个计数返回一个指标矩阵(其中每个值也是一个向量),在其上运行计数会返回一个无意义的值,例如“1.3”...有什么想法吗? - tutuDajuju
1
我认为这个查询返回的是时间序列,而不是特定标签下所有记录值的数量。 - mac13k

14

另一个例子: 如果你想基于不同的标签值(例如:app)计算 Kubernetes 集群中部署的应用数量:

count(count(kube_pod_labels{app=~".*"}) by (app))

9

count(count(hello_info) by (a))等价于以下SQL:

SELECT
  time_bucket('5 minutes', timestamp) AS t,
  COUNT(DISTINCT a)
FROM hello_info
GROUP BY t 

请参阅time_bucket()函数说明。
例如,默认情况下,它返回每个5分钟间隔内a标签的不同值的数量-有关5分钟间隔的详细信息,请参见staleness docs
如果您需要计算自定义间隔(例如,在最近一天内)a标签的唯一值数量,则必须使用以下PromQL查询:
count(count(last_over_time(hello_info[1d])) by (a))

上述示例中的自定义间隔时间 - 1d 可以更改为任意值 - 请参阅这些文档获取可能用于该处的值。

此查询使用last_over_time()函数选择在过去一天内处于活动状态的所有时间序列。时间序列可以在任何时候停止接收新的样本并变得不活动。这种时间序列在5分钟的不活动后不能使用简单的count(...) by (a)来捕获。Kubernetes中的新部署和横向 Pod 自动缩放是大量无效时间序列(也称为高流失率)的最常见来源。


0

对我有效的方法如下:

count(count by (a)(delta(hello_info[10m]) > 0)) OR on() vector(0)

它计算不同的非零指标数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接