摘要:背景在監控系統實踐文章當中已經實現了我們的第一個監控圖表,現在我們有了一個新需求,需要對多個節點實現不同的監控,以及一個匯總的監控按照我們之前手動創建儀表盤的方法,每新增一個節點都需要手動去修改配置,并且需要去系統當中創建一個儀表盤,在節點
背景
在grafana+ prometheus+php 監控系統實踐文章當中已經實現了我們的第一個監控圖表,現在我們有了一個新需求,需要對多個節點實現不同的監控,以及一個匯總的監控;
按照我們之前手動創建儀表盤的方法,每新增一個節點都需要手動去修改prometheus配置,并且需要去grafana系統當中創建一個儀表盤,在節點很少的時候這種方式也能滿足,但當節點數量多起來的時候,就會增加很大一部分工作量,并且存在每次創建的圖表規則不一致的風險,因此我們的需求是在新增節點之后讓grafana自動創建一個儀表盤。
實現過程 操作步驟prometheus調用中間件
中間件收集各節點數據
驗證中間件數據有效性
調試儀表盤API接口
編寫節點變動事件處理
一、prometheus調用中間件 1.修改prometheus配置文件修改配置文件的目的是把之前直接連接單個節點的地址更改為中間件地址,之前單節點的uri為"==/api/v1/rrd/metrics==",現在則需要將其修改為中間件地址"==/api/v1/rrd/toolSpool==",因此新的配置文件內容如下:
--- global: scrape_interval: 5s scrape_timeout: 3s scrape_configs: - job_name: "mysql" scrape_interval: 5s static_configs: - targets: ["192.168.43.34:9104"] labels: instance: 192.168.43.34 - job_name: "media" scrape_interval: 3s metrics_path: "/api/v1/rrd/toolSpool" static_configs: - targets: ["gslb.offcncloud.com:8080"]1.2 重新啟動prometheus
當修改完配置文件之后,還需要讓其配置文件生效,所以需要將prometheus重新啟動。
docker重啟
docker本身就提供重啟命令,所以只需要輸入如下命令就可以了,注意后面是容器的名稱。
docker restart prometheus
mac下重啟
mac下重啟比較簡單,首先終止之前的任務,然后使用啟動命令
prometheus --config.file=/tmp/prometheus.yml二、中間件收集各節點數據 2.1 目的
中間件的作用是將各個節點的數據進行匯總,然后一次性返回給prometheus,實現這個中間件的方式有很多種,在實現之前我們也查找了一些資料,比如有網友用 consul-template+consul方式來實現,可參考下方鏈接;不過我覺得這個配置好像也不簡單,而這個中間件的功能還挺簡單的,所以還是自己使用PHP寫了一個中間件。
參考資料:
http://blog.51cto.com/xujpxm/...
拉取所有節點數據,這是核心作用
給各節點加標示,將來用來區分是哪個節點的
匯總并輸出,需要一個匯總的儀表盤
2.3 獲取節點數據,并添加標示要獲得各個節點的數據,name首先獲就得取到所有的節點列表,然后通過節點的IP地址來拼接URL,最終通過curl請求該地址來得到節點數據;
在獲得數據后,我們還小需要給每一個節點返回的數據加上標示可以用{}包括起來,因為prometheus支持這種格式,偽代碼如下:
ip}/api/v1/rrd/metrics"; //3. 獲取數據 $tmp = file_get_contents($url); //4. 在每個節點中插入host屬性,到時候用來做篩選單個節點 $tmp = str_replace(" ", " {host="{$name->ip}"} ", $tmp); $str .= $tmp; }2.4 匯總并輸出
我們的核心需求是需要看到所有節點的匯總狀況,所以在獲得各個節點的數據后還需要進行累加,prometheus中貌似并直接不支持,所以我們得在中間件總進線累加匯總。
//限制需要進行匯總統計,首先把字符串分割為數組 $arr = explode(PHP_EOL, $str); $tmpArr = []; //遍歷數組 foreach ($arr as $val) { //把每一行再次分割 $valArr = explode(" ", $val); //5. 匯總統計 if (!empty($valArr[0]) && is_string($valArr[0]) && is_numeric($valArr[2])) { $tmpArr[$valArr[0]] = isset($tmpArr[$valArr[0]]) ? ($tmpArr[$valArr[0]] + $valArr[2]) : $valArr[2]; } } //6. 匯總輸出 foreach ($tmpArr as $key => $num) { echo "{$key}_total $num" . PHP_EOL; } echo $str; }2.5 輸出最后結果
當中間件處理完成之后,我們需要各個節點的數據,并有在數據中需要有節點的標示,另外還需要一個匯總的數據,因此中間件返回數據如下:
media_connectNum_total 0 media_network_total 0 media_on_push_total 2 media_connectNum {host="192.168.43.46:8080"} 0 media_network {host="192.168.43.46:8080"} 0 media_on_push {host="192.168.43.46:8080"} 1 media_connectNum {host="127.0.0.1:8080"} 0 media_network {host="127.0.0.1:8080"} 0 media_on_push {host="127.0.0.1:8080"} 1三、驗證中間件數據有效性
現在我們的prometheus已經啟動,并且中間件也正常運行,那么此時prometheus和Grafana應該都有相應變化,我們可以根據這寫變化來確定我們前面的處理是否成功。
3.1 prometheus數據驗證當我們的配置文件和中間件發生變化后,最先產生相應變化的應該是數據倉庫,所以我們可以打開打開prometheus的web界面,URL地址(http://192.168.43.34:9090/graph)
在篩選中輸入media_network,然后進行篩選,如果能看到多個返回的記錄,則說明驗證成功,如下圖所示。
當prometheus數據倉庫的數據發生變化后,grafana的儀表盤也應該會發生變化,最明顯的變化如下圖所示,標簽都變成了雙份,比如之前的一份“擁堵拉流數量”變成了雙份。
原因多個節點返回了多份數據,而我們使用Grafana繪圖的時候篩選項只輸入了其中的key部分,并沒有篩選里面的屬性,因此有多少個節點就會有出來多少個項,如果數量對上了,說明Grafana也驗證成功了。
3.3 設置匯總圖現在我們把之前的儀表盤,重新編輯一下,把之前只篩選了key改成篩選key+上屬性,設置方式如下圖
設置好之后,我們看到的將是匯總的儀表盤,至此我們第一個的核心需求已經實現了
3.4 設置節點模板在設置匯總圖后,我們還將要實現第二個核心需求,自動化創建單節點的儀表盤,我們首先需要手動先創建一個單個節點的圖,和第一篇文章的創建方法一致,在設置篩選項的時候,我們填寫的內容要帶上屬性,屬性的作用可以篩選節點,如下圖:
四、調試儀表盤API接口API官方文檔URL:http://docs.grafana.org/http_...
4.1 創建API接口我們的目標是當新增節點時grafana能夠自動創建相應的儀表盤,因此需要使用到grafana的API接口,使用之前需要先創建一個密鑰用來授權,創建的流程如下圖:
添加一個api,在keyname中隨便填寫一個名字,然后role選擇admin權限,點擊添加按鈕
當創建成功能看到grafana頁面彈框提示,我們需要把他先復制下來放到一個位置,因為后面是看不見這個key的,如下命令:
使用終端進行訪問測試,如果返回結果如下,則代表這個key可以使用
4.2 使用postman調試現在不要急著取用PHP進行調試,可以先用Postman進行調試,我們需要調試的并不是剛才彈框上面的URL地址,而是創建一個儀表盤的地址,在官方文檔中的請求信息如下:
POST /api/dashboards/db HTTP/1.1 Accept: application/json Content-Type: application/json Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk { "dashboard": { "id": null, "uid": null, "title": "Production Overview", "tags": [ "templated" ], "timezone": "browser", "schemaVersion": 16, "version": 0 }, "folderId": 0, "overwrite": false }
使用postman請求截圖
{ "id": 23, "slug": "production-overview", "status": "success", "uid": "ID2FFcciz", "url": "/d/ID2FFcciz/production-overview", "version": 1 }
當返回如上結果,則說明已經創建成功了
4.3 導出模板現在我們需要導出之前創建的一個節點儀表盤,用來做模板,導出儀表盤的配置方法比較簡單,
把上面的json數據保存到 grafana.json文件中,在保存json文件的時候需要注意,導出來的json配置并不能直接使用,因為prometheus創建儀表盤的json格式并不是這樣的,我們需要對這份json內容稍微處理一下,在其前后分別加上一些字符,效果如下
{ "dashboard": -------導出json的內容放中間-------- , "overwrite": false }
注意:,既然他是模板文件,里面肯定有些東西是變化的,比如說他的title,和host屬性,因此我們得在模板里面做一個標示,比如title部分我們可以用###title### ,方便后面的文本替換,具體可參考我的配置文件
保存之后,也可以拿這個json的內容用postman進行驗證,使用postman能夠正常添加后,我們再使用PHP的curl去實現
4.4 編寫PHP發起請求代碼現在已經確保我們的json數據沒有問題,所以現在使用PHP的curl來創建儀表盤,偽代碼如下:
/** * 通過curl獲取數據 * @param $url * @param bool $isHearder * @param bool $post * @return mixed */ function http_request($url, $isHearder = null, $post = "GET", $data = null, $timeout = 1) { //初始化curl $ch = curl_init($url); //設置URL地址 curl_setopt($ch, CURLOPT_URL, $url); //設置header信息 if (!empty($isHearder)) { curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $isHearder); } //如果是post,則把data的數據傳遞過去 if (($post == "POST") && $data) { #假如data為數組將其轉換為json格式 if (is_array($data)) { $data = json_encode($data); } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } //如果是刪除方法,則是以delete請求 if ($post == "DELETE") { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); } //設置超時時間,毫秒 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout*1000); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //執行CURL時間 $result = curl_exec($ch); //如果有異常,記錄到日志當中 $curl_errno = curl_errno($ch); if ($curl_errno > 0) { LogModel::addlog("超時"); } //關閉URL,返回數據 curl_close($ch); return $result; }五、編寫節點變動事件處理
當上面的操作都完成之后,我們前期的基本工作已經完成了,現在需要做得事情是創建節點的時候調用PHP來發起請求
5.1 新增節點觸發通過api來創建儀表盤的部分偽代碼,prometheus的儀表盤中有一個uid的key,這個key可以由我們自己控制,必須是保證他的唯一性(如果把json模板中的uid項設置為null,prometheus會自動為你生成一個);
我們可以使用節點IP地址的hash值作為他的uid,這樣我們將來在變更儀表盤的時候只要有ip就能得到uid,而無需再次存儲一份,如下面的偽代碼:
/** *創建圖表 * @param $str * @param array $params * @return IlluminateHttpJsonResponse */ public function replaceNodeInfo($ip) { //接收節點觸發事件 $uid = md5($ip); //設置head頭,認證信息 $header = array( "Content-Type:application/json", "Authorization: Bearer eyJrIjoicnhTMklodFMzaDRsUXFoUFFiZ2tSRnQ3TnI4WEVqQlEiLCJuIjoidGFuZ3Fpbmdzb25nIiwiaWQiOjF9" ); //讀取json模板 $jsonstr = $this->readJsonData(); //替換模板中需要替換的位置 $jsonstr = str_replace("###node###", $ip, $jsonstr); $jsonstr = str_replace("###uid###", $uid, $jsonstr); //進行curl請求 http_request("http://192.168.43.34:3000/api/dashboards/db", $header, "POST", $jsonstr); }5.2 檢查效果
當使用PHP的curl請求后,我們可以在grafana的儀表盤管理界面看到使用PHP創建的圖表,當出現下圖的效果則代表成功:
5.3 刪除節點觸發刪除節點的時候,我們對應的儀表盤也沒用了作用,因此我們也要刪除對應的儀表盤,前面我們生產的uid是ip地址的hash值,因此我們刪除的時候也可以取ip對應的hash值,通過這個uid來刪除儀表盤,如下偽代碼:
/** * 刪除node節點視圖信息 * @param Request $req */ public function delNodeViewInfo(Request $req) { //接收參數 $params = $req->all(); $ip = $params["ip"]; $uid = md5($ip); //設置認證信息 $header = array( "Content-Type:application/json", "Authorization: Bearer eyJrIjoicnhTMklodFMzaDRsUXFoUFFiZ2tSRnQ3TnI4WEVqQlEiLCJuIjoidGFuZ3Fpbmdzb25nIiwiaWQiOjF9" ); //執行刪除事件 http_request("http://192.168.43.34:3000/api/dashboards/uid/{$uid}", $header, "DELETE"); }
作者:湯青松
微信:songboy8888
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29187.html
摘要:在和未普及之前,要實現的搭建確實要費一番工夫的,不過現在則很簡單就可以實現的監控了。下載鏡像使用方式下載極為方便,只需要執行如下命令即可,當然前提是需要安裝了。 一、背景 對于LNMP環境下的開發者來說,mysql是非常重要的一環,同時mysql的性能監控也是開發者所需要關注的一環;如果大家使用阿里云的RDS會感覺到其監控功能非常好用,但如果開發者使用的是自建數據庫,該怎么去搭建則需則...
摘要:其他監控類服務管理其他監控類服務管理其他監控類服務管理其他監控類服務還包括等,對這些監控服務的管理方式,均與本篇指南中服務管理的管理方式類似,此處不再過多贅述。 監控類服務管理本篇目錄Prometheus服務管理Grafana服務管理其他監控類服務管理在USDP1.0.0.0版本中,集群監控類服務組件主要有AlterManager、Grafana、InfluxDB、NodeExporter、...
摘要:二可視化是一個開源的圖表可視化系統,簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
摘要:二可視化是一個開源的圖表可視化系統,簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
摘要:二可視化是一個開源的圖表可視化系統,簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
閱讀 2744·2021-10-26 09:50
閱讀 2385·2021-10-11 11:08
閱讀 2128·2019-08-30 15:53
閱讀 1906·2019-08-30 15:44
閱讀 2382·2019-08-28 18:12
閱讀 2520·2019-08-26 13:59
閱讀 2853·2019-08-26 12:19
閱讀 2752·2019-08-26 12:09