如何在Grafana中累加InfluxDB数据生成机器人状态占比饼图?
解决方案:基于InfluxDB和Grafana实现机器人状态时长占比饼图
可行性结论
完全可行,你当前的数据格式基本满足需求,只需通过正确的查询语句即可实现状态时长累加和饼图展示。
具体实现步骤
1. 确认InfluxDB数据结构
你当前写入的Line Protocol格式为:Status,Status="Walking" Duration=50
这个结构逻辑没问题:
- 测量名(measurement)为
Status - 标签(tag)
Status用来区分不同状态(如Walking/Charging/Sleeping) - 字段(field)
Duration存储该状态的持续时长
2. 配置Grafana数据源
确保Grafana已连接到你的InfluxDB实例,选择对应的数据存储库,完成认证配置(如果需要)。
3. 编写累加查询语句
在Grafana面板编辑器中选择InfluxDB数据源,执行以下InfluxQL查询:
SELECT SUM("Duration") AS "总时长" FROM "Status" GROUP BY "Status"
SUM("Duration"):累加同一状态下所有时长记录,得到该状态的总时长GROUP BY "Status":按状态标签分组,确保每个状态的总时长单独计算
4. 配置饼图面板
- 添加Pie Chart面板(若未安装,需先在Grafana插件市场安装饼图插件)
- 将查询结果中的
Status设为饼图的标签(Labels),总时长设为数值(Values) - 可在面板设置中调整显示样式,比如开启百分比显示、调整图例位置等
5. 可选:数据格式优化建议
当前格式可用,但为了更清晰规范,建议:
- 将标签名从
Status改为State,避免与测量名重复,修改后的Line Protocol为:Status,State="Walking" Duration=50 - 写入数据时添加纳秒级时间戳(若C#程序未自动生成),确保时序准确性,示例:
Status,State="Walking" Duration=50 1699999999000000000
测试验证
用你提到的场景测试:行走10s→充电20s→行走10s,写入三条数据:
Status,State="Walking" Duration=10 Status,State="Charging" Duration=20 Status,State="Walking" Duration=10
执行查询后会得到:
- Walking: 20
- Charging:20
饼图将显示两者各占50%,完全符合需求。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

