无法通过AWS Distro for OpenTelemetry采集Spring Boot应用指标
ECS Fargate中ADOT采集Spring Boot Actuator/Prometheus接口返回404问题排查
将Spring Boot应用部署在AWS ECS Fargate集群,以Sidecar方式部署ADOT Collector容器,计划通过ADOT采集ECS指标和Spring应用的Prometheus指标(应用在8080端口暴露/actuator/prometheus接口),并导入Amazon Managed Service for Prometheus。但ADOT采集Spring应用接口时返回404 Not Found错误,尽管接口实际存在。
相关配置
ADOT Collector配置(adot.config.yaml)
receivers: prometheus: config: global: scrape_interval: 15s scrape_timeout: 10s scrape_configs: - job_name: "prometheus" static_configs: - targets: [ 0.0.0.0:9090 ] - job_name: "my-spring-app" metrics_path: "actuator/prometheus" static_configs: - targets: [ 0.0.0.0:8080 ] awsecscontainermetrics: collection_interval: 10s processors: filter: metrics: include: match_type: strict metric_names: - ecs.task.memory.utilized - ecs.task.memory.reserved - ecs.task.cpu.utilized - ecs.task.cpu.reserved - ecs.task.network.rate.rx - ecs.task.network.rate.tx - ecs.task.storage.read_bytes - ecs.task.storage.write_bytes exporters: prometheusremotewrite: endpoint: https://xxx/remote_write auth: authenticator: sigv4auth logging: loglevel: info extensions: health_check: pprof: endpoint: :1888 zpages: endpoint: :55679 sigv4auth: region: us-west-2 service: aps assume_role: arn: sts_region: eu-west-2 service: extensions: [pprof, zpages, health_check, sigv4auth] telemetry: logs: level: debug pipelines: metrics: receivers: [prometheus] exporters: [logging, prometheusremotewrite] metrics/ecs: receivers: [awsecscontainermetrics] processors: [filter] exporters: [logging, prometheusremotewrite]
ECS任务定义
{ "family": "adot-prom", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "adot-collector", "image": "account_id.dkr.ecr.region.amazonaws.com/image-tag", "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/ecs-adot-collector", "awslogs-region": "my-region", "awslogs-stream-prefix": "ecs", "awslogs-create-group": "True" } } }, { "name": "prometheus", "image": "prom/prometheus:main", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/ecs-prom", "awslogs-region": "my-region", "awslogs-stream-prefix": "ecs", "awslogs-create-group": "True" } } }, { "name": "my-spring-app", "image": "ecr repo url", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/ecs-app", "awslogs-region": "my-region", "awslogs-stream-prefix": "app", "awslogs-create-group": "True" }, "portMappings": [{ "containerPort": 8080 }] } } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "1024" }
错误信息
debug scrape/scrape.go:1353 Scrape failed {"kind": "receiver", "name": "prometheus", "data_type": "metrics", "scrape_pool": "prometheus", "target": "http://0.0.0.0:8080/actuator/prometheus", "error": "server returned HTTP status 404 Not Found", "errorVerbose": "server returned HTTP status 404 Not Found\ngithub.com/prometheus/prometheus/scrape.(*targetScraper).scrape\n\tgithub.com/prometheus/prometheus@v0.43.0/scrape/scrape.go:817\ngithub.com/prometheus/prometheus/scrape.(*scrapeLoop).scrapeAndReport\n\tgithub.com/prometheus/prometheus@v0.43.0/scrape/scrape.go:1340\ngithub.com/prometheus/prometheus/scrape.(*scrapeLoop).run\n\tgithub.com/prometheus/prometheus@v0.43.0/scrape/scrape.go:1264\nruntime.goexit\n\truntime/asm_amd64.s:1598"}
问题排查与解决方案
1. 修正容器间访问目标(核心修复)
在ECS Fargate的awsvpc网络模式下,同一任务内的容器共享网络命名空间,但0.0.0.0指向ADOT Collector容器自身的端口,而非Spring应用容器的端口。需将目标地址改为Spring应用的容器名称:
修改ADOT配置中my-spring-app任务的target:
- job_name: "my-spring-app" metrics_path: "actuator/prometheus" static_configs: - targets: [ "my-spring-app:8080" ]
2. 验证Spring应用接口可用性
进入ADOT Collector容器内部,执行curl命令测试连通性:
curl http://my-spring-app:8080/actuator/prometheus
若返回404,需检查:
- Spring应用是否引入依赖:确保
spring-boot-starter-actuator和micrometer-registry-prometheus已添加到项目依赖 - Spring配置是否正确暴露端点:
management.endpoints.web.exposure.include=prometheus management.endpoint.prometheus.enabled=true
3. 检查容器启动状态
- 查看Spring应用日志,确认是否正常启动并监听8080端口(日志中应有
Tomcat started on port(s): 8080字样) - 确认任务定义中Spring应用的
containerPort配置为8080,无需映射到主机端口(同一任务内容器直接通过容器端口访问)
4. 清理无效配置
ADOT配置中针对0.0.0.0:9090的Prometheus任务无效(任务中Prometheus容器未暴露9090端口),可删除该配置以避免冗余错误日志。
内容的提问来源于stack exchange,提问作者Abhi.G
相关产品推荐
相关产品推荐

