求助:Grafana实现动态Worker时序图并标记红色空闲时段
在Grafana中实现动态Worker执行时序区间图
一、核心实现思路
要实现动态Y轴(每个Worker对应独立Y轴条目)+ 执行区间展示,核心是把process字段映射为动态Y轴标识,搭配Grafana的条形图(Bar Chart)或时间序列图的区间模式来呈现起止时间。
二、动态Y轴的SQL查询语句
通过窗口函数给每个唯一process分配动态整数ID,避免硬编码Y轴值:
SELECT process, execution, start_time AS "time", end_time - start_time AS "duration", -- 为每个process分配唯一动态Y轴ID DENSE_RANK() OVER (ORDER BY process) AS y_axis_id FROM log_table WHERE $__timeFilter(start_time) OR $__timeFilter(end_time) ORDER BY process, start_time
DENSE_RANK()自动为不同process生成连续整数,实现Y轴动态适配$__timeFilter适配Grafana面板的时间范围选择,过滤数据
三、Grafana面板配置
- 面板类型选择:优先用Bar Chart(横向布局更贴合示例图效果),也可使用Time Series面板
- 数据映射设置:
- 将
y_axis_id设为Y轴字段,process设为图例(Legend),让Y轴显示Worker名称而非ID - 用
start_time作为起始时间、duration作为条形长度,或在Time Series中配置start_time和end_time为时间区间
- 将
- Y轴优化:
- 开启Y轴的
Labels选项,关联process字段,直接显示Worker名称 - 关闭Y轴自动缩放,保证每个Worker条目独立展示
- 开启Y轴的
四、空闲时间红色标记实现
需要先生成每个Worker两次执行之间的空闲区间,再叠加到图表中:
1. 生成空闲区间的SQL查询
WITH process_executions AS ( SELECT process, start_time, end_time, -- 获取当前执行的下一次启动时间 LEAD(start_time) OVER (PARTITION BY process ORDER BY start_time) AS next_start FROM log_table WHERE $__timeFilter(start_time) OR $__timeFilter(end_time) ) SELECT process, end_time AS "time", next_start - end_time AS "idle_duration", DENSE_RANK() OVER (ORDER BY process) AS y_axis_id, 'idle' AS type FROM process_executions WHERE next_start IS NOT NULL AND next_start > end_time
2. Grafana叠加配置
- 将上述查询作为第二个数据源添加到面板
- 把该数据系列的颜色设为红色,开启填充模式,空闲区间会以红色背景显示在对应Worker条目下
五、注意事项
- 确保
process字段标识唯一,避免同一Worker被分配多个Y轴ID - 若Worker数量较多,可开启Grafana的Y轴滚动功能,方便查看全量条目
内容的提问来源于stack exchange,提问作者Ievgen
相关产品推荐
相关产品推荐

