dmsong
作者dmsong·2021-08-24 14:52
系统工程师·IPS

利用Grafana的transformation功能实现统计报表

字数 2790阅读 14791评论 0赞 0

Grafana是一个功能强大且易用的数据可视化软件,在监控系统中使用越来越广泛。监控系统中常用时序数据库,时序数据库比较适合存储监控采样数据,能够现多维快速查询。但是,在传统关系型数据库中常用的多表join,在时序数据库数据库中实现起来却比较困难。所以Grafana对接时序数据库时,虽然可以设计出各种监控仪表盘,但在仪表上展示统计报表或者从panel导出统计报表并不是一件容易的事情。
Grafana的transformation功能可以帮助我们做出灵活的报表。

Transformation介绍
Transformation可以处理一系列查询结果,比如重命名列(field)名,把不同的时间序列join到一起,对结果做计算等。
对查询结果,可以有多个transformation。Grafana会依次按顺序应用各个transformation来处理结果,就好像pipleline一样。transformation的顺序不同,获得的结果也可能不同。

Transformation位于Panel编辑器的Transformation标签下。点击“Add a transformation”,会出现Transformation类型下拉列表,选择某一类型,即可对结果进行处理。有的transformation会有一些设置选项,对处理过程进行设置。



Grafana支持的transformation列表如下:

所有transformation的介绍和使用方法都可以在Grafana的官方文档中找到。见文末参考资料。

利用transformation实现灵活的报表
Grafana对接的数据源多种多样,为了统一,grafana把查询结果变成统一的数据格式叫数据帧Data frame。Grafana用Data frame替代了原来的时间序列和表结构,用一种更通用的数据结构,支持更多的数据类型。
在Panel editor中,可以将一个Query得到的结果格式化为time series或者table。Transformation可以对time series格式的数据帧进行处理。但是一个查询Query出多个field的话,最好选table格式,因为time series格式会生成多个data frame。所以为了处理更方便,我们最好将查询结果格式化为Table格式。如下图所示。

下面以统计主机的CPU和内存利用率为例,介绍几种transformation的用法和效果。这里用到的数据源为influxdb,数据库中的measurements有cpu_physical_total和mem,分别记录CPU性能数据和内存性能数据。以下操作都在Panel Editor中进行。

  1. 在一个data frame中同时显示CPU利用率和计算内存利用率
    因为CPU利用率和内存利用率位于influxdb的两个measurement中,所以创建了两个查询语句来分别查询。查询出来的结果也是两个data frame。如下图所示(Virsualization选择table类型),通过data frame下拉框可以选择不同的的data frame。

    我们添加一个Outer join的transformation,将两个data frame按照时间合并成一个data frame。如下图所示

    从上面的table可以看到,查询结果现在成为了一个data frame,每行包含一个时间点的CPU利用率和内存利用率的值。
  2. 对时间序列统计最大最小平均值
    我们做统计报表的时候并不关心每个时间点的值,而是关心一些统计信息,比如利用率的最大最小平均值,为以后的性能规划提供依据。
    tranformation里的Reduce操作,能够在一个data frame里,对每一列的值进行计算(min,max,mean,total,count等)。
    所以这里我们增加一个Reduce类型的transformation。Mode选择Series to rows,Calculation选择min, max, mean。

    从上面的table可以看到,查询结果是两行,每行对应一个序列,即原来的每个field变成了一行,每行的值为这个序列的最大最小平均值。时间列消失。
  3. 多主机报表
    通常我们希望同时对多个主机出报表,上面的处理结果没有主机名信息,所以我们修改了一下查询语句,
    两个查询,分别是从内存表里查询主机名和计算内存使用率、从cpu表里查询主机名和cpu使用率。如下:

    SELECT "host", ("real_total" - "real_free" - "numperm") /"real_total"*100 FROM "memory" WHERE ("host" =~ /^$HOST$/) AND $timeFilter  
    SELECT "host","user"+"sys"+"wait" FROM "cpu_physical_total" WHERE ("host" =~ /^$HOST$/) AND $timeFilter   

    查询结果都格式化为table。
    然后添加3个transformation,分别是
    Outer join:按host列合并。合并成一个表,包含4列,time,host,cpu,mem。
    Group by:group by选择host,对cpu和mem域都做calculate。calculation选择min,max,mean。此时表中结果变成每行对应一个host,时间列消失,一共7列,分别是主机名、CPU的最大最小平均值、内存的最大最小平均值。
    Orgnize fields:因为列名是自动命名的,可读性较差。通过这个transformation将列名都重命名为中文
    最终结果如下图所示。

至此,我们已经通过几个transformation将监控数据时间序列转换成满足我们需求的报表。

报表的导出
处理好的报表可以直接导出为CSV格式。在Panel菜单上选择inspect->data,在Inspect的Data标签下,打开Data options的apply panel transformation开关,再点击右侧的Download csv按钮,就可以将处理好的报表导出为CSV文件了。如下图所示:

结语
本文介绍了通过Grafana的transformation将监控数据转换为报表的一些简单尝试,仅涉猎了几个transformation类型的部分用法,希望抛砖引玉,大家可以在实践中探索更丰富的处理和更灵活的组合来满足各种报表需求。

参考资料
https://grafana.com/docs/grafana/latest/panels/transformations

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广