Prometheus 是當前一套非常流行的開源監控和報警系統,於 2016 年加入了 Clound Native Computing Foundation,是繼 kubernates 之後的第二個託管項目。
本文講述如何使用 docker 快速搭建 prometheus 監控系統。
概覽
本文的實驗環境爲 Mac OS,監控系統主要是用來監控兩臺 CentOS 主機資源使用情況。搭建的監控系統包括以下軟件:
- prometheus:負責收集和存儲時間序列數據
- node-exporter:負責暴露主機 metrics 數據給 prometheus
- grafana:負責展示數據
它們的關係如下圖所示:
node-exporter
爲方便操作,我們先創建 prometheus
目錄,用於存放此次實驗的文件,例如,筆者創建的目錄爲 ~/code/docker/prometheus
。
Node-exporter (下文簡稱 exporter)官方文檔不建議使用 docker 來安裝 exporter,本文爲了實驗的便捷,通過在一個 centos 容器運行 exporter 來驗證其使用方法。
生產環境下,可以直接在主機上安裝 exporter。
從鏈接 https://prometheus.io/download/#node_exporter 下載 exporter,解壓,文件夾改名爲 node_exporter
,並放置在 prometheus
目錄下。
爲使用 docker 運行 exporter,需要安裝好 docker 和 docker-compose。
運行 exporter 的 docker-compose.yml
文件如下:
version: '3'
services:
centos1:
image: centos
container_name: centos1
restart: always
ports:
- "9101:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
centos2:
image: centos
container_name: centos2
restart: always
ports:
- "9102:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
啓動兩個 centos 容器,每個容器都運行 exporter,用於生成 prometheus 所需要主機 metrics。
exporter 啓動的默認端口是 9100,爲了在外部訪問,我們將其分別映射爲 9101 和 9102 端口。
爲了在 centos 容器內部執行 exporter,我們使用 bind mount 的方式,並使用 command
來執行 exporter。
執行 docker-compose up -d
,成功啓動容器 centos1
和 centos2
,打開瀏覽器,輸入地址 http://127.0.0.1:9101/metrics
和 http://127.0.0.1:9102/metrics
可以看到 metrics 輸出。
prometheus
在 prometheus
目錄下創建 prometheus
目錄,用於存放 prometheus 的配置文件 prometheus.yml
。創建 prometheus.yml
文件如下:
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
- job_name: 'linux-exporter'
metrics_path: /metrics
static_configs:
- targets: ['centos1:9100', 'centos2:9100']
global
是全局的配置,scrape_interval
用於設置每次數據收集的間隔爲 5 秒。
scrape_configs
用於配置數據收集的信息,這裏我們配置了兩個 job,一個用於收集 prometheus 自身的 metrics,一個用於收集上面我們啓動的兩個 centos 容器的 metrics。
在配置 targets
地址時,我們需要使用 docker-compose.yml
中容器名稱來代替相應的 ip 地址,這種使用方式也在文章《Docker Compose 入門教程》中使用過。
添加上 prometheus 的 docker-compose.yml
文件如下:
version: '3'
services:
centos1:
image: centos
container_name: centos1
restart: always
ports:
- "9101:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
centos2:
image: centos
container_name: centos2
restart: always
ports:
- "9102:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- ~/code/docker/prometheus/prometheus:/etc/prometheus
- ~/code/docker/prometheus/prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
爲了退出容器後可以保存數據,我們使用了 bind mount 的方式,將 prometheus 保存 TSDB 目錄映射到本地的 prometheus_data
目錄。
執行 docker-compose up -d
後,打開瀏覽器,輸入地址 http://127.0.0.1:9090/targets
,可以看到 兩個 centos 容器 targets 的狀態都爲 UP 狀態,說明 prometheus 可以正常獲取 exporter 的數據。
grafana
在 prometheus
目錄下創建 grafana_data
目錄,用於保存 grafana 的數據。本實驗完整的目錄結構如下圖所示:
添加上 grafana 的 docker-compose.yml
文件如下:
version: '3'
services:
centos1:
image: centos
container_name: centos1
restart: always
ports:
- "9101:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
centos2:
image: centos
container_name: centos2
restart: always
ports:
- "9102:9100"
volumes:
- ~/code/docker/prometheus/node_exporter:/root
command: /root/node_exporter
prometheus:
image: prom/prometheus
container_name: prometheus
restart: always
ports:
- "9090:9090"
volumes:
- ~/code/docker/prometheus/prometheus:/etc/prometheus
- ~/code/docker/prometheus/prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
grafana:
image: grafana/grafana
container_name: grafana
restart: always
ports:
- "3000:3000"
volumes:
- ~/code/docker/prometheus/grafana_data:/var/lib/grafana
啓動 docker-compose 後,打開瀏覽器,輸入地址 http://127.0.0.1:3000
,輸入用戶名 admin 和密碼 admin,登錄進 grafana。
我們先添加 data source:
注意輸入的 prometheus 地址爲 http://prometheus:9090
。
接下來可以創建新的 dashboard,例如,我們創建一個顯示5 分鐘內負載的 dashboard:
編輯完成,保存,顯示效果:
除了自己創建 dashboard,也可以利用別人已完成的 dashborad。
在地址 https://grafana.com/grafana/dashboards 可以看到可以使用的 dashboard。這裏我們選擇 dashboard id 爲 8918 的 dashboard,並導入到 grafana:
輸入 8919,保存後,可以看到顯示效果:
參考資料
- https://github.com/prometheus/prometheus
- https://juejin.im/post/5d54bc80f265da03a6531063
- https://www.cnblogs.com/xiao987334176/p/9930517.html
- https://prometheus.io/docs/prometheus/latest/installation/
- https://github.com/vegasbrianc/prometheus/blob/master/docker-compose.yml
- https://juejin.im/post/5c9dc0b06fb9a070ae3da6e7
- https://prometheus.fuckcloudnative.io/di-san-zhang-prometheus/storage
- https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html