重庆市气象信息与技术保障中心 李文钊 赵芳 杨永毅 赵思亮
通过对JSON-RPC通信协议和Grafana的研究,提出一种脱离Zabbix主体(Zabbix Server+Zabbix Agent)与Grafana独立交互数据的方法,并详细介绍了数据交互的格式及其交互过程,实现对任意数据的Grafana可视化展示。
Grafana是一款开源数据可视化工具,它可以将枯燥的数据通过美观、直接的图形、图表等形式展现出来,同时还提供了对数据的监控、统计和告警等功能,可以说是目前最完美的数据可视化工具之一[1]。它是通过Go语言开发,用户层面想开发这样的数据可视化工具非常困难,即使直接使用它,也需要对Go语言有极其深入的了解。Grafana可以为多种数据源提供丰富的插件,使得用户不需要了解Go语言,只需知道插件对应的设置规则,就可以方便的使用它。
Zabbix是一个企业级分布式开源监控解决方案,也是当前使用最普遍的监控系统之一[2]。Grafana为Zabbix提供了数据源插件,Zabbix用户可以非常方便的通过Grafana显示数据。然而,对于Zabbix Agent不支持的数据(任意数据),要想完成数据在Grafana的显示就特别麻烦,除了要依托庞大的Zabbix服务器系统外还需要通过Zabbix API编写相应的通信程序或者编写相应通信脚本才能实现。实际上,有些数据在监控系统中并不参与控制,仅仅是为了显示(可视化)而已。能否不通过Zabbix主体系统让Grafana直接显示想要可视化的数据成为我们研究的重点问题,本文正是针对这一问题,提出一种可以脱离Zabbix主体让Grafana独立显示数据的方法。
Zabbix数据源插件是Grafana公司开发针对Zabbix的基于JSON-RPC规范的通信接口,是Grafana和Zabbix之间交互的桥梁。它把复杂的数据可视化过程简化为JSON-RPC的使用过程。
JSON-RPC是一个基于TCP的无状态且轻量级的RPC(远程过程调用)交互协议[3],客户端发起远程调用时向服务端发送请求报文,服务端响应请求,将返回报文发送给客户端。其请求报文和返回报文中的数据对象则是用JSON作为数据类型来表征的。
RPC调用对象包含如下JSON成员:
jsonrpc:JSON-RPC版本(JSON-RPC 2.0)method:调用的方法名
params:方法传入的參数,若无參数则传入[]id:调用标识符。用于标示一次远程调用过程响应对象包含如下JSON成员:
jsonrpc:JSON-RPC版本,固定为2.0.
Result:方法返回值。若无返回值,则返回null。若调用错误,返回null
error:调用时错误,无错误返回null。id:调用标识符,与调用方传入的标识符一致。以上就是JSON-RPC协议规范。
Agent数据通过Zabbix主体和Grafana交互[4],非Agent数据则需要通过Zabbix API或脚本处理程序,再通过Zabbix主体和Grafana交互才能实现数据的可视化,如图1所示。
图1 Grafana和Zabbix数据交互示意图Fig.1 Schematic diagram of data interaction between Grafana and Zabbix
Grafana通过Zabbix数据源插件向Zabbix发起RPC远程过程调用,调用方法和参数包含在Method和Params指定的对象中。Zabbix响应RPC远程过程调用,将返回数据封装在Result指定的对象中传给Grafana Zabbix端调用接口为:http://Zabbix server IP/api_jsonrpc.php。
下面为主要的交互过程和具体数据格式(其中参数为实测参数):
请求:{"id":2,"jsonrpc":"2.0","method":"apiinfo.version","params":{}}
响应:{"jsonrpc":"2.0","result":"5.0.0","id":2}
请求:
{"id":2,"jsonrpc":"2.0","method":"user.login","params":{"password":"****","user":"Admin"}}
响应:{"jsonrpc":"2.0","result":"b980098ddaf02d 0108b4dc8cb3f1e43c","id":2}
请求:{"auth":" b980098ddaf02d0108b4dc8cb 3f1e43c ","id":2,"jsonrpc":"2.0","me
thod":"history.get","params":{"history":"3","itemids":["32216"],"output":"extend","sortfield":"clock","sortorder":"ASC","time_from":1625469924,"time_till":1625491524}}
响应:{"jsonrpc":"2.0","result":[{"itemid":"32216","clock":"1625473985","value":
"165","ns":"602612574"},{"itemid":"32216","clock":"1625474036","value":"164",
"ns":"147968452"},...],"id":2}
其中apiinfo.version、user.login方法的请求为身份认证;history.get方法的请求就是提交单个具体itemid可视化数据的请求,它的响应中的result下的value即为可视化数据。
从前文分析可以知道,数据送达Grafana做可视化展示,最后环节是Grafana和Zabbix接口http://Zabbix server IP/api_jsonrpc.php通信这一步。如果我们模仿Zabbix接口,把要可视化的数据,按照JSON-RPC协议规范封装在Result中直接传给Grafana,就可以脱离Zabbix主体,同样可以做到相同的效果,如图2所示。
图2 脱离Zabbix主体数据交互示意图Fig.2 Schematic diagram of data interaction separated from Zabbix main body
数据按照:(i_till-i_from)/60个采样点采样
以String型放置缓冲区:buff[i](i为采样点)
那么result的"clock"和"value"的封装过程为:
本方法采用应用程序方式,在本机IP,80端口建立TCP监听,根据Grafana的请求,把装好的响应数据返回Grafana。程序结构如图3所示。
图3 程序结构图Fig.3 Program structure diagram
实际当中,为避免交互数据超过MTU,这部分程序应在专门的线程中来处理。
Grafana支持多种数据源,其设计遵循依赖倒置原则,就是都不为任何具体的数据源适配专门的解决方案,通过声明接口,让数据源自己去实现。那么,我们只要知道数据源的数据格式和交互规则,完全可以使用本文的方法,脱离数据源监控软件主体,从而更加直接方便地实现数据的Grafana可视化。
引用
[1] 常兴华.指控系统运行管理软件的设计[J].自动化技术与应用,2021,40(5):44-47.
[2] VLADISHEV A.Zabbix:an enterprise-class open source distributed monitoring solution[EB/OL].http://www.zabbix.com/[Accessed:21-Juli-2010],2010.
[3] Kang P,Wei Y,Wei Z.Control system for granary ventilation based on embedded networking and Qt technology[C]// 2017 29th Chinese Control And Decision Conference(CCDC).IEEE,2017.
[4] Zhao Zhe,Tan Hai-bo,Zhao He,et al.Network monitoring system based on Zabbix[J].Computer Technology and Development,2018,28(1):144-149.