在時序分析及監控展現領域,Grafana無疑是開源解決方案中的翹楚,其靈活的插件機制,支持各種漂亮的面板、豐富的數據源以及強大的應用。典型的面板有Graph、Text、Singlestat、PieChart、Table、Histogram等,支持的數據源有ES、Graphite、InfluxDB、OpenTSDB、MySQL、Druid 、Prometheus、SimpleJson等,提供的應用有Zabbix、K8s等。

由於公司某些業務用到了SQLServer數據庫,因此需要將SQLServer中的統計數據展現在Grafana中,但美中不足的是Grafana官方至今沒有提供對SQLServer數據源的支持,如何將SQLServer中的數據靈活展現在Grafana中,是一個擺在我們面前的痛點問題。
經過研究Grafana支持的數據源,我們使用SimpleJson數據源,搭建WebAPI站點,構建報表解析引擎,通過編寫契約式的SQL語句,可以將SQLServer中的數據靈活展現在Grafana中,很好的解決了這個痛點問題,整體架構如下所示:

一、WebAPI
如果要支持SimpleJson,后端WebAPI需要實現4個URL:
- /:返回200,用於SimpleJson數據源測試連通性;
- /search:返回所有可選的指標;
- /query:返回對應指標的時間序列點;
- /annotations:返回注解。
二、報表引擎
一個報表對應一個查詢SQL,這些查詢SQL要事先定義好,並存儲在數據庫中,對Grafana只暴露報表名稱。
當在Grafana中選擇了指定的報表名稱后,會發起一個WebAPI請求,報表引擎負責解析該請求,通過報表名稱獲得對應的查詢SQL,進行SQL安全性校驗,如果校驗通過,則根據報表關聯的數據源,到指定數據庫中執行該查詢SQL,並將返回結果組裝成DataTable,然后構造SimpleJson所需的數據格式。
三、查詢SQL契約
因為Grafana用於展現時序數據,所以返回的數據中,必須有一列是Time列,因此我們對查詢SQL做了約定:
如果Grafana中以表格形式展現數據時,查詢SQL可以是多列,必須有一列是時間列。

如果Grafana中以數字、折線圖、柱狀圖、餅圖等展現數據時:
- 查詢SQL最多返回兩列;
- 查詢SQL只返回一列時,必須是數字列,報表引擎自動補上時間列為當前時間,適用於在Grafana中只展示數字的情況;

3.查詢SQL返回兩列時
a) 若含有時間列,則第一列是時間列(帶有“Time”字樣),第二列是數字列,適用於在Grafana中展現折線圖、柱狀圖等情況;


b) 若不含時間列,則第一列是名稱,第二列是數字列,報表引擎自動根據名稱進行分組,並補上時間列為當前時間,適用於在Grafana中展現餅圖的情況。

當要在一個圖中展現多條時序數據時,可以將多個查詢SQL組合到一起返回,也就是報表組的功能,因此一個報表可以單獨展現,也可以和其他報表組成一個報表組一起展現。
綜上所述,基於SimpleJson數據源,只要按照SQL查詢契約書寫SQL,就能將SQLServer中的數據靈活展現在Grafana中,同時還要考慮報表權限、SQL安全校驗、定時執行報表、報表緩存等,不再贅述。當然SimpleJson只是一個數據源協議載體,理論上可以對接任何類型的后台數據,只要組裝成它支持的格式即可。
四、特來電雲計算與大數據微信公眾號
1.微信公眾號名稱:特來電雲計算與大數據
2.二維碼:

