Docker环境下Prometheus无法访问Actuator端点问题求助
问题描述
在Docker环境部署Prometheus容器后,无法从其他服务连接到/actuator/prometheus端点,出现两种错误:
Get "http://notification-service:8080/actuator/prometheus": dial tcp 172.24.0.13:8080: connect: connection refused
或者:
server returned HTTP status 404
另外,直接用容器IP发起curl请求时,初始返回404错误,但几分钟后能正常响应。
相关配置示例
docker-compose.yml 片段
services: ticket-service: container_name: ticket-service image: <docker_hub_nick>/ticket-service:latest environment: - SPRING_PROFILES_ACTIVE=docker - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres-ticket:5431/ticket_service depends_on: - postgres-ticket - broker - zipkin - discovery-server - api-gateway prometheus: image: prom/prometheus:latest container_name: prometheus restart: always ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml depends_on: - bet-service - ticket-service - chat-service - notification-service - wallet-service
ticket-service 的 properties 配置
spring.application.name=ticket-service management.health.circuitbreakers.enabled=true management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always
prometheus.yml 配置
global: scrape_interval: 1m evaluation_interval: 30s scrape_timeout: 1m external_labels: monitor: 'easywin-monitor' scrape_configs: - job_name: 'ticket_service' metrics_path: '/actuator/prometheus' static_configs: - targets: ['ticket-service:8080'] labels: application: 'Ticket Service'
解决方案
1. 修复服务启动顺序问题
depends_on仅保证容器启动顺序,不确保依赖服务完全就绪。Prometheus可能在Spring Boot服务初始化完成前就开始抓取,导致连接拒绝或404。
- 给Prometheus添加启动延迟脚本,修改
command:prometheus: # ...其他配置 command: ["sh", "-c", "sleep 60 && /bin/prometheus --config.file=/etc/prometheus/prometheus.yml"] - 或者使用
wait-for-it工具检测依赖服务端点就绪后再启动Prometheus
2. 验证Spring Boot端点暴露配置
- 确认
docker环境对应的配置文件(如application-docker.properties)中包含完整的端点配置:management.endpoints.web.exposure.include=* management.endpoint.prometheus.enabled=true - 检查服务启动日志,确认
/actuator/prometheus端点已注册,搜索类似日志:Exposing X endpoint(s) beneath base path '/actuator',需包含prometheus
3. 检查Docker网络连通性
- 进入Prometheus容器,执行
ping ticket-service确认DNS解析正常 - 执行
curl http://ticket-service:8080/actuator查看所有可用端点,确认prometheus存在 - 若DNS解析异常,为所有服务指定同一自定义网络:
networks: app-network: driver: bridge services: ticket-service: # ...其他配置 networks: - app-network prometheus: # ...其他配置 networks: - app-network
4. 调整Prometheus抓取配置
- 缩短
scrape_timeout(如改为10s),避免因服务初始化慢导致超时 - 添加重试和健康检查配置,仅当服务就绪后再抓取:
scrape_configs: - job_name: 'ticket_service' metrics_path: '/actuator/prometheus' scrape_timeout: 10s static_configs: - targets: ['ticket-service:8080'] labels: application: 'Ticket Service' retry_config: max_retries: 3 retry_interval: 30s health_checks: - http_get: path: '/actuator/health' port: 8080 interval: 30s timeout: 10s
5. 检查Spring Boot服务启动状态
- 查看ticket-service启动日志,确认数据库、注册中心等依赖服务已完全就绪,避免服务处于"启动中"状态时端点未激活
内容的提问来源于stack exchange,提问作者dr34mer
相关产品推荐
相关产品推荐

