如何用LogQL获取Squid日志24小时末的Top10请求域名?
解决Loki + Grafana展示Squid日志24小时TOP10域名的问题
问题根源
你当前的查询返回所有曾进入TOP10的域名,是因为范围查询模式下,count_over_time会按时间步长返回每个窗口的统计结果,topk会保留每个时间点的TOP条目,最终累积出所有曾上榜的域名。而你需要的是整个24小时窗口的总请求数TOP10,对应Grafana的即时查询模式或正确的聚合写法。
解决方案
方案1:使用即时查询(推荐)
- 修改LogQL查询:
如果你的connection标签已经正确提取到每个日志条目,且需要聚合不同实例的同一域名请求数,用以下查询:
如果每个topk(10, sum by(connection) (count_over_time({container_name="squid"}[1d])))connection已经是独立的时间序列(无其他干扰标签),可以简化为:topk(10, count_over_time({container_name="squid"}[1d])) - 切换Grafana查询模式:
在面板编辑界面的查询选项中,将Query type从Range改为Instant。这样Loki会返回整个24小时窗口的聚合结果,而非逐时间点的序列,最终柱状图只会显示10个TOP域名。
方案2:范围查询下的聚合写法(兼容时间序列面板)
如果需要保留范围查询模式(比如后续要查看趋势),可以用aggregate_over_time将所有时间步长的统计结果聚合为总请求数:
topk(10, sum by(connection) (aggregate_over_time(count_over_time({container_name="squid"}[1m])[1d:1m], sum)))
count_over_time({...}[1m]):统计每分钟内每个域名的请求数[1d:1m]:覆盖过去24小时,步长1分钟aggregate_over_time(..., sum):将所有分钟的请求数求和,得到24小时总请求数topk(10, ...):取总请求数最高的10个域名
验证方法
执行查询后,在Grafana的查询结果预览中,确认返回的是10条静态数据(即时查询)或单时间点的10条数据(范围查询聚合后),而非随时间变化的多条序列。
内容的提问来源于stack exchange,提问作者Mdstn
相关产品推荐
相关产品推荐

