如何在Grafana中用PromQL实现SELECT COUNT DISTINCT功能
PromQL实现COUNT DISTINCT及比例计算方案
核心逻辑
要实现类似SQL中SELECT COUNT(DISTINCT clientId)的去重计数,需先按clientId标签分组聚合,再统计分组后的序列总数。针对你的场景,分三步完成比例计算:
具体PromQL语句
1. 统计访问API的唯一clientId数量
count(count by (clientId) (api_interaction))
count by (clientId) (api_interaction):按clientId分组,保留所有存在该标签的时间序列(无论指标数值大小)- 外层
count:统计分组后的序列总数,即唯一clientId的数量
2. 统计使用外部服务的唯一clientId数量
count(count by (clientId) (outside_interaction))
逻辑与上述一致,仅替换指标名称。
3. 计算两者比例(转为百分比)
(count(count by (clientId) (api_interaction)) / count(count by (clientId) (outside_interaction))) * 100
代入你的示例数据,结果为3/3*100=100,完全符合预期。
为什么count_values不适用?
count_values("client_id", api_interaction)的作用是统计指标数值的分布,比如统计有多少序列的api_interaction值为20、30等,这和按clientId标签去重计数的需求完全无关,因此会出现陌生的“clientId”(实际是指标数值)且值为1的异常结果,属于函数误用。
扩展:统计时间段内的唯一clientId
如果需要统计过去N小时/分钟内有过交互的唯一clientId(避免指标重置导致的漏统计),可结合count_over_time:
# 统计过去1小时内访问API的唯一clientId数 count(count by (clientId) (count_over_time(api_interaction[1h])))
count_over_time(api_interaction[1h])会计算每个clientId在1小时内的调用次数,后续分组计数逻辑不变。
内容的提问来源于stack exchange,提问作者BugsAreEverywhere
相关产品推荐
相关产品推荐

