简单记录下自己在使用Grafana过程中的一点点经验总结:通过修改sql的方式来消除柱状图中多余的0值。

问题

通过Grafana基于MySQL查询系统监控统计数据时,发现在柱状图中有很多0值,严重影响使用体验。

柱状图显示0值

解决

一开始自己想通过Grafana面板的过滤这些0值,搜索一番后并没有找到基于Grafana的解决方案,给出的答案是通过修改sql来规避此问题1,对比该答案,还发现自己遇到的问题类似。

原始查询sql:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
SELECT 
    DATE_FORMAT(t.start_time,'%Y-%m-%d') AS `taskDate`,
    SUM(IF(t.instance_status = 0,1,0)) AS `未知`,
    SUM(IF(t.instance_status = 1,1,0)) AS `等待触发`,
    SUM(IF(t.instance_status = 2,1,0)) AS `队列中`,
    SUM(IF(t.instance_status = 3,1,0)) AS `开始执行`,
    SUM(IF(t.instance_status = 4,1,0)) AS `执行中`,
    SUM(IF(t.instance_status = 5,1,0)) AS `成功`,
    SUM(IF(t.instance_status = 6,1,0)) AS `失败`,
    SUM(IF(t.instance_status = 7,1,0)) AS `终止`,
    SUM(IF(t.instance_status = 8,1,0)) AS `超时`,
    SUM(IF(t.instance_status = 9,1,0)) AS `拒绝执行`,
    SUM(IF(t.instance_status = 10,1,0)) AS `已访问`
    FROM t_work_flow_instance t 
WHERE t.start_time> DATE_SUB(NOW(), INTERVAL 14 DAY)
  GROUP BY taskDate
  ORDER BY taskDate

mysql中查询结果:

mysql原始查询结果

为了解决该问题,需要将IF中的默认值从0修改为null

改进后的sql:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
SELECT 
    DATE_FORMAT(t.start_time,'%Y-%m-%d') AS `taskDate`,
    SUM(IF(t.instance_status = 0,1,null)) AS `未知`,
    SUM(IF(t.instance_status = 1,1,null)) AS `等待触发`,
    SUM(IF(t.instance_status = 2,1,null)) AS `队列中`,
    SUM(IF(t.instance_status = 3,1,null)) AS `开始执行`,
    SUM(IF(t.instance_status = 4,1,null)) AS `执行中`,
    SUM(IF(t.instance_status = 5,1,null)) AS `成功`,
    SUM(IF(t.instance_status = 6,1,null)) AS `失败`,
    SUM(IF(t.instance_status = 7,1,null)) AS `终止`,
    SUM(IF(t.instance_status = 8,1,null)) AS `超时`,
    SUM(IF(t.instance_status = 9,1,null)) AS `拒绝执行`,
    SUM(IF(t.instance_status = 10,1,null)) AS `已访问`
    FROM t_work_flow_instance t 
WHERE t.start_time> DATE_SUB(NOW(), INTERVAL 14 DAY)
  GROUP BY taskDate
  ORDER BY taskDate

mysql中查询结果如下,可看出除了将0值修改为null之外,其余的查询数据是一致的。

mysql改进后的查询结果

Grafana中查看显示效果类似如下,可发现0值已经消失,问题初步解决。

柱状图不显示0值

后记

虽然前述问题被解决,但当我们用鼠标查询对应的柱状条时,可发现tooltip中会显示所有的类别,即使该类别值为0或不存在也会显示,同样很影响使用体验。

在网上搜索一番后,发现已经有人在GrafanaGitHub主页上提出了对应的issue2, 遗憾的是该问题在2015年初被提出,到现在快10年了都没解决,Grafana官方的开发人员明确回复了没有该问题的修复计划,并且不认为其是一个issue,看来只能一直凑合用着!

柱状图tooltip中显示所有类别