成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Grafana+prometheus+php 自動創(chuàng)建監(jiān)控圖

idealcn / 2205人閱讀

摘要:背景在監(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/...

2.2 中間件需要的效果:

拉取所有節(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,然后進行篩選,如果能看到多個返回的記錄,則說明驗證成功,如下圖所示。

3.2 Grafana數(shù)據(jù)驗證

當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

相關文章

  • grafana+prometheus快速搭建MySql監(jiān)控系統(tǒng)實踐

    摘要:在和未普及之前,要實現(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ù)庫,該怎么去搭建則需則...

    AdolphLWQ 評論0 收藏0
  • 監(jiān)控類服務管理 智能大數(shù)據(jù)平臺 USDP

    摘要:其他監(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、...

    ernest.wang 評論0 收藏2270
  • 容器監(jiān)控實踐—Prometheus數(shù)據(jù)可視化

    摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...

    URLOS 評論0 收藏0
  • 容器監(jiān)控實踐—Prometheus數(shù)據(jù)可視化

    摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...

    趙連江 評論0 收藏0
  • 容器監(jiān)控實踐—Prometheus數(shù)據(jù)可視化

    摘要:二可視化是一個開源的圖表可視化系統(tǒng),簡單說圖表配置比較方便生成的圖表比較漂亮。 一. 概述 Prometheus自帶了一個web服務,包括一個默認的dashboard,可以使用表達式查詢并進行圖表可視化,默認服務的地址為:http://prometheus_ip:9090 如下圖: showImg(https://segmentfault.com/img/remote/14600000...

    dayday_up 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<