基于JSON-RPC的Grafana数据可视化的另类方法设计*

2021-11-19 02:48重庆市气象信息与技术保障中心李文钊赵芳杨永毅赵思亮
数字技术与应用 2021年10期
关键词:数据源插件调用

重庆市气象信息与技术保障中心 李文钊 赵芳 杨永毅 赵思亮

通过对JSON-RPC通信协议和Grafana的研究,提出一种脱离Zabbix主体(Zabbix Server+Zabbix Agent)与Grafana独立交互数据的方法,并详细介绍了数据交互的格式及其交互过程,实现对任意数据的Grafana可视化展示。

0 引言

Grafana是一款开源数据可视化工具,它可以将枯燥的数据通过美观、直接的图形、图表等形式展现出来,同时还提供了对数据的监控、统计和告警等功能,可以说是目前最完美的数据可视化工具之一[1]。它是通过Go语言开发,用户层面想开发这样的数据可视化工具非常困难,即使直接使用它,也需要对Go语言有极其深入的了解。Grafana可以为多种数据源提供丰富的插件,使得用户不需要了解Go语言,只需知道插件对应的设置规则,就可以方便的使用它。

Zabbix是一个企业级分布式开源监控解决方案,也是当前使用最普遍的监控系统之一[2]。Grafana为Zabbix提供了数据源插件,Zabbix用户可以非常方便的通过Grafana显示数据。然而,对于Zabbix Agent不支持的数据(任意数据),要想完成数据在Grafana的显示就特别麻烦,除了要依托庞大的Zabbix服务器系统外还需要通过Zabbix API编写相应的通信程序或者编写相应通信脚本才能实现。实际上,有些数据在监控系统中并不参与控制,仅仅是为了显示(可视化)而已。能否不通过Zabbix主体系统让Grafana直接显示想要可视化的数据成为我们研究的重点问题,本文正是针对这一问题,提出一种可以脱离Zabbix主体让Grafana独立显示数据的方法。

1 Zabbix数据源插件

Zabbix数据源插件是Grafana公司开发针对Zabbix的基于JSON-RPC规范的通信接口,是Grafana和Zabbix之间交互的桥梁。它把复杂的数据可视化过程简化为JSON-RPC的使用过程。

2 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协议规范。

3 Grafana和Zabbix数据交互过程分析

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即为可视化数据。

4 脱离Zabbix主体的数据交互方法

从前文分析可以知道,数据送达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

4.1 请求数据解析

4.2 响应数据封装

数据按照:(i_till-i_from)/60个采样点采样

以String型放置缓冲区:buff[i](i为采样点)

那么result的"clock"和"value"的封装过程为:

4.3 数据交互

本方法采用应用程序方式,在本机IP,80端口建立TCP监听,根据Grafana的请求,把装好的响应数据返回Grafana。程序结构如图3所示。

图3 程序结构图Fig.3 Program structure diagram

实际当中,为避免交互数据超过MTU,这部分程序应在专门的线程中来处理。

5 结语

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.

猜你喜欢
数据源插件调用
自编插件完善App Inventor与乐高机器人通信
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
Web 大数据系统数据源选择*
基于不同网络数据源的期刊评价研究
基于jQUerY的自定义插件开发
基于系统调用的恶意软件检测技术研究
MapWindowGIS插件机制及应用
基于真值发现的冲突数据源质量评价算法
基于Revit MEP的插件制作探讨