keyword Rancher
Prometheus
swoole
docker
docker-compose
Prometheus
特性
Prometheus 是由SoundCloud開發(fā)的開源監(jiān)控報(bào)警系統(tǒng)和時序列數(shù)據(jù)庫(TSDB)。Prometheus使用Go語言開發(fā)撤防,是Google BorgMon監(jiān)控系統(tǒng)的開源版本, 性能也足夠支撐上萬臺規(guī)模集群.
- 多維度數(shù)據(jù)模型
- 靈活的查詢語言
- 不依賴分布式存儲岗照,單個服務(wù)器節(jié)點(diǎn)是自主的
- 通過基于HTTP的pull方式采集時序數(shù)據(jù)
- 可以通過中間網(wǎng)關(guān)進(jìn)行時序列數(shù)據(jù)推送
- 通過服務(wù)發(fā)現(xiàn)或者靜態(tài)配置來發(fā)現(xiàn)目標(biāo)服務(wù)對象
- 支持多種多樣的圖表和界面展示淹遵,比如Grafana等
基本原理
Prometheus 通過使用http協(xié)議周期拉取配置的指標(biāo)項(xiàng)(Metrics), 并將數(shù)據(jù)通過一定規(guī)則整理清洗, 存儲到新的時間序列中. 在本次實(shí)戰(zhàn)中將對業(yè)務(wù)使用的php swoole進(jìn)行核心指標(biāo)監(jiān)控并通過grafana 圖形化工具進(jìn)行輸出展示.
搭建步驟
Prometheus docker本地編排
對于直接在rancher 上部署, 我們可以在本地使用docker-compose 本地編排實(shí)驗(yàn)后進(jìn)行k8s 遠(yuǎn)程部署, 在本地部署使用docker-compose 模擬k8s容器編排, 便于開發(fā)實(shí)驗(yàn).
首先創(chuàng)建一個monitor
文件夾作為此次項(xiàng)目的路徑
$ mkdir monitor && cd monitor
創(chuàng)建prometheus
文件夾, 用來存放我們的監(jiān)控配置文件
$ mkdir prometheus && cd prometheus && touch prometheus.yml
在prometheus.yml
配置文件中添加以下內(nèi)容
global:
scrape_interval: 30s # 全局周期
scrape_configs:
- job_name: 'foo' # 作業(yè)名稱
scrape_interval: 30s # 調(diào)用周期
metrics_path: "/health/metrics" # 調(diào)用路徑
static_configs:
- targets: ['foo.com:80'] # 遠(yuǎn)程服務(wù)地址
在上面的配置文件中我們指明了foo這個監(jiān)控作業(yè), 并指定運(yùn)行周期30s, 每次調(diào)用地址為 foo.com:80/health/metrics這個接口地址. 具體這個接口我們應(yīng)該如何輸出數(shù)據(jù), 下邊會具體提到.
在monitor
文件夾根路徑創(chuàng)建docker-compose.yml
文件
$ touch docker-compose.yml
并加入以下內(nèi)容
version: '2'
services:
prometheus:
container_name: prometheus # 容器名稱
image: prom/prometheus # 鏡像名稱
networks: # 共享網(wǎng)絡(luò)
- foo
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml # 將本地配置文件,掛載到目標(biāo)容器/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 服務(wù)后啟動
networks:
- foo
environment:
GF_SECURITY_ADMIN_USER: ${GRAFANA_USERNAME} # grafana 用戶名(變量)
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
networks: # 定義外部網(wǎng)絡(luò), 便于服務(wù)間訪問
foo:
external: true
此處重點(diǎn)說明一下 prometheus 服務(wù)中command 選項(xiàng)中的配置書寫問題, 因?yàn)?prom/prometheus鏡像已經(jīng)有程序入口并已經(jīng)配置--config.file
和--web.enable-admin-api
, 此時我們只需要追加啟動命令的web.enable-lifecycle
表示開啟服務(wù)熱更新監(jiān)控配置, 如果只寫最后,會導(dǎo)致前邊兩項(xiàng)無配置, 服務(wù)將會缺少配置而無法啟動.
Swoole 接口
在Swoole 項(xiàng)目中, 編寫接口/health/metrics/ 內(nèi)容如下:
$server = new Swoole\Http\Server("127.0.0.1", 80); // 此處只是展示$server對象類型, 具體server對象需從當(dāng)前項(xiàng)目框架中進(jìn)行獲取, 不要自己再次實(shí)例化.
$metrics = $server->stats();
foreach ($metrics as $k => $v) {
echo sprintf("%s %s\n", $k, $v);
}
echo "# 協(xié)程狀態(tài)\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
# 協(xié)程狀態(tài)
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
具體參數(shù)含義可自行查看Swoole 文檔獲取詳細(xì)解釋.
開啟監(jiān)控服務(wù)
進(jìn)入monitor
目錄, 執(zhí)行docker-compose up -d
, 此時可能會提示外部網(wǎng)絡(luò)不存在, 按照提示進(jìn)行創(chuàng)建即可. 當(dāng)服務(wù)啟動完成后訪問 http://127.0.0.1:9090 可看到Prometheus Web界面.
訪問 http://127.0.0.1:9090/targets
此時 Prometheus
服務(wù)已經(jīng)正常監(jiān)控
訪問 http://127.0.0.1:3000/ 點(diǎn)擊 Add data source
, 選擇Prometheus為數(shù)據(jù)源
在HTTP URL 一項(xiàng)中輸入 http://prometheus:9090 ,因?yàn)楸镜厝萜魇褂昧讼嗤木W(wǎng)絡(luò), 可以直接使用服務(wù)名稱進(jìn)行服務(wù)訪問.
點(diǎn)擊grafana Home, New dashboard, Chose Visualization
, 選擇 Graph
點(diǎn)擊 queries
, 選中Query
為 Prometheus
在A 中Metrics
添加指標(biāo)項(xiàng), 可使用Legend
增加指標(biāo)項(xiàng)說明,點(diǎn)擊Add Query 可在一張圖表中繪制多個指標(biāo)折線.至此本地部署已完成.
Rancher K8S 部署
rancher 中部署也是一樣的, 唯一的區(qū)別就是, 使用rancher 作為容器編排工具. 打開rancher, 并點(diǎn)擊部署服務(wù)
填寫鏡像為 prom/prometheus, 并配置數(shù)據(jù)卷, 為的將監(jiān)控配置yml文件進(jìn)行掛載容器.此處掛載使用可參照rancher 文檔.
在命令中加入 --config.file=/etc/prometheus/prometheus.yml --web.enable-admin-api --web.enable-lifecycle
點(diǎn)擊最下方啟動按鈕, 并配置工作負(fù)載中負(fù)載均衡
此時通過本地訪問grafana.google.com 即可訪問對應(yīng)服務(wù), 若無公網(wǎng)dns, 則需本地修改 /etc/hosts.
后續(xù)可按照本地搭建模式相同配置grafana, 本文不再重復(fù)贅述.