亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

idealcn / 2286人閱讀

摘要:背景在監(jiān)控系統(tǒng)實(shí)踐文章當(dāng)中已經(jīng)實(shí)現(xiàn)了我們的第一個(gè)監(jiān)控圖表,現(xiàn)在我們有了一個(gè)新需求,需要對(duì)多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)不同的監(jiān)控,以及一個(gè)匯總的監(jiān)控按照我們之前手動(dòng)創(chuàng)建儀表盤的方法,每新增一個(gè)節(jié)點(diǎn)都需要手動(dòng)去修改配置,并且需要去系統(tǒng)當(dāng)中創(chuàng)建一個(gè)儀表盤,在節(jié)點(diǎn)

背景

在grafana+ prometheus+php 監(jiān)控系統(tǒng)實(shí)踐文章當(dāng)中已經(jīng)實(shí)現(xiàn)了我們的第一個(gè)監(jiān)控圖表,現(xiàn)在我們有了一個(gè)新需求,需要對(duì)多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)不同的監(jiān)控,以及一個(gè)匯總的監(jiān)控;

按照我們之前手動(dòng)創(chuàng)建儀表盤的方法,每新增一個(gè)節(jié)點(diǎn)都需要手動(dòng)去修改prometheus配置,并且需要去grafana系統(tǒng)當(dāng)中創(chuàng)建一個(gè)儀表盤,在節(jié)點(diǎn)很少的時(shí)候這種方式也能滿足,但當(dāng)節(jié)點(diǎn)數(shù)量多起來的時(shí)候,就會(huì)增加很大一部分工作量,并且存在每次創(chuàng)建的圖表規(guī)則不一致的風(fēng)險(xiǎn),因此我們的需求是在新增節(jié)點(diǎn)之后讓grafana自動(dòng)創(chuàng)建一個(gè)儀表盤。

實(shí)現(xiàn)過程 操作步驟

prometheus調(diào)用中間件

中間件收集各節(jié)點(diǎn)數(shù)據(jù)

驗(yàn)證中間件數(shù)據(jù)有效性

調(diào)試儀表盤API接口

編寫節(jié)點(diǎn)變動(dòng)事件處理

一、prometheus調(diào)用中間件 1.修改prometheus配置文件

修改配置文件的目的是把之前直接連接單個(gè)節(jié)點(diǎn)的地址更改為中間件地址,之前單節(jié)點(diǎn)的uri為"==/api/v1/rrd/metrics==",現(xiàn)在則需要將其修改為中間件地址"==/api/v1/rrd/toolSpool==",因此新的配置文件內(nèi)容如下:

---
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 重新啟動(dòng)prometheus

當(dāng)修改完配置文件之后,還需要讓其配置文件生效,所以需要將prometheus重新啟動(dòng)。

docker重啟

docker本身就提供重啟命令,所以只需要輸入如下命令就可以了,注意后面是容器的名稱。

docker restart prometheus

mac下重啟

mac下重啟比較簡單,首先終止之前的任務(wù),然后使用啟動(dòng)命令

prometheus --config.file=/tmp/prometheus.yml
二、中間件收集各節(jié)點(diǎn)數(shù)據(jù) 2.1 目的

中間件的作用是將各個(gè)節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行匯總,然后一次性返回給prometheus,實(shí)現(xiàn)這個(gè)中間件的方式有很多種,在實(shí)現(xiàn)之前我們也查找了一些資料,比如有網(wǎng)友用 consul-template+consul方式來實(shí)現(xiàn),可參考下方鏈接;不過我覺得這個(gè)配置好像也不簡單,而這個(gè)中間件的功能還挺簡單的,所以還是自己使用PHP寫了一個(gè)中間件。
參考資料:
http://blog.51cto.com/xujpxm/...

2.2 中間件需要的效果:

拉取所有節(jié)點(diǎn)數(shù)據(jù),這是核心作用

給各節(jié)點(diǎn)加標(biāo)示,將來用來區(qū)分是哪個(gè)節(jié)點(diǎn)的

匯總并輸出,需要一個(gè)匯總的儀表盤

2.3 獲取節(jié)點(diǎn)數(shù)據(jù),并添加標(biāo)示

要獲得各個(gè)節(jié)點(diǎn)的數(shù)據(jù),name首先獲就得取到所有的節(jié)點(diǎn)列表,然后通過節(jié)點(diǎn)的IP地址來拼接URL,最終通過curl請(qǐng)求該地址來得到節(jié)點(diǎn)數(shù)據(jù);

在獲得數(shù)據(jù)后,我們還小需要給每一個(gè)節(jié)點(diǎn)返回的數(shù)據(jù)加上標(biāo)示可以用{}包括起來,因?yàn)閜rometheus支持這種格式,偽代碼如下:

ip}/api/v1/rrd/metrics";
        //3. 獲取數(shù)據(jù)
        $tmp = file_get_contents($url);
        //4. 在每個(gè)節(jié)點(diǎn)中插入host屬性,到時(shí)候用來做篩選單個(gè)節(jié)點(diǎn)
        $tmp = str_replace(" ", " {host="{$name->ip}"} ", $tmp);
        $str .= $tmp;
    }
2.4 匯總并輸出

我們的核心需求是需要看到所有節(jié)點(diǎn)的匯總狀況,所以在獲得各個(gè)節(jié)點(diǎn)的數(shù)據(jù)后還需要進(jìn)行累加,prometheus中貌似并直接不支持,所以我們得在中間件總進(jìn)線累加匯總。

    //限制需要進(jìn)行匯總統(tǒng)計(jì),首先把字符串分割為數(shù)組
    $arr = explode(PHP_EOL, $str);
    $tmpArr = [];
    //遍歷數(shù)組
    foreach ($arr as $val) {
        //把每一行再次分割
        $valArr = explode(" ", $val);
        //5. 匯總統(tǒng)計(jì)
        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é)果

當(dāng)中間件處理完成之后,我們需要各個(gè)節(jié)點(diǎn)的數(shù)據(jù),并有在數(shù)據(jù)中需要有節(jié)點(diǎn)的標(biāo)示,另外還需要一個(gè)匯總的數(shù)據(jù),因此中間件返回?cái)?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
三、驗(yàn)證中間件數(shù)據(jù)有效性

現(xiàn)在我們的prometheus已經(jīng)啟動(dòng),并且中間件也正常運(yùn)行,那么此時(shí)prometheus和Grafana應(yīng)該都有相應(yīng)變化,我們可以根據(jù)這寫變化來確定我們前面的處理是否成功。

3.1 prometheus數(shù)據(jù)驗(yàn)證

當(dāng)我們的配置文件和中間件發(fā)生變化后,最先產(chǎn)生相應(yīng)變化的應(yīng)該是數(shù)據(jù)倉庫,所以我們可以打開打開prometheus的web界面,URL地址(http://192.168.43.34:9090/graph)
在篩選中輸入media_network,然后進(jìn)行篩選,如果能看到多個(gè)返回的記錄,則說明驗(yàn)證成功,如下圖所示。

3.2 Grafana數(shù)據(jù)驗(yàn)證

當(dāng)prometheus數(shù)據(jù)倉庫的數(shù)據(jù)發(fā)生變化后,grafana的儀表盤也應(yīng)該會(huì)發(fā)生變化,最明顯的變化如下圖所示,標(biāo)簽都變成了雙份,比如之前的一份“擁堵拉流數(shù)量”變成了雙份。

原因多個(gè)節(jié)點(diǎn)返回了多份數(shù)據(jù),而我們使用Grafana繪圖的時(shí)候篩選項(xiàng)只輸入了其中的key部分,并沒有篩選里面的屬性,因此有多少個(gè)節(jié)點(diǎn)就會(huì)有出來多少個(gè)項(xiàng),如果數(shù)量對(duì)上了,說明Grafana也驗(yàn)證成功了。

3.3 設(shè)置匯總圖

現(xiàn)在我們把之前的儀表盤,重新編輯一下,把之前只篩選了key改成篩選key+上屬性,設(shè)置方式如下圖

設(shè)置好之后,我們看到的將是匯總的儀表盤,至此我們第一個(gè)的核心需求已經(jīng)實(shí)現(xiàn)了

3.4 設(shè)置節(jié)點(diǎn)模板

在設(shè)置匯總圖后,我們還將要實(shí)現(xiàn)第二個(gè)核心需求,自動(dòng)化創(chuàng)建單節(jié)點(diǎn)的儀表盤,我們首先需要手動(dòng)先創(chuàng)建一個(gè)單個(gè)節(jié)點(diǎn)的圖,和第一篇文章的創(chuàng)建方法一致,在設(shè)置篩選項(xiàng)的時(shí)候,我們填寫的內(nèi)容要帶上屬性,屬性的作用可以篩選節(jié)點(diǎn),如下圖:

四、調(diào)試儀表盤API接口

API官方文檔URL:http://docs.grafana.org/http_...

4.1 創(chuàng)建API接口

我們的目標(biāo)是當(dāng)新增節(jié)點(diǎn)時(shí)grafana能夠自動(dòng)創(chuàng)建相應(yīng)的儀表盤,因此需要使用到grafana的API接口,使用之前需要先創(chuàng)建一個(gè)密鑰用來授權(quán),創(chuàng)建的流程如下圖:

添加一個(gè)api,在keyname中隨便填寫一個(gè)名字,然后role選擇admin權(quán)限,點(diǎn)擊添加按鈕

當(dāng)創(chuàng)建成功能看到grafana頁面彈框提示,我們需要把他先復(fù)制下來放到一個(gè)位置,因?yàn)楹竺媸强床灰娺@個(gè)key的,如下命令:

使用終端進(jìn)行訪問測試,如果返回結(jié)果如下,則代表這個(gè)key可以使用

4.2 使用postman調(diào)試

現(xiàn)在不要急著取用PHP進(jìn)行調(diào)試,可以先用Postman進(jìn)行調(diào)試,我們需要調(diào)試的并不是剛才彈框上面的URL地址,而是創(chuàng)建一個(gè)儀表盤的地址,在官方文檔中的請(qǐ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請(qǐng)求截圖

{
    "id": 23,
    "slug": "production-overview",
    "status": "success",
    "uid": "ID2FFcciz",
    "url": "/d/ID2FFcciz/production-overview",
    "version": 1
}

當(dāng)返回如上結(jié)果,則說明已經(jīng)創(chuàng)建成功了

4.3 導(dǎo)出模板

現(xiàn)在我們需要導(dǎo)出之前創(chuàng)建的一個(gè)節(jié)點(diǎn)儀表盤,用來做模板,導(dǎo)出儀表盤的配置方法比較簡單,

把上面的json數(shù)據(jù)保存到 grafana.json文件中,在保存json文件的時(shí)候需要注意,導(dǎo)出來的json配置并不能直接使用,因?yàn)閜rometheus創(chuàng)建儀表盤的json格式并不是這樣的,我們需要對(duì)這份json內(nèi)容稍微處理一下,在其前后分別加上一些字符,效果如下

{
  "dashboard": 
  -------導(dǎo)出json的內(nèi)容放中間--------
  ,
  "overwrite": false
}

注意:,既然他是模板文件,里面肯定有些東西是變化的,比如說他的title,和host屬性,因此我們得在模板里面做一個(gè)標(biāo)示,比如title部分我們可以用###title### ,方便后面的文本替換,具體可參考我的配置文件

保存之后,也可以拿這個(gè)json的內(nèi)容用postman進(jìn)行驗(yàn)證,使用postman能夠正常添加后,我們?cè)偈褂肞HP的curl去實(shí)現(xiàn)

4.4 編寫PHP發(fā)起請(qǐng)求代碼

現(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);

    //設(shè)置URL地址
    curl_setopt($ch, CURLOPT_URL, $url);

    //設(shè)置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ù)組將其轉(zhuǎn)換為json格式
        if (is_array($data)) {
            $data = json_encode($data);
        }
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    //如果是刪除方法,則是以delete請(qǐng)求
    if ($post == "DELETE") {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
    }

    //設(shè)置超時(shí)時(shí)間,毫秒
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $timeout*1000);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //執(zhí)行CURL時(shí)間
    $result = curl_exec($ch);

    //如果有異常,記錄到日志當(dāng)中
    $curl_errno = curl_errno($ch);
    if ($curl_errno > 0) {
        LogModel::addlog("超時(shí)");
    }

    //關(guān)閉URL,返回?cái)?shù)據(jù)
    curl_close($ch);
    return $result;
}
五、編寫節(jié)點(diǎn)變動(dòng)事件處理

當(dāng)上面的操作都完成之后,我們前期的基本工作已經(jīng)完成了,現(xiàn)在需要做得事情是創(chuàng)建節(jié)點(diǎn)的時(shí)候調(diào)用PHP來發(fā)起請(qǐng)求

5.1 新增節(jié)點(diǎn)觸發(fā)

通過api來創(chuàng)建儀表盤的部分偽代碼,prometheus的儀表盤中有一個(gè)uid的key,這個(gè)key可以由我們自己控制,必須是保證他的唯一性(如果把json模板中的uid項(xiàng)設(shè)置為null,prometheus會(huì)自動(dòng)為你生成一個(gè));

我們可以使用節(jié)點(diǎn)IP地址的hash值作為他的uid,這樣我們將來在變更儀表盤的時(shí)候只要有ip就能得到uid,而無需再次存儲(chǔ)一份,如下面的偽代碼:

/**
 *創(chuàng)建圖表
 * @param $str
 * @param array $params
 * @return IlluminateHttpJsonResponse
 */
public function replaceNodeInfo($ip)
{
    //接收節(jié)點(diǎn)觸發(fā)事件
    $uid = md5($ip);
    
    //設(shè)置head頭,認(rèn)證信息
    $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);

    //進(jìn)行curl請(qǐng)求
    http_request("http://192.168.43.34:3000/api/dashboards/db", $header, "POST", $jsonstr);
}
5.2 檢查效果

當(dāng)使用PHP的curl請(qǐng)求后,我們可以在grafana的儀表盤管理界面看到使用PHP創(chuàng)建的圖表,當(dāng)出現(xiàn)下圖的效果則代表成功:

5.3 刪除節(jié)點(diǎn)觸發(fā)

刪除節(jié)點(diǎn)的時(shí)候,我們對(duì)應(yīng)的儀表盤也沒用了作用,因此我們也要?jiǎng)h除對(duì)應(yīng)的儀表盤,前面我們生產(chǎn)的uid是ip地址的hash值,因此我們刪除的時(shí)候也可以取ip對(duì)應(yīng)的hash值,通過這個(gè)uid來刪除儀表盤,如下偽代碼:

/**
 * 刪除node節(jié)點(diǎn)視圖信息
 * @param Request $req
 */
public function delNodeViewInfo(Request $req)
{
    //接收參數(shù)
    $params = $req->all();
    $ip = $params["ip"];
    $uid = md5($ip);
    
    //設(shè)置認(rèn)證信息
    $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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29187.html

相關(guān)文章

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

    摘要:在和未普及之前,要實(shí)現(xiàn)的搭建確實(shí)要費(fèi)一番工夫的,不過現(xiàn)在則很簡單就可以實(shí)現(xiàn)的監(jiān)控了。下載鏡像使用方式下載極為方便,只需要執(zhí)行如下命令即可,當(dāng)然前提是需要安裝了。 一、背景 對(duì)于LNMP環(huán)境下的開發(fā)者來說,mysql是非常重要的一環(huán),同時(shí)mysql的性能監(jiān)控也是開發(fā)者所需要關(guān)注的一環(huán);如果大家使用阿里云的RDS會(huì)感覺到其監(jiān)控功能非常好用,但如果開發(fā)者使用的是自建數(shù)據(jù)庫,該怎么去搭建則需則...

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

    摘要:其他監(jiān)控類服務(wù)管理其他監(jiān)控類服務(wù)管理其他監(jiān)控類服務(wù)管理其他監(jiān)控類服務(wù)還包括等,對(duì)這些監(jiān)控服務(wù)的管理方式,均與本篇指南中服務(wù)管理的管理方式類似,此處不再過多贅述。 監(jiān)控類服務(wù)管理本篇目錄Prometheus服務(wù)管理Grafana服務(wù)管理其他監(jiān)控類服務(wù)管理在USDP1.0.0.0版本中,集群監(jiān)控類服務(wù)組件主要有AlterManager、Grafana、InfluxDB、NodeExporter、...

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

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

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

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

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

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

    dayday_up 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<