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

如何使用Grafana LogQL不分组统计唯一UserID数量

需求与场景

需要从指定格式的日志中统计唯一UserID的总数量,并在Grafana仪表板上展示。示例日志对应的结果应为2(仅统计不同用户的总数,不需要按单个UserID拆分展示次数,比如65166(3)、24413(3)这类形式)。另外受限于10K系列数限制,无法使用SUM BY (userId)语句。

日志示例

ts=2022-09-16T10:52:54.21344541Z level=INFO UserID=65166 elapsed=2.364015ms
ts=2022-09-16T10:52:51.580617785Z level=INFO UserID=24413 elapsed=2.324235ms
ts=2022-09-16T10:52:48.947248244Z level=INFO UserID=65166 elapsed=2.818146ms
ts=2022-09-16T10:52:41.51854716Z level=INFO UserID=24413 elapsed=2.633352ms
ts=2022-09-16T10:51:14.584272582Z level=INFO UserID=24413 elapsed=2.04884ms
ts=2022-09-16T10:51:14.45564065Z level=INFO UserID=65166 elapsed=4.889566ms

解决方案

根据使用的数据源类型,提供以下两种可行的查询方式:

1. 基于Loki的查询(Grafana默认日志数据源)

使用LogQL的聚合能力避免生成大量时间序列,直接统计唯一用户数:

count(count_over_time({job="你的日志任务名"} |= "UserID=" | regexp `UserID=(\d+)` | line_format "{{.1}}" [1m])) by ()
  • 各部分说明:
    • {job="你的日志任务名"}:替换为实际的日志标签过滤条件(比如日志来源标识)
    • |= "UserID=":快速过滤出包含UserID字段的日志行
    • | regexp UserID=(\d+)`:提取日志中的UserID数值
    • | line_format "{{.1}}":只保留提取出的UserID内容
    • count_over_time([1m]):按指定时间窗口(示例为1分钟)将相同UserID聚合为一条记录
    • count(...) by ():对聚合后的唯一UserID条目计数,by ()确保结果是单一数值,不按任何维度拆分

2. 基于Prometheus指标的查询(日志已解析为指标)

如果日志已经通过Promtail或其他工具解析为带userid标签的Prometheus指标(比如request_total{userid="xxx"}),可使用以下PromQL:

count(count_values("userid", request_total))
  • 说明:
    • count_values("userid", request_total):统计每个userid对应的指标条目数
    • count(...):对去重后的userid条目计数,得到唯一用户总数

内容的提问来源于stack exchange,提问作者chiaDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:10:07