優(yōu)秀的手機網(wǎng)站品牌全案策劃
? ??????最近項目中需要監(jiān)控分布式集群的各項指標(biāo)信息,需要用到Prometheus+Grafana的技術(shù)棧實現(xiàn)對分布式集群的各個節(jié)點狀態(tài)進行可視化顯示,但是要求前端需要提供一個易用的接口讓用戶可以觸發(fā)一些操作,例如負載高時進行負載均衡或彈性伸縮。網(wǎng)上找到的教程大都不是很全面,所以將探索過程記錄了一下,對有相同需求的人也是個借鑒。
????????首先,觸發(fā)事件我使用了Grafana自帶的按鈕插件,配合infinity數(shù)據(jù)源加上項目中自己寫的一些API來進行,當(dāng)然也可以只使用grafana中的iframe圖,嵌入到自己寫的web框架中,如果只需要簡單的收發(fā)http請求需求,完全可以使用我下面介紹的方法。
1、按鈕控件創(chuàng)建
這里Grafana的基本配置我就不過多贅述了,要使用按鈕插件需要保證自己安裝了對應(yīng)的插件,在插件界面進行安裝。具體安裝過程如下:
確保安裝好button控件后來到dashboard中,點擊右上方ADD按鈕新建一個button控件
?如此一來,按鈕控件便創(chuàng)建完成了。
上圖右側(cè)三個關(guān)于按鈕的參數(shù),text表示按鈕上的文字,datasource代表操作的數(shù)據(jù)源,query代表按鈕按下時觸發(fā)的命令,我們需要對這三個參數(shù)進行配置來達到我們想要的效果,text根據(jù)大家需求來寫,后續(xù)兩個部分我們就來解決datasource(也就是對應(yīng)的api路由)和query(在本項目中需要做到http的get和post請求觸發(fā),具體見第三個部分)?
2、收發(fā)API創(chuàng)建
這個部分大家如果自己項目中有相關(guān)的收發(fā)API就可以直接跳過了,為了方便一些學(xué)習(xí)的朋友,這里我簡單寫了個demo供大家參考,API使用python編寫如下:
from flask import Flask, jsonify, requestapp = Flask(__name__)# 定義一個GET請求的路由
@app.route('/api/test_get', methods=['GET'])
def test_get():print("success!")return jsonify({'Node_id': '1','Node_ip': '0.0.0.1','status' : 'off'},{'Node_id': '2','Node_ip': '0.0.0.2','status': 'off'},{'Node_id': '3','Node_ip': '0.0.0.3','status': 'off'},{'Node_id': '4','Node_ip': '0.0.0.4','status': 'on'})# 定義一個POST請求的路由
@app.route('/api/test_post', methods=['POST'])
def test_post():data = request.jsonprint(request.json)return jsonify(data), 200if __name__ == '__main__':app.run(debug=True)
主要使用到了flask包,我簡單定義了兩個http請求的API,路徑分別是localhost/api/test_get和localhost/api/test_post,模擬了兩種簡單的業(yè)務(wù)情景get和post,get的api功能是每當(dāng)觸發(fā)時返回一個json格式的數(shù)據(jù),里面包含了集群種的節(jié)點信息;post的api接收一個json格式的數(shù)據(jù)并直接返回該數(shù)據(jù)。
3、綁定API與Grafana中的按鈕控件
首先,在Grafana中操作的對象是數(shù)據(jù)源,并且有著比較嚴格的限制,Grafana為上述的API操作提供了infinity數(shù)據(jù)源,我們需要先進行創(chuàng)建,創(chuàng)建比較簡單,如下圖:
起名字直接保存就可以,具體的api路由可以后續(xù)進行設(shè)置。
創(chuàng)建好數(shù)據(jù)源后我們回到剛剛創(chuàng)建好的button控件處,選擇剛剛創(chuàng)建的button_test數(shù)據(jù)源
那么最后的步驟便是解決query的問題,因為Grafana中對query的格式要求比較嚴格,所以這里我使用的方法是使用自帶的GUI頁面幫我生成query再復(fù)制過去,具體步驟如下:
自帶的gui方式創(chuàng)建query需要在頁面下方同樣選擇剛剛創(chuàng)建的infinity數(shù)據(jù)源
創(chuàng)建好后進行相應(yīng)的配置,因為get和post略有不同,下面分兩個部分進行說明和測試
(1)POST請求
具體配置依據(jù)API而定,第二部分我寫的API中數(shù)據(jù)格式都是json,所以選擇json,解析方式選擇后端解析,URL就是我們http請求的路由,第二部分中說到過,是本地的/api/test_post路徑下,method選擇post。因為post需要發(fā)送數(shù)據(jù),所以需要以下填充發(fā)送數(shù)據(jù)的過程,這里我們發(fā)送一個json格式的{"data","button_test"}
接下來query便被我們以gui形式創(chuàng)建好了,接下來就需要轉(zhuǎn)換為grafana中要求的格式并傳給button控件即可。我們點擊中間的Query inspector
點擊json,找到targets的部分便是對應(yīng)query的標(biāo)準json格式
?我們把這段json復(fù)制到button控件對應(yīng)的query中并apply即可
?下面進行測試的部分,我們首先需要正常運行API,這里我使用pycharm進行運行
打開后點擊我們剛剛創(chuàng)建的按鈕
可以看到成功發(fā)出了post請求。
(2)GET請求
操作步驟與上面類似,get請求一般不和按鈕共同使用,為了更直觀地展示get到的數(shù)據(jù),我們使用table控件,進行如下配置
打開API后刷新頁面便可以看到第二部分中我們自己設(shè)置返回的那些假數(shù)據(jù),grafana會根據(jù)json格式自動進行表格的編排,如果有具體要求可以在下圖箭頭處自行修改
以上就是探索的整個過程,內(nèi)容中存在的問題勞煩各位批評指正,有任何問題也可以評論討論。