You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署副本场景下Prometheus指标采集方案与实践咨询

Flask+Gunicorn+Docker集群监控最佳实践答疑

核心场景概述

当前技术栈为Flask+Gunicorn(2 worker/2线程)+Docker多副本+Nginx,从零搭建Prometheus+Grafana监控体系,需解决多副本指标采集、指标准确性等问题,以下是针对性最佳实践:


1. 当前技术栈重点监控内容

需覆盖应用层、基础设施层、反向代理层三个维度:

  • 应用层:
    • 各接口的QPS、延迟分位值(P50/P95/P99)
    • 各HTTP状态码(2xx/3xx/4xx/5xx)的请求数占比
    • Gunicorn worker存活数、重启次数、请求队列长度
    • Flask内部异常次数、进程级CPU/内存使用率
  • 基础设施层:
    • Docker容器的CPU使用率、内存占用、磁盘IO、网络吞吐
    • 宿主机的CPU、内存、磁盘、网络资源负载
  • 反向代理层:
    • Nginx的总请求量、上游节点请求分布
    • Nginx的连接数、缓存命中率、错误状态码

2. 是否需要采集Nginx的指标?

必须采集。Nginx作为入口反向代理,是全局请求流量的第一观测点:

  • 可验证负载均衡策略是否生效(各Docker副本的请求分配是否均匀)
  • 能排查入口层的性能瓶颈(如连接数耗尽、转发延迟)
  • 补充应用层指标的盲区(比如Nginx返回的400/502等状态码,应用层无法捕获)

3. 正确处理Docker副本的指标采集

不要通过Nginx转发/metrics请求,而是让Prometheus直接发现并抓取每个Docker副本:

实现步骤:

  1. 配置Docker服务发现:在Prometheus配置中启用Docker服务发现,自动识别api服务的所有副本
    scrape_configs:
      - job_name: 'flask_api'
        docker_sd_configs:
          - host: unix:///var/run/docker.sock
            filters:
              - name: label
                values: ["com.docker.compose.service=api"]
        relabel_configs:
          - source_labels: [__meta_docker_container_name]
            target_label: instance
    
  2. 网络访问优化:让Prometheus加入Docker默认网络,直接通过容器内部IP访问/metrics端点;若Prometheus不在Docker网络内,可给api服务添加端口映射(如"8000-8001:8000")
  3. 添加实例标识:通过环境变量给每个容器注入唯一ID,确保指标的instance标签能区分不同副本
    # compose.yml中api服务添加
    environment:
      - INSTANCE_ID=${HOSTNAME}
    

4. prometheus-flask-exporter vs statsd-exporter

两者定位不同,建议结合使用:

  • prometheus-flask-exporter:更适合监控Flask应用层的细粒度指标,比如每个路由的请求量、延迟,配置简单,直接生成Prometheus格式指标,无需中间转发
  • statsd-exporter:更适合监控Gunicorn的底层运行状态,配合gunicorn-statsd插件可获取worker进程数、请求队列长度、连接数等基础设施指标
  • 最佳组合:用prometheus-flask-exporter采集接口业务指标,用statsd-exporter采集Gunicorn运行指标

5. 是否需要启用Multiprocess Mode?

必须启用。Gunicorn的多worker是独立的Python进程,默认情况下每个worker会维护自己的指标数据,导致Prometheus采集到的指标仅属于当前被命中的worker,数据严重失真(比如QPS仅为单个worker的数值)。

启用方法:

  1. 安装依赖:
    poetry add prometheus-client[multiprocess]
    
  2. 在compose.yml的api服务中添加环境变量:
    environment:
      - PROMETHEUS_MULTIPROC_DIR=/tmp/prometheus-multiproc
    
  3. 修改Flask应用的/metrics端点:
    from prometheus_client import multiprocess, CollectorRegistry, generate_latest, CONTENT_TYPE_LATEST
    from flask import Response
    
    @app.route('/metrics')
    def metrics():
        registry = CollectorRegistry()
        multiprocess.MultiProcessCollector(registry)
        return Response(generate_latest(registry), mimetype=CONTENT_TYPE_LATEST)
    
  4. 确保目录权限:在Dockerfile中添加
    RUN mkdir -p /tmp/prometheus-multiproc && chmod 777 /tmp/prometheus-multiproc
    

附原始配置文件

compose.yml

services:
  api:
    image: api-auth-ad
    build: .
    expose:
      - "8000"
    environment:
      - SECRET_KEY=${SECRET_KEY}
      - LDAP_DOMAIN=${LDAP_DOMAIN}
    deploy:
      replicas: 2
      resources:
        limits:
          cpus: "0.75"
          memory: "1gb"
      restart: always

  nginx:
    container_name: api-auth-ad-nginx
    image: nginx:1.27.0
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - api
    restart: always

Dockerfile

FROM python:3.11

WORKDIR /app

COPY pyproject.toml ./

RUN pip install poetry

RUN poetry lock

RUN poetry install --only main

COPY . .

CMD ["poetry", "run", "gunicorn", "--config", "gunicorn_config.py", "src.app:create_app()"]

gunicorn_config.py

workers = 2
threads = 2
bind = "0.0.0.0:8000"
loglevel = "info"
accesslog = "-"
errorlog = "-"
worker_class = "gthread"

nginx.conf

worker_processes  auto;
worker_rlimit_nofile 500000;

events {
    use epoll;
    worker_connections 512;
}

http {
    access_log off;
    error_log /dev/null emerg;

    upstream api_auth {
        server api:8000;
        keepalive 400;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://api_auth;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_intercept_errors off;
        }
        
    }

}

内容的提问来源于stack exchange,提问作者KenaiOz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 17:49:57