You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:27:34