使用 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_1prod_2prod_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