grafana+ prometheus+php 監控系統實踐

grafana+ prometheus+php 監控系統實踐

來自專欄 PHP技術大全15 人贊了文章

背景

團隊在開發流媒體服務,需要實現一個監控在線人數的功能,可以看到歷史有多少人在線,當前有多少人在線的功能。

如果用mysql等關係型資料庫來實現,可以用事件記錄日誌,然後通過PHP加上一些繪圖的插件來實現,但這種方式並不好,首先用關係型資料庫隨著時間累積,會存在數據量越來越大,導致查詢緩慢,再者需要編寫這部分統計代碼,因此並不是最佳選擇。

我們很快找到了一個「時序性資料庫」(prometheus),這種資料庫會以時間節點來記錄我們要存儲的數據,然後結合他的一些繪圖功能,我們完全可以不用寫繪圖的邏輯,而且prometheus還提供數據收集的功能,我們只需要把需要統計的數據按照固定的格式傳遞就好了。而Grafana是一個專門繪圖的,支持很多種數據源,比如mysql,prometheus,es等資料庫,繪圖功能特彆強大,因此我們便使用了這兩種軟體的結合實現了一個監控功能。

實現過程

兩個工具都是英文的,如果英文和我一樣不怎麼好,建議使用谷歌瀏覽器的網頁翻譯功能,可以節省很多時間

操作步驟:

  1. 安裝
  2. 數據收集
  3. 收集驗證
  4. 繪圖配置
  5. 完成

一、安裝

1. Grafana

官方安裝文檔:grafana.com/grafana/dow

mac下安裝

brew install grafana

docker安裝

docker run -d --name=grafana -p 3000:3000 grafana/grafana

2. prometheus

官方安裝文檔:prometheus.io/docs/prom

配置文件

在安裝之前我們先建立好配置文件,讓安裝後可以直接啟動,配置文件的模板在官方文檔中有,下面是我使用的配置文件,也可以直接使用,記得把配置文件的(#後面的內容刪除)

---global: #全局配置 scrape_interval: 5s #5秒鐘收集一次數據 scrape_timeout: 3s #連接超時時間scrape_configs: #子配置- job_name: media # 任務名稱為media scrape_interval: 3s # 3秒鐘收集一次數據 metrics_path: "/api/v1/rrd/metrics" # 收集數據的URI static_configs: #子項配置 - targets: [gslb.offcncloud.com:8080] #收集數據的目標主機以及埠

mac下安裝

brew install prometheus

docker安裝

(注意配置文件得我們先建好才能運行下面的命令)

docker run -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

二、數據收集

1. 解惑

在第一步我們安裝prometheus的時候就建立了一個配置文件,其中有一個任務會去收集數據,主機名為(gslb.offcncloud.com:8080),URI地址為(/api/v1/rrd/metrics),因此會不斷向 gslb.offcncloud.com:8080 進行請求,來獲取數據。

2. 數據格式

這個時候我們需要來了解這個數據的格式是怎麼樣的,先來看一段我返回的數據格式。

media_network 2media_connectNum 12 media_on_push 2

在上面有三行數據,每條數據分別代表不同的key => value ,中間使用空格隔開。比如:- 第一個media_network是代表當前的網路延時數量,

- 第二項media_connectNum則是代表當前的用戶連接數,

- 第三項media_on_push 則是代表當前的推流人數。

3. 數據來源

上面的這寫數據是怎麼得來的呢?其實我們的系統當中並不能直接獲取到當前的數量,比如連接人數,但是我們可以通過一些日誌或者事件來進行統計,比如當有一個人播放視頻,那麼我們將會在cache中給他+1,當他離線的時候我們則會給他-1,這樣便可以得到數量,我們可以來看下下面的偽代碼

事件觸發計數的代碼部分

<?php /** * 計數 * @param string $name network|connectNum 要統計的名稱 * @param bool $type 上線還是離線 * @param bool $clean 是否每次清空 * @return int|string */ public static function count(string $name, $type = true { //定義名稱 $name = addslashes($name); $fileName = self::BASEDATA . $name ; //定義累加值 $addNum = $type ? 1 : -1; //更新次數 $num = "cat $fileName"; $num = intval(exec($num)) + $addNum; //連接數不能小於0 $num = ($num < 0) ? 0 : $num; $cmd = "echo $num > $fileName"; exec($cmd); return $num; }

prometheus來收集數據的對應代碼部分

public static function getCountNum() { $control_arr = [network, connectNum, on_push]; self::createDir(); foreach ($control_arr as $path) { //存放臨時數據文件 $tmp_file = self::BASEDATA . $path; $num = exec("cat $tmp_file"); switch ($path) { case network://網路延時數量 system("echo 0 > $tmp_file"); echo "media_{$path} $num" . PHP_EOL; break; case connectNum://連接數 echo "media_{$path} $num" . PHP_EOL; break; case on_push://推流數 echo "media_{$path} $num" . PHP_EOL; break; } } }

在計數部分代碼會根據用戶是上線還是下線來處理不同的邏輯,比如上線數量會+1,下線則會-1

在獲取數據部分,會根據不同的類型來處理他的邏輯,比如網路延時數量,會在獲取數據後清空為0,而連接數則不在這個位置進行清空

三、數據驗證

  1. 前言

經過前面兩個步驟,如果是docker安裝應該已經啟動了,如果是mac安裝啟動命令為(注意配置文件路徑):

prometheus --config.file=/tmp/prometheus.yml

  1. 驗證收集地址正確性

當啟動之後,可以打開瀏覽器訪問如下URL地址:

http://127.0.0.1:9090/targets

如上圖,上面沒有綠色的說明連接地址配置成功了,此時prometheus會不斷的收集數據

  1. 驗證數據格式

接著要驗證數據格式是否正確,打開URL地址

http://127.0.0.1:9090/graph?g0.range_input=1h&g0.expr=&g0.tab=0

如果能看到我們在代碼裡面返回的key,便說明數據收集對接成功了

四、繪圖配置

  1. 簡介

繪圖時候我們採用Grafana來進行,因此我們首先得啟動它,如果使用docker安裝時,此時應該已經啟動起來了,如果是mac系統的brew安裝,啟動命令為

brew services start Grafana

在啟動之後,我們打開瀏覽器,訪問URL地址為:

http://192.168.43.34:3000/

可以在界面中看到登錄框,默認的賬號以及密碼為 admin admin

  1. 對接數據源

進來之後首先需要進行配置數據來源,數據源的配置如下圖

點擊保存按鈕,進行保存並驗證,如果沒有提示異常說明已經成功了。

  1. 進行繪圖

現在已經有數據源了,那我們需要把這些數據展示為圖表就很簡單了,點擊頁面中很明顯的+號,創建儀錶盤,選擇graph,如下圖

接著變回出現一個圖表,但是沒有任何效果,所以我們需要編輯這個走勢圖,如下圖所示

接著下方便會出現圖表的配置項,這裡我們可以選擇數據源,如下圖

選擇數據源之後,我們需要選擇使用哪一個欄位,並把這個欄位改為設置一個中文名稱,同時這裡可以設置多個欄位,如下圖

配置好之後一定要保存!

完成

  1. 查看效果

限制我們將可以看到效果,如下圖

作者:湯青松

微信:songboy8888

推薦閱讀:

TAG:PHP | Prometheus監控 | grafana |