重慶市氣象信息與技術(shù)保障中心 李文釗 趙芳 楊永毅 趙思亮
通過(guò)對(duì)JSON-RPC通信協(xié)議和Grafana的研究,提出一種脫離Zabbix主體(Zabbix Server+Zabbix Agent)與Grafana獨(dú)立交互數(shù)據(jù)的方法,并詳細(xì)介紹了數(shù)據(jù)交互的格式及其交互過(guò)程,實(shí)現(xiàn)對(duì)任意數(shù)據(jù)的Grafana可視化展示。
Grafana是一款開(kāi)源數(shù)據(jù)可視化工具,它可以將枯燥的數(shù)據(jù)通過(guò)美觀、直接的圖形、圖表等形式展現(xiàn)出來(lái),同時(shí)還提供了對(duì)數(shù)據(jù)的監(jiān)控、統(tǒng)計(jì)和告警等功能,可以說(shuō)是目前最完美的數(shù)據(jù)可視化工具之一[1]。它是通過(guò)Go語(yǔ)言開(kāi)發(fā),用戶層面想開(kāi)發(fā)這樣的數(shù)據(jù)可視化工具非常困難,即使直接使用它,也需要對(duì)Go語(yǔ)言有極其深入的了解。Grafana可以為多種數(shù)據(jù)源提供豐富的插件,使得用戶不需要了解Go語(yǔ)言,只需知道插件對(duì)應(yīng)的設(shè)置規(guī)則,就可以方便的使用它。
Zabbix是一個(gè)企業(yè)級(jí)分布式開(kāi)源監(jiān)控解決方案,也是當(dāng)前使用最普遍的監(jiān)控系統(tǒng)之一[2]。Grafana為Zabbix提供了數(shù)據(jù)源插件,Zabbix用戶可以非常方便的通過(guò)Grafana顯示數(shù)據(jù)。然而,對(duì)于Zabbix Agent不支持的數(shù)據(jù)(任意數(shù)據(jù)),要想完成數(shù)據(jù)在Grafana的顯示就特別麻煩,除了要依托龐大的Zabbix服務(wù)器系統(tǒng)外還需要通過(guò)Zabbix API編寫(xiě)相應(yīng)的通信程序或者編寫(xiě)相應(yīng)通信腳本才能實(shí)現(xiàn)。實(shí)際上,有些數(shù)據(jù)在監(jiān)控系統(tǒng)中并不參與控制,僅僅是為了顯示(可視化)而已。能否不通過(guò)Zabbix主體系統(tǒng)讓Grafana直接顯示想要可視化的數(shù)據(jù)成為我們研究的重點(diǎn)問(wèn)題,本文正是針對(duì)這一問(wèn)題,提出一種可以脫離Zabbix主體讓Grafana獨(dú)立顯示數(shù)據(jù)的方法。
Zabbix數(shù)據(jù)源插件是Grafana公司開(kāi)發(fā)針對(duì)Zabbix的基于JSON-RPC規(guī)范的通信接口,是Grafana和Zabbix之間交互的橋梁。它把復(fù)雜的數(shù)據(jù)可視化過(guò)程簡(jiǎn)化為JSON-RPC的使用過(guò)程。
JSON-RPC是一個(gè)基于TCP的無(wú)狀態(tài)且輕量級(jí)的RPC(遠(yuǎn)程過(guò)程調(diào)用)交互協(xié)議[3],客戶端發(fā)起遠(yuǎn)程調(diào)用時(shí)向服務(wù)端發(fā)送請(qǐng)求報(bào)文,服務(wù)端響應(yīng)請(qǐng)求,將返回報(bào)文發(fā)送給客戶端。其請(qǐng)求報(bào)文和返回報(bào)文中的數(shù)據(jù)對(duì)象則是用JSON作為數(shù)據(jù)類(lèi)型來(lái)表征的。
RPC調(diào)用對(duì)象包含如下JSON成員:
jsonrpc:JSON-RPC版本(JSON-RPC 2.0)method:調(diào)用的方法名
params:方法傳入的參數(shù),若無(wú)參數(shù)則傳入[]id:調(diào)用標(biāo)識(shí)符。用于標(biāo)示一次遠(yuǎn)程調(diào)用過(guò)程響應(yīng)對(duì)象包含如下JSON成員:
jsonrpc:JSON-RPC版本,固定為2.0.
Result:方法返回值。若無(wú)返回值,則返回null。若調(diào)用錯(cuò)誤,返回null
error:調(diào)用時(shí)錯(cuò)誤,無(wú)錯(cuò)誤返回null。id:調(diào)用標(biāo)識(shí)符,與調(diào)用方傳入的標(biāo)識(shí)符一致。以上就是JSON-RPC協(xié)議規(guī)范。
Agent數(shù)據(jù)通過(guò)Zabbix主體和Grafana交互[4],非Agent數(shù)據(jù)則需要通過(guò)Zabbix API或腳本處理程序,再通過(guò)Zabbix主體和Grafana交互才能實(shí)現(xiàn)數(shù)據(jù)的可視化,如圖1所示。
圖1 Grafana和Zabbix數(shù)據(jù)交互示意圖Fig.1 Schematic diagram of data interaction between Grafana and Zabbix
Grafana通過(guò)Zabbix數(shù)據(jù)源插件向Zabbix發(fā)起RPC遠(yuǎn)程過(guò)程調(diào)用,調(diào)用方法和參數(shù)包含在Method和Params指定的對(duì)象中。Zabbix響應(yīng)RPC遠(yuǎn)程過(guò)程調(diào)用,將返回?cái)?shù)據(jù)封裝在Result指定的對(duì)象中傳給Grafana Zabbix端調(diào)用接口為:http://Zabbix server IP/api_jsonrpc.php。
下面為主要的交互過(guò)程和具體數(shù)據(jù)格式(其中參數(shù)為實(shí)測(cè)參數(shù)):
請(qǐng)求:{"id":2,"jsonrpc":"2.0","method":"apiinfo.version","params":{}}
響應(yīng):{"jsonrpc":"2.0","result":"5.0.0","id":2}
請(qǐng)求:
{"id":2,"jsonrpc":"2.0","method":"user.login","params":{"password":"****","user":"Admin"}}
響應(yīng):{"jsonrpc":"2.0","result":"b980098ddaf02d 0108b4dc8cb3f1e43c","id":2}
請(qǐng)求:{"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}}
響應(yīng):{"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方法的請(qǐng)求為身份認(rèn)證;history.get方法的請(qǐng)求就是提交單個(gè)具體itemid可視化數(shù)據(jù)的請(qǐng)求,它的響應(yīng)中的result下的value即為可視化數(shù)據(jù)。
從前文分析可以知道,數(shù)據(jù)送達(dá)Grafana做可視化展示,最后環(huán)節(jié)是Grafana和Zabbix接口http://Zabbix server IP/api_jsonrpc.php通信這一步。如果我們模仿Zabbix接口,把要可視化的數(shù)據(jù),按照J(rèn)SON-RPC協(xié)議規(guī)范封裝在Result中直接傳給Grafana,就可以脫離Zabbix主體,同樣可以做到相同的效果,如圖2所示。
圖2 脫離Zabbix主體數(shù)據(jù)交互示意圖Fig.2 Schematic diagram of data interaction separated from Zabbix main body
數(shù)據(jù)按照:(i_till-i_from)/60個(gè)采樣點(diǎn)采樣
以String型放置緩沖區(qū):buff[i](i為采樣點(diǎn))
那么result的"clock"和"value"的封裝過(guò)程為:
本方法采用應(yīng)用程序方式,在本機(jī)IP,80端口建立TCP監(jiān)聽(tīng),根據(jù)Grafana的請(qǐng)求,把裝好的響應(yīng)數(shù)據(jù)返回Grafana。程序結(jié)構(gòu)如圖3所示。
圖3 程序結(jié)構(gòu)圖Fig.3 Program structure diagram
實(shí)際當(dāng)中,為避免交互數(shù)據(jù)超過(guò)MTU,這部分程序應(yīng)在專(zhuān)門(mén)的線程中來(lái)處理。
Grafana支持多種數(shù)據(jù)源,其設(shè)計(jì)遵循依賴(lài)倒置原則,就是都不為任何具體的數(shù)據(jù)源適配專(zhuān)門(mén)的解決方案,通過(guò)聲明接口,讓數(shù)據(jù)源自己去實(shí)現(xiàn)。那么,我們只要知道數(shù)據(jù)源的數(shù)據(jù)格式和交互規(guī)則,完全可以使用本文的方法,脫離數(shù)據(jù)源監(jiān)控軟件主體,從而更加直接方便地實(shí)現(xiàn)數(shù)據(jù)的Grafana可視化。
引用
[1] 常興華.指控系統(tǒng)運(yùn)行管理軟件的設(shè)計(jì)[J].自動(dòng)化技術(shù)與應(yīng)用,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.