使用 Prometheus 如何监控扩展的 Docker 服务,其中每个实例都提供自己的 /metrics?
With Prometheus how to monitor a scaled Docker service where each instance serves its own /metrics?
我有一个 Prometheus 设置,用于监控我自己的服务公开的指标。这适用于单个实例,但一旦我开始缩放它们,Prometheus 就会完全混淆并开始跟踪不正确的值。
所有服务都运行在单个节点上,通过docker-compose。
这是 scrape_configs
中的工作:
- job_name: 'wowanalyzer'
static_configs:
- targets: ['prod:8000']
prod
的每个实例都在其内存中跟踪指标并在 /metrics
上提供服务。我猜普罗米修斯每次报废时都会选择一个随机容器,这会导致记录的计数大幅增加,并随着时间的推移而增加。相反,我希望 Prometheus 同时读取所有实例的 /metrics
,而不管当时活动的实例数量如何。
我试了很多东西来帮助我们解决这个问题,但它看起来是一个未解决的问题。
因此,我决定创建这个工具来帮助我们进行此服务发现。
https://github.com/juliofalbo/docker-compose-prometheus-service-discovery
欢迎贡献和提出问题!
docker-gen (https://github.com/jwilder/docker-gen) 就是为此目的开发的。
您需要创建一个 sidecart 容器 运行 docker-gen 来生成一组新的目标。
如果我没记错的话,生成的主机名是 prod_1
、prod_2
、prod_X
等
您可以使用 DNS 服务发现功能。例如:
docker-compose.yml
:
version: "3"
services:
myapp:
image: appimage:v1
restart: always
networks:
- back
prometheus:
image: "prom/prometheus:v2.32.1"
container_name: "prometheus"
restart: "always"
ports: [ "9090:9090" ]
volumes:
- "./prometheus.yml:/etc/prometheus/prometheus.yml"
- "prometheus_data:/prometheus"
networks:
- back
prometheus.yml
样本:
global:
scrape_interval: 15s
evaluation_interval: 60s
scrape_configs:
- job_name: 'monitoringjob'
dns_sd_configs:
- names: [ 'myapp' ] <-- service name from docker-compose
type: 'A'
port: 8080
metrics_path: '/actuator/prometheus'
您可以从该网络中的任何容器使用 nslookup util 检查您的 DNS 记录:
docker exec -it myapp bash
bash-4.2# yum install bind-utils
bash-4.2# nslookup myapp
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: myapp
Address: 172.22.0.2
Name: myapp
Address: 172.22.0.7
我有一个 Prometheus 设置,用于监控我自己的服务公开的指标。这适用于单个实例,但一旦我开始缩放它们,Prometheus 就会完全混淆并开始跟踪不正确的值。
所有服务都运行在单个节点上,通过docker-compose。
这是 scrape_configs
中的工作:
- job_name: 'wowanalyzer'
static_configs:
- targets: ['prod:8000']
prod
的每个实例都在其内存中跟踪指标并在 /metrics
上提供服务。我猜普罗米修斯每次报废时都会选择一个随机容器,这会导致记录的计数大幅增加,并随着时间的推移而增加。相反,我希望 Prometheus 同时读取所有实例的 /metrics
,而不管当时活动的实例数量如何。
我试了很多东西来帮助我们解决这个问题,但它看起来是一个未解决的问题。
因此,我决定创建这个工具来帮助我们进行此服务发现。
https://github.com/juliofalbo/docker-compose-prometheus-service-discovery
欢迎贡献和提出问题!
docker-gen (https://github.com/jwilder/docker-gen) 就是为此目的开发的。
您需要创建一个 sidecart 容器 运行 docker-gen 来生成一组新的目标。
如果我没记错的话,生成的主机名是 prod_1
、prod_2
、prod_X
等
您可以使用 DNS 服务发现功能。例如:
docker-compose.yml
:
version: "3"
services:
myapp:
image: appimage:v1
restart: always
networks:
- back
prometheus:
image: "prom/prometheus:v2.32.1"
container_name: "prometheus"
restart: "always"
ports: [ "9090:9090" ]
volumes:
- "./prometheus.yml:/etc/prometheus/prometheus.yml"
- "prometheus_data:/prometheus"
networks:
- back
prometheus.yml
样本:
global:
scrape_interval: 15s
evaluation_interval: 60s
scrape_configs:
- job_name: 'monitoringjob'
dns_sd_configs:
- names: [ 'myapp' ] <-- service name from docker-compose
type: 'A'
port: 8080
metrics_path: '/actuator/prometheus'
您可以从该网络中的任何容器使用 nslookup util 检查您的 DNS 记录:
docker exec -it myapp bash
bash-4.2# yum install bind-utils
bash-4.2# nslookup myapp
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: myapp
Address: 172.22.0.2
Name: myapp
Address: 172.22.0.7