grafana+ prometheus+php 監控系統實踐
來自專欄 PHP技術大全15 人贊了文章
背景
團隊在開發流媒體服務,需要實現一個監控在線人數的功能,可以看到歷史有多少人在線,當前有多少人在線的功能。
如果用mysql等關係型資料庫來實現,可以用事件記錄日誌,然後通過PHP加上一些繪圖的插件來實現,但這種方式並不好,首先用關係型資料庫隨著時間累積,會存在數據量越來越大,導致查詢緩慢,再者需要編寫這部分統計代碼,因此並不是最佳選擇。我們很快找到了一個「時序性資料庫」(prometheus),這種資料庫會以時間節點來記錄我們要存儲的數據,然後結合他的一些繪圖功能,我們完全可以不用寫繪圖的邏輯,而且prometheus還提供數據收集的功能,我們只需要把需要統計的數據按照固定的格式傳遞就好了。而Grafana是一個專門繪圖的,支持很多種數據源,比如mysql,prometheus,es等資料庫,繪圖功能特彆強大,因此我們便使用了這兩種軟體的結合實現了一個監控功能。
實現過程
兩個工具都是英文的,如果英文和我一樣不怎麼好,建議使用谷歌瀏覽器的網頁翻譯功能,可以節省很多時間
操作步驟:
- 安裝
- 數據收集
- 收集驗證
- 繪圖配置
- 完成
一、安裝
1. Grafana
官方安裝文檔:https://grafana.com/grafana/download
mac下安裝
brew install grafana
docker安裝
docker run -d --name=grafana -p 3000:3000 grafana/grafana
2. prometheus
官方安裝文檔:https://prometheus.io/docs/prometheus/latest/installation/
配置文件
在安裝之前我們先建立好配置文件,讓安裝後可以直接啟動,配置文件的模板在官方文檔中有,下面是我使用的配置文件,也可以直接使用,記得把配置文件的(#後面的內容刪除)
---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的時候就建立了一個配置文件,其中有一個任務會去收集數據,主機名為(http://gslb.offcncloud.com:8080),URI地址為(/api/v1/rrd/metrics),因此會不斷向 http://gslb.offcncloud.com:8080/api/v1/rrd/metrics 進行請求,來獲取數據。
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,而連接數則不在這個位置進行清空
三、數據驗證
- 前言
經過前面兩個步驟,如果是docker安裝應該已經啟動了,如果是mac安裝啟動命令為(注意配置文件路徑):
prometheus --config.file=/tmp/prometheus.yml
- 驗證收集地址正確性
當啟動之後,可以打開瀏覽器訪問如下URL地址:
http://127.0.0.1:9090/targets
如上圖,上面沒有綠色的說明連接地址配置成功了,此時prometheus會不斷的收集數據
- 驗證數據格式
接著要驗證數據格式是否正確,打開URL地址
http://127.0.0.1:9090/graph?g0.range_input=1h&g0.expr=&g0.tab=0
如果能看到我們在代碼裡面返回的key,便說明數據收集對接成功了
四、繪圖配置
- 簡介
繪圖時候我們採用Grafana來進行,因此我們首先得啟動它,如果使用docker安裝時,此時應該已經啟動起來了,如果是mac系統的brew安裝,啟動命令為
brew services start Grafana
在啟動之後,我們打開瀏覽器,訪問URL地址為:
http://192.168.43.34:3000/
可以在界面中看到登錄框,默認的賬號以及密碼為 admin admin
- 對接數據源
進來之後首先需要進行配置數據來源,數據源的配置如下圖
點擊保存按鈕,進行保存並驗證,如果沒有提示異常說明已經成功了。
- 進行繪圖
現在已經有數據源了,那我們需要把這些數據展示為圖表就很簡單了,點擊頁面中很明顯的+號,創建儀錶盤,選擇graph,如下圖
接著變回出現一個圖表,但是沒有任何效果,所以我們需要編輯這個走勢圖,如下圖所示
接著下方便會出現圖表的配置項,這裡我們可以選擇數據源,如下圖
選擇數據源之後,我們需要選擇使用哪一個欄位,並把這個欄位改為設置一個中文名稱,同時這裡可以設置多個欄位,如下圖
配置好之後一定要保存!
完成
- 查看效果
限制我們將可以看到效果,如下圖
作者:湯青松
微信:songboy8888
推薦閱讀:
TAG:PHP | Prometheus監控 | grafana |