基於Rancher k8s部署Prometheus 監控swoole項目核心指標實戰

keyword Rancher Prometheus swoole docker docker-composephp

Prometheus

特性

Prometheus 是由SoundCloud開發的開源監控報警系統和時序列數據庫(TSDB)。Prometheus使用Go語言開發,是Google BorgMon監控系統的開源版本, 性能也足夠支撐上萬臺規模集羣.web

  • 多維度數據模型
  • 靈活的查詢語言
  • 不依賴分佈式存儲,單個服務器節點是自主的
  • 經過基於HTTP的pull方式採集時序數據
  • 能夠經過中間網關進行時序列數據推送
  • 經過服務發現或者靜態配置來發現目標服務對象
  • 支持多種多樣的圖表和界面展現,好比Grafana等

基本原理

Prometheus 經過使用http協議週期拉取配置的指標項(Metrics), 並將數據經過必定規則整理清洗, 存儲到新的時間序列中. 在本次實戰中將對業務使用的php swoole進行核心指標監控並經過grafana 圖形化工具進行輸出展現.docker

搭建步驟

Prometheus docker本地編排

對於直接在rancher 上部署, 咱們能夠在本地使用docker-compose 本地編排實驗後進行k8s 遠程部署, 在本地部署使用docker-compose 模擬k8s容器編排, 便於開發實驗.數據庫

首先建立一個monitor文件夾做爲這次項目的路徑api

$ mkdir monitor && cd monitor
複製代碼

建立prometheus文件夾, 用來存放咱們的監控配置文件bash

$ mkdir prometheus && cd prometheus && touch prometheus.yml
複製代碼

prometheus.yml配置文件中添加如下內容服務器

global:
 scrape_interval:     30s # 全局週期
scrape_configs:
- job_name: 'foo' # 做業名稱
 scrape_interval: 30s # 調用週期
 metrics_path: "/health/metrics" # 調用路徑
 static_configs:
 - targets: ['foo.com:80'] # 遠程服務地址
複製代碼

在上面的配置文件中咱們指明瞭foo這個監控做業, 並指定運行週期30s, 每次調用地址爲 foo.com:80/health/metrics這個接口地址. 具體這個接口咱們應該如何輸出數據, 下邊會具體提到.swoole

monitor文件夾根路徑建立docker-compose.yml文件網絡

$ touch docker-compose.yml
複製代碼

並加入如下內容負載均衡

version: '2'
services:
 prometheus:
 container_name: prometheus # 容器名稱
 image: prom/prometheus # 鏡像名稱
 networks: # 共享網絡
 - foo
 volumes:
 - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml # 將本地配置文件,掛載到目標容器/etc/prometheus/prometheus.yml位置
 ports:
 - '9090:9090'
 command:
 - '--config.file=/etc/prometheus/prometheus.yml'
 - '--web.enable-admin-api'
 - '--web.enable-lifecycle' # 支持配置文件熱更新

 grafana:
 container_name: grafana
 image: grafana/grafana:6.4.3
 ports:
 - '3000:3000'
 depends_on:
 - prometheus # 依賴 prometheus 服務後啓動
 networks:
 - foo
 environment:
 GF_SECURITY_ADMIN_USER: ${GRAFANA_USERNAME} # grafana 用戶名(變量)
 GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}

networks: # 定義外部網絡, 便於服務間訪問
 foo:
 external: true
複製代碼

此處重點說明一下 prometheus 服務中command 選項中的配置書寫問題, 由於 prom/prometheus鏡像已經有程序入口並已經配置--config.file--web.enable-admin-api, 此時咱們只須要追加啓動命令的web.enable-lifecycle表示開啓服務熱更新監控配置, 若是隻寫最後,會致使前邊兩項無配置, 服務將會缺乏配置而沒法啓動.

Swoole 接口

在Swoole 項目中, 編寫接口/health/metrics/ 內容以下:

$server = new Swoole\Http\Server("127.0.0.1", 80); // 此處只是展現$server對象類型, 具體server對象需從當前項目框架中進行獲取, 不要本身再次實例化.
$metrics = $server->stats();
 foreach ($metrics as $k => $v) {
     echo sprintf("%s %s\n", $k, $v);
 }
 echo "# 協程狀態\n";

 $metrics = Swoole\Coroutine::stats();
 foreach ($metrics as $k => $v) {
     echo sprintf("%s %s\n", $k, $v);
 }
複製代碼

訪問 http://127.0.0.1:80/health/metrics/ 將會有如下輸出

start_time 1573612504
connection_num 1
accept_count 7
close_count 6
worker_num 2
idle_worker_num 1
tasking_num 0
request_count 10
worker_request_count 0
worker_dispatch_count 11
coroutine_num 1
# 協程狀態
event_num 2
signal_listener_num 0
aio_task_num 0
c_stack_size 2097152
coroutine_num 1
coroutine_peak_num 1
coroutine_last_cid 3
複製代碼

具體參數含義可自行查看Swoole 文檔獲取詳細解釋.

開啓監控服務

進入monitor目錄, 執行docker-compose up -d, 此時可能會提示外部網絡不存在, 按照提示進行建立便可. 當服務啓動完成後訪問 http://127.0.0.1:9090 可看到Prometheus Web界面.

Prometheus 主界面

訪問 http://127.0.0.1:9090/targets

已監控列表

此時 Prometheus服務已經正常監控

訪問 http://127.0.0.1:3000/ 點擊 Add data source, 選擇Prometheus爲數據源

Grafana 添加數據源

在HTTP URL 一項中輸入 http://prometheus:9090 ,由於本地容器使用了相同的網絡, 能夠直接使用服務名稱進行服務訪問.

Grafana 保存數據源並測試鏈接性

點擊grafana Home, New dashboard, Chose Visualization, 選擇 Graph

選擇可視化方式

點擊 queries, 選中QueryPrometheus

配置顯示項

在A 中Metrics添加指標項, 可以使用Legend增長指標項說明,點擊Add Query 可在一張圖表中繪製多個指標折線.至此本地部署已完成.

Rancher K8S 部署

rancher 中部署也是同樣的, 惟一的區別就是, 使用rancher 做爲容器編排工具. 打開rancher, 並點擊部署服務

rancher 主頁

填寫鏡像爲 prom/prometheus, 並配置數據卷, 爲的將監控配置yml文件進行掛載容器.此處掛載使用可參照rancher 文檔.

在命令中加入 --config.file=/etc/prometheus/prometheus.yml --web.enable-admin-api --web.enable-lifecycle

添加啓動命令

點擊最下方啓動按鈕, 並配置工做負載中負載均衡

配置負載均衡

此時經過本地訪問grafana.google.com 便可訪問對應服務, 若無公網dns, 則需本地修改 /etc/hosts.

後續可按照本地搭建模式相同配置grafana, 本文再也不重複贅述.

Prometheus 配置文件熱更新

$ curl -X POST 'http://grafana.google.com/-/reload'
複製代碼
相關文章
相關標籤/搜索