PromQL 如何统计某个标签的唯一值数量?
统计标签唯一值数量的标准写法是嵌套 count:count(count(metric) by (label))——内层按标签分组,外层统计组数。本文给出实例、变体与常见错误写法。
标准写法:count(count(http_requests_total) by (instance))——内层 by (instance) 把序列按实例分组,外层 count 数出有多少个组,即 instance 的唯一值个数。
分解理解
count(http_requests_total) by (instance) # 每个 instance 一条结果(值是该实例的序列数)
外层再包一层 count(...)(不带 by),把"多少个分组"聚成一个数字:
count(count(http_requests_total) by (instance)) # 输出:42
常用变体
# 有多少种不同的状态码
count(count(http_requests_total) by (status))
# 每个 job 下有多少个实例
count by (job) (count by (job, instance) (up))
# 直接数 up 的实例数(更简单)
count(up == 1)
常见错误
- ❌
count(http_requests_total)——数的是序列总数,不是标签唯一值; - ❌ 忘记内层
by——外层无从得知按什么维度去重。
观测云对照
观测云 DQL 的聚合函数直接支持"去重计数"语义(类似 count_distinct),在指标查看器选标签维度即可看到唯一值数量,无需嵌套写法。
常见问题(FAQ)
Q:能列出这些唯一值而不只是数量吗? PromQL 不行;用 API /api/v1/label/<label>/values 或 Grafana 的 label_values()。
Q:标签值很多时这个查询慢吗? 两层聚合都走索引,千级取值秒出;百万级高基数场景才会明显变慢。