摘要:背景在監(jiān)控系統(tǒng)實踐文章當中已經(jīng)實現(xiàn)了我們的第一個監(jiān)控圖表,現(xiàn)在我們有了一個新需求,需要對多個節(jié)點實現(xiàn)不同的監(jiān)控,以及一個匯總的監(jiān)控按照我們之前手動創(chuàng)建儀表盤的方法,每新增一個節(jié)點都需要手動去修改配置,并且需要去系統(tǒng)當中創(chuàng)建一個儀表盤,在節(jié)點
背景
在grafana+ prometheus+php 監(jiān)控系統(tǒng)實踐文章當中已經(jīng)實現(xiàn)了我們的第一個監(jiān)控圖表,現(xiàn)在我們有了一個新需求,需要對多個節(jié)點實現(xiàn)不同的監(jiān)控,以及一個匯總的監(jiān)控;
按照我們之前手動創(chuàng)建儀表盤的方法,每新增一個節(jié)點都需要手動去修改prometheus配置,并且需要去grafana系統(tǒng)當中創(chuàng)建一個儀表盤,在節(jié)點很少的時候這種方式也能滿足,但當節(jié)點數(shù)量多起來的時候,就會增加很大一部分工作量,并且存在每次創(chuàng)建的圖表規(guī)則不一致的風險,因此我們的需求是在新增節(jié)點之后讓grafana自動創(chuàng)建一個儀表盤。
實現(xiàn)過程 操作步驟prometheus調用中間件
中間件收集各節(jié)點數(shù)據(jù)
驗證中間件數(shù)據(jù)有效性
調試儀表盤API接口
編寫節(jié)點變動事件處理
一、prometheus調用中間件 1.修改prometheus配置文件修改配置文件的目的是把之前直接連接單個節(jié)點的地址更改為中間件地址,之前單節(jié)點的uri為"==/api/v1/rrd/metrics==",現(xiàn)在則需要將其修改為中間件地址"==/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二、中間件收集各節(jié)點數(shù)據(jù) 2.1 目的
中間件的作用是將各個節(jié)點的數(shù)據(jù)進行匯總,然后一次性返回給prometheus,實現(xiàn)這個中間件的方式有很多種,在實現(xiàn)之前我們也查找了一些資料,比如有網(wǎng)友用 consul-template+consul方式來實現(xiàn),可參考下方鏈接;不過我覺得這個配置好像也不簡單,而這個中間件的功能還挺簡單的,所以還是自己使用PHP寫了一個中間件。
參考資料:
http://blog.51cto.com/xujpxm/...
拉取所有節(jié)點數(shù)據(jù),這是核心作用
給各節(jié)點加標示,將來用來區(qū)分是哪個節(jié)點的
匯總并輸出,需要一個匯總的儀表盤
2.3 獲取節(jié)點數(shù)據(jù),并添加標示要獲得各個節(jié)點的數(shù)據(jù),name首先獲就得取到所有的節(jié)點列表,然后通過節(jié)點的IP地址來拼接URL,最終通過curl請求該地址來得到節(jié)點數(shù)據(jù);
在獲得數(shù)據(jù)后,我們還小需要給每一個節(jié)點返回的數(shù)據(jù)加上標示可以用{}包括起來,因為prometheus支持這種格式,偽代碼如下:
ip}/api/v1/rrd/metrics"; //3. 獲取數(shù)據(jù) $tmp = file_get_contents($url); //4. 在每個節(jié)點中插入host屬性,到時候用來做篩選單個節(jié)點 $tmp = str_replace(" ", " {host="{$name->ip}"} ", $tmp); $str .= $tmp; }2.4 匯總并輸出
我們的核心需求是需要看到所有節(jié)點的匯總狀況,所以在獲得各個節(jié)點的數(shù)據(jù)后還需要進行累加,prometheus中貌似并直接不支持,所以我們得在中間件總進線累加匯總。
//限制需要進行匯總統(tǒng)計,首先把字符串分割為數(shù)組 $arr = explode(PHP_EOL, $str); $tmpArr = []; //遍歷數(shù)組 foreach ($arr as $val) { //把每一行再次分割 $valArr = explode(" ", $val); //5. 匯總統(tǒng)計 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 輸出最后結果
當中間件處理完成之后,我們需要各個節(jié)點的數(shù)據(jù),并有在數(shù)據(jù)中需要有節(jié)點的標示,另外還需要一個匯總的數(shù)據(jù),因此中間件返回數(shù)據(jù)如下:
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三、驗證中間件數(shù)據(jù)有效性
現(xiàn)在我們的prometheus已經(jīng)啟動,并且中間件也正常運行,那么此時prometheus和Grafana應該都有相應變化,我們可以根據(jù)這寫變化來確定我們前面的處理是否成功。
3.1 prometheus數(shù)據(jù)驗證當我們的配置文件和中間件發(fā)生變化后,最先產生相應變化的應該是數(shù)據(jù)倉庫,所以我們可以打開打開prometheus的web界面,URL地址(http://192.168.43.34:9090/graph)
在篩選中輸入media_network,然后進行篩選,如果能看到多個返回的記錄,則說明驗證成功,如下圖所示。
當prometheus數(shù)據(jù)倉庫的數(shù)據(jù)發(fā)生變化后,grafana的儀表盤也應該會發(fā)生變化,最明顯的變化如下圖所示,標簽都變成了雙份,比如之前的一份“擁堵拉流數(shù)量”變成了雙份。
原因多個節(jié)點返回了多份數(shù)據(jù),而我們使用Grafana繪圖的時候篩選項只輸入了其中的key部分,并沒有篩選里面的屬性,因此有多少個節(jié)點就會有出來多少個項,如果數(shù)量對上了,說明Grafana也驗證成功了。
3.3 設置匯總圖現(xiàn)在我們把之前的儀表盤,重新編輯一下,把之前只篩選了key改成篩選key+上屬性,設置方式如下圖
設置好之后,我們看到的將是匯總的儀表盤,至此我們第一個的核心需求已經(jīng)實現(xiàn)了
3.4 設置節(jié)點模板在設置匯總圖后,我們還將要實現(xiàn)第二個核心需求,自動化創(chuàng)建單節(jié)點的儀表盤,我們首先需要手動先創(chuàng)建一個單個節(jié)點的圖,和第一篇文章的創(chuàng)建方法一致,在設置篩選項的時候,我們填寫的內容要帶上屬性,屬性的作用可以篩選節(jié)點,如下圖:
四、調試儀表盤API接口API官方文檔URL:http://docs.grafana.org/http_...
4.1 創(chuàng)建API接口我們的目標是當新增節(jié)點時grafana能夠自動創(chuàng)建相應的儀表盤,因此需要使用到grafana的API接口,使用之前需要先創(chuàng)建一個密鑰用來授權,創(chuàng)建的流程如下圖:
添加一個api,在keyname中隨便填寫一個名字,然后role選擇admin權限,點擊添加按鈕
當創(chuàng)建成功能看到grafana頁面彈框提示,我們需要把他先復制下來放到一個位置,因為后面是看不見這個key的,如下命令:
使用終端進行訪問測試,如果返回結果如下,則代表這個key可以使用
4.2 使用postman調試現(xiàn)在不要急著取用PHP進行調試,可以先用Postman進行調試,我們需要調試的并不是剛才彈框上面的URL地址,而是創(chuàng)建一個儀表盤的地址,在官方文檔中的請求信息如下:
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 }
當返回如上結果,則說明已經(jīng)創(chuàng)建成功了
4.3 導出模板現(xiàn)在我們需要導出之前創(chuàng)建的一個節(jié)點儀表盤,用來做模板,導出儀表盤的配置方法比較簡單,
把上面的json數(shù)據(jù)保存到 grafana.json文件中,在保存json文件的時候需要注意,導出來的json配置并不能直接使用,因為prometheus創(chuàng)建儀表盤的json格式并不是這樣的,我們需要對這份json內容稍微處理一下,在其前后分別加上一些字符,效果如下
{ "dashboard": -------導出json的內容放中間-------- , "overwrite": false }
注意:,既然他是模板文件,里面肯定有些東西是變化的,比如說他的title,和host屬性,因此我們得在模板里面做一個標示,比如title部分我們可以用###title### ,方便后面的文本替換,具體可參考我的配置文件
保存之后,也可以拿這個json的內容用postman進行驗證,使用postman能夠正常添加后,我們再使用PHP的curl去實現(xiàn)
4.4 編寫PHP發(fā)起請求代碼現(xiàn)在已經(jīng)確保我們的json數(shù)據(jù)沒有問題,所以現(xiàn)在使用PHP的curl來創(chuàng)建儀表盤,偽代碼如下:
/** * 通過curl獲取數(shù)據(jù) * @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的數(shù)據(jù)傳遞過去 if (($post == "POST") && $data) { #假如data為數(shù)組將其轉換為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); //執(zhí)行CURL時間 $result = curl_exec($ch); //如果有異常,記錄到日志當中 $curl_errno = curl_errno($ch); if ($curl_errno > 0) { LogModel::addlog("超時"); } //關閉URL,返回數(shù)據(jù) curl_close($ch); return $result; }五、編寫節(jié)點變動事件處理
當上面的操作都完成之后,我們前期的基本工作已經(jīng)完成了,現(xiàn)在需要做得事情是創(chuàng)建節(jié)點的時候調用PHP來發(fā)起請求
5.1 新增節(jié)點觸發(fā)通過api來創(chuàng)建儀表盤的部分偽代碼,prometheus的儀表盤中有一個uid的key,這個key可以由我們自己控制,必須是保證他的唯一性(如果把json模板中的uid項設置為null,prometheus會自動為你生成一個);
我們可以使用節(jié)點IP地址的hash值作為他的uid,這樣我們將來在變更儀表盤的時候只要有ip就能得到uid,而無需再次存儲一份,如下面的偽代碼:
/** *創(chuàng)建圖表 * @param $str * @param array $params * @return IlluminateHttpJsonResponse */ public function replaceNodeInfo($ip) { //接收節(jié)點觸發(fā)事件 $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創(chuàng)建的圖表,當出現(xiàn)下圖的效果則代表成功:
5.3 刪除節(jié)點觸發(fā)刪除節(jié)點的時候,我們對應的儀表盤也沒用了作用,因此我們也要刪除對應的儀表盤,前面我們生產的uid是ip地址的hash值,因此我們刪除的時候也可以取ip對應的hash值,通過這個uid來刪除儀表盤,如下偽代碼:
/** * 刪除node節(jié)點視圖信息 * @param Request $req */ public function delNodeViewInfo(Request $req) { //接收參數(shù) $params = $req->all(); $ip = $params["ip"]; $uid = md5($ip); //設置認證信息 $header = array( "Content-Type:application/json", "Authorization: Bearer eyJrIjoicnhTMklodFMzaDRsUXFoUFFiZ2tSRnQ3TnI4WEVqQlEiLCJuIjoidGFuZ3Fpbmdzb25nIiwiaWQiOjF9" ); //執(zhí)行刪除事件 http_request("http://192.168.43.34:3000/api/dashboards/uid/{$uid}", $header, "DELETE"); }
作者:湯青松
微信:songboy8888
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/29187.html
摘要:在和未普及之前,要實現(xiàn)的搭建確實要費一番工夫的,不過現(xiàn)在則很簡單就可以實現(xiàn)的監(jiān)控了。下載鏡像使用方式下載極為方便,只需要執(zhí)行如下命令即可,當然前提是需要安裝了。 一、背景 對于LNMP環(huán)境下的開發(fā)者來說,mysql是非常重要的一環(huán),同時mysql的性能監(jiān)控也是開發(fā)者所需要關注的一環(huán);如果大家使用阿里云的RDS會感覺到其監(jiān)控功能非常好用,但如果開發(fā)者使用的是自建數(shù)據(jù)庫,該怎么去搭建則需則...
摘要:其他監(jiān)控類服務管理其他監(jiān)控類服務管理其他監(jiān)控類服務管理其他監(jiān)控類服務還包括等,對這些監(jiān)控服務的管理方式,均與本篇指南中服務管理的管理方式類似,此處不再過多贅述。 監(jiān)控類服務管理本篇目錄Prometheus服務管理Grafana服務管理其他監(jiān)控類服務管理在USDP1.0.0.0版本中,集群監(jiān)控類服務組件主要有AlterManager、Grafana、InfluxDB、NodeExporter、...
摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...
閱讀 2757·2021-10-26 09:50
閱讀 2402·2021-10-11 11:08
閱讀 2139·2019-08-30 15:53
閱讀 1915·2019-08-30 15:44
閱讀 2391·2019-08-28 18:12
閱讀 2532·2019-08-26 13:59
閱讀 2862·2019-08-26 12:19
閱讀 2762·2019-08-26 12:09