Grafana对接Timestream如何可视化cmcd_bs占比超1%的会话数量随时间变化
问题解决方案
你遇到的报错是因为Grafana的时序可视化面板要求返回结果必须包含时间类型字段作为X轴维度,你当前的查询仅统计了固定时间窗口内的符合条件会话,没有拆分时间维度,因此无法生成趋势图。
核心修改思路
- 使用Timestream的
date_bin函数结合Grafana内置的$__interval变量,按适配面板的时间粒度拆分时间桶 - 两个CTE分组时同时按时间桶和会话ID分组,统计每个时间桶内每个会话的总请求量、
cmcd_bs=true的请求量 - 最终按时间桶聚合,统计每个时间桶内符合占比要求的会话数量
- 修正原查询的两处逻辑错误:
cmcd_bs过滤条件错误、GROUP BY字段笔误
修改后的查询语句
WITH total_requests AS ( SELECT date_bin($__interval, time, now()) as time_bucket, cast (count(*) as double) as CNT_TOTAL, cmcd_sid as SID_TOTAL FROM $__database.$__table WHERE cmcd_sid is not NULL AND time >= $__timeFrom AND time <= $__timeTo GROUP BY time_bucket, cmcd_sid ), bs_requests AS ( SELECT date_bin($__interval, time, now()) as time_bucket, cast (count(*) as double) as CNT_BS, cmcd_sid as SID_BS FROM $__database.$__table WHERE cmcd_bs = true AND time >= $__timeFrom AND time <= $__timeTo GROUP BY time_bucket, cmcd_sid ) SELECT time_bucket as time, count(DISTINCT SID_BS) as qualified_session_count FROM total_requests JOIN bs_requests ON total_requests.time_bucket = bs_requests.time_bucket AND total_requests.SID_TOTAL = bs_requests.SID_BS WHERE CNT_BS / CNT_TOTAL * 100 > 1 GROUP BY time_bucket ORDER BY time_bucket
额外说明
- 原查询中使用
ago(3h)固定时间范围,替换为Grafana内置的$__timeFrom和$__timeTo变量后,统计范围会自动同步面板右上角选择的时间范围,适配性更强 - 如果你需要统计的是每个会话在整个选择时间范围内的总占比,而不是每个时间桶内的占比,可以删除CTE中的时间分桶逻辑,最终统计时用
$__timeTo作为时间字段返回,配合Grafana的「统计」「仪表」等非时序面板使用 - 如需调整统计粒度,可手动把
$__interval替换为固定时间值,例如1h(按小时统计)、5m(按5分钟统计)
内容的提问来源于stack exchange,提问作者Agenobarb
相关产品推荐
相关产品推荐

