keyword Rancher
Prometheus
swoole
docker
docker-compose
php
Prometheus 是由SoundCloud開發的開源監控報警系統和時序列數據庫(TSDB)。Prometheus使用Go語言開發,是Google BorgMon監控系統的開源版本, 性能也足夠支撐上萬臺規模集羣.web
Prometheus 經過使用http協議週期拉取配置的指標項(Metrics), 並將數據經過必定規則整理清洗, 存儲到新的時間序列中. 在本次實戰中將對業務使用的php swoole進行核心指標監控並經過grafana 圖形化工具進行輸出展現.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 項目中, 編寫接口/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界面.
訪問 http://127.0.0.1:9090/targets
此時 Prometheus
服務已經正常監控
訪問 http://127.0.0.1:3000/ 點擊 Add data source
, 選擇Prometheus爲數據源
在HTTP URL 一項中輸入 http://prometheus:9090 ,由於本地容器使用了相同的網絡, 能夠直接使用服務名稱進行服務訪問.
點擊grafana Home, New dashboard, Chose Visualization
, 選擇 Graph
點擊 queries
, 選中Query
爲 Prometheus
在A 中Metrics
添加指標項, 可以使用Legend
增長指標項說明,點擊Add Query 可在一張圖表中繪製多個指標折線.至此本地部署已完成.
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, 本文再也不重複贅述.
$ curl -X POST 'http://grafana.google.com/-/reload'
複製代碼