如何在Grafana中自动实现按类别拆分的value1累计值堆叠折线图?
适配动态类别的Grafana累计堆叠折线图实现方案
核心思路
利用Grafana Transforms的批量处理能力,无需手动逐个配置类别,自动适配category的新增、删除或名称变化场景,实现按类别拆分的value1累计值堆叠折线图。
具体操作步骤
1. 初始数据结构化转换
添加 Prepare time series 转换,配置如下:
- Time field: 选择
timestamp字段 - Value fields: 仅勾选
value1 - Group by: 选择
category字段
此步骤会自动按每个category生成独立的时间序列帧,无需手动干预类别数量或名称。
2. 批量生成累计字段
添加 Add field from calculation 转换,配置:
- Calculation: 选择「Running total(运行总计)」
- Field: 选择「Apply to all fields」(或手动勾选所有
value1字段) - 自定义字段名称(如
累计value1)
该转换会自动对所有帧的value1字段计算累计值,不管category有多少个,动态变化的类别都会被自动处理。
3. 过滤与合并序列
- 添加 Filter fields by name 转换,仅保留刚才生成的累计字段(如
累计value1),剔除原始value1字段。 - 添加 Merge 转换,将多帧数据合并为单宽帧,适配堆叠折线图的数据格式要求。
4. 图表配置
选择「Stacked Line(堆叠折线图)」类型,在图例设置中按category分组,确保时间轴正确绑定timestamp字段,即可得到目标效果。
替代方案:JSONata一步转换
若熟悉JSONata语法,可直接用JSONata转换完成分组与累计计算,步骤更简洁:
添加JSONata转换,输入以下表达式(需根据实际数据结构微调):
// 按category分组,每组按timestamp排序后计算累计值 $data group by $.category ~> $each(function($group) { $sort($group, function($a, $b) { $a.timestamp < $b.timestamp }) ~> $reduce(function($acc, $item) { $merge([$item, {"累计value1": $acc.累计value1 + $item.value1}]) }, {"累计value1": 0}) })
转换后直接过滤掉value2和原始value1字段,即可用于堆叠折线图展示。
内容的提问来源于stack exchange,提问作者awnine
相关产品推荐
相关产品推荐

