介紹如何使用Prometheus的dns service discovery機制,自動發現並抓取Docker swarm overlay網絡中的容器所提供的指標。
使用docker service create
/docker stack deploy
能夠很方便管理多個docker host,並且對應用做擴縮容。那麼我們如何抓取這些動態創建的容器應用所提供的指標呢?
在《使用Prometheus+Grafana監控JVM》一文裏我們使用了static_config
靜態配置指標抓取目標,這顯然在docker swarm環境裏是不合適的。我們需要一種動態發現容器的方法。
解決思路如下:
- 使用《一種生產環境Docker Overlay Network的配置方案》提到的方法配置overlay網絡,並且把docker service、stack、standalone container都掛到這個overlay網絡裏。
- 把Prometheus也掛到這個overlay網絡裏。
- 使用Prometheus的DNS service discovery機制,半自動的發現容器。
本文所提到的腳本可以在這裏下載
下面構建一個實驗環境以說明方法。
第一步:構建overlay network
根據《一種生產環境Docker Overlay Network的配置方案》裏提到的方法,創建Docker swarm,和一個overlay網絡,名字叫做test-overlay
:
docker network create -d overlay --attachable test-overlay
第二步:啓動容器
爲了方便起見,使用prometheus-mock-data來模擬一個提供指標的應用,這樣就能夠避免繁瑣的jmx-exporter。
1) 新建一個目錄,名字叫做docker-swarm-demo
2) 新建一個文件scrape-data.txt
,這個文件就是我們要提供的假指標,內容如下:
# HELP x mock metric
# TYPE x gauge
x 1
---
# HELP x mock metric
# TYPE x gauge
x 2
---
# HELP x mock metric
# TYPE x gauge
x 3
---
# HELP x mock metric
# TYPE x gauge
x 4
3) 爲了演示docker service和standalone container都能被採集到,會啓動這兩種形式的容器:
4) 使用docker service create
啓動一個service,replicas=3(注意--name
參數):
docker service create \
--name mock \
--replicas 3 \
--network test-overlay \
--limit-memory 96M \
--mount type=bind,src=$(pwd)/scrape-data.txt,dst=/home/java-app/etc/scrape-data.txt \
chanjarster/prometheus-mock-data:latest
4) 使用docker run
啓動一個standalone container(注意--name
參數):
docker run -d \
-v $(pwd)/scrape-data.txt:/home/java-app/etc/scrape-data.txt \
--network test-overlay \
--name standalone-mock \
chanjarster/prometheus-mock-data:latest
第三步:啓動Prometheus
1) 在之前新建目錄docker-swarm-demo裏創建文件prom-config.yml
,內容如下:
scrape_configs:
- job_name: 'swarm-service'
scrape_interval: 30s
dns_sd_configs:
- names:
- tasks.mock
- standalone-mock
type: A
port: 8080
relabel_configs:
- source_labels: ['__meta_dns_name']
target_label: 'service'
注意到上面的兩個關鍵配置:
- 設定了兩個DNS A記錄,
tasks.mock
和standalone-mock
。
tasks.mock
是Docker自動爲docker service mock
創建的,而standalone-mock
就是容器名。文章最開始說到的半自動就是這個意思,我們得事先知道DNS A記錄有哪些,然後讓Prometheus去發現這些DNS A記錄背後對應的容器有哪些。
- 把
__meta_dns_name
的值設置到指標的service
這個label裏。
2) 啓動Prometheus:
docker run -d \
--name=prometheus \
--network test-overlay \
-p 9090:9090 \
-v $(pwd):/prometheus-config \
-v $(pwd)/prom-data:/prometheus \
prom/prometheus --config.file=/prometheus-config/prom-config.yml
3) 訪問 http://localhost:9090 看看Prometheus是否啓動成功,在輸入框裏輸入x然後執行,應該可以看到如下圖的結果:
其中3個instance是屬於tasks.mock
的,還有一個則是standalone container(如果沒有看到4個instance,那麼等一會兒再試)。