在springboot4中使用ADOT的agent注入集成cwagent发送数据和追踪

参考资料

本次使用的示例项目为OpenTelemetry with Spring Boot 4.0 Demo

启动cwagent并开启otel收集功能

cloudwatch agent本质上是一个定制的otel collector,在启动时会将cwagent的配置文件转换为otel collector的配置。我们在本地启动使用以下cloudwatch agent配置开启otel的收集能力

  • metrics_collected,开启通过otel收集指标
  • traces_collected,开启通过otel收集追踪
json 复制代码
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "metrics": {
    "metrics_collected": {
      "otlp": {
        "grpc_endpoint": "0.0.0.0:4317",
        "http_endpoint": "0.0.0.0:4318"
      }
    },
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    }
  },
  "traces": {
    "traces_collected": {
      "otlp": {
        "grpc_endpoint": "0.0.0.0:4317",
        "http_endpoint": "0.0.0.0:4318"
      }
    }
  }
}

使用compose挂载配置文件并启动cwagent

yaml 复制代码
services:
  cloudwatch-agent:
    image: 'amazon/cloudwatch-agent:latest'
    ports:
      - '4317:4317'
      - '4318:4318'
    volumes:
      - ./cw-agent-config.json:/etc/cwagentconfig/config.json:ro
    environment:
      - AWS_REGION=cn-north-1

启动日志如下,可见已经成功监听4318端口。应用程序将遥测数据发送到此端点,CloudWatch 代理则将其转发到 X-Ray 和 CloudWatch。

在springboot中开启OpenTelemetry

在springboot中集成OpenTelemetry 的方式有如下三种

  • OpenTelemetry Java Agent - Zero code changes but can have version compatibility issues
  • Third-party OpenTelemetry Starter - From the OTel project, but pulls in alpha dependencies
  • Spring Boot Starter (this demo)--- - Official Spring support, stable, well-integrated

为了集成cwagent,我们需要关闭Spring Boot 的 OpenTelemetry 自动配置,转而通过 ADOT 代理的方式注入

yaml 复制代码
spring:
  application:
    name: ot

# 禁用 Spring Boot 的 OpenTelemetry 自动配置,避免与 Java Agent 冲突
management:
  opentelemetry:
    enabled: false
  tracing:
    sampling:
      probability: 1.0

为什么选择 ADOT 代理而不是社区的 OTel 代理?如下是两者的比较

Feature Community Agent ADOT Agent
X-Ray trace ID format
AWS resource detection Basic Enhanced
Application Signals

下载agent jar文件

shell 复制代码
wget https://github.com/aws-observability/aws-otel-java-instrumentation/releases/latest/download/aws-opentelemetry-agent.jar

使用如下命令启动应用

shell 复制代码
export AWS_ADOT_JAVA_INSTRUMENTATION_PATH="aws-opentelemetry-agent.jar"

JAVA_TOOL_OPTIONS="-javaagent:$AWS_ADOT_JAVA_INSTRUMENTATION_PATH" \
OTEL_METRICS_EXPORTER="none" \
OTEL_LOGS_EXPORTER="none" \
OTEL_TRACES_EXPORTER="otlp" \
OTEL_TRACES_SAMPLER="always_on" \
OTEL_PROPAGATORS="tracecontext,baggage,xray" \
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4318/v1/traces" \
OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf" \
java -jar /home/ec2-user/ot/target/ot-0.0.1.jar

启动后尝试访问应用,观察trace控制台可以捕获

但是cwagent报错如下

  • 警告:某些单位无法转换
  • 错误:某些分布指标(distribution metrics)没有条目,如 http.server.requests

检查应用日志发现如下内容。这是由于spring-boot-starter-opentelemetry会引入Micrometer OTLP Registry - Micrometer 的 OTLP 导出器,会自动创建OtlpMeterRegistry并自动导出指标到http://localhost:4318/v1/metrics

shell 复制代码
2026-01-20T06:11:11.030Z  INFO 32635 --- [ot] [main] [] i.m.c.instrument.push.PushMeterRegistry  : Publishing metrics for OtlpMeterRegistry every 1m to http://localhost:4318/v1/metrics with resource attributes {service.name=ot}

因此,我们在application.yaml中禁用 Micrometer OTLP meter registry,使用 Java Agent 采集所有可观测性数据,避免干扰

yaml 复制代码
  otlp:
    metrics:
      export:
        enabled: false

将OTEL_METRICS_EXPORTER修改为OTLP,即使用 OTLP 协议将指标数据发送到配置的后端端点

shell 复制代码
export AWS_ADOT_JAVA_INSTRUMENTATION_PATH="/home/ec2-user/ot/aws-opentelemetry-agent.jar"

JAVA_TOOL_OPTIONS="-javaagent:$AWS_ADOT_JAVA_INSTRUMENTATION_PATH" \
OTEL_METRICS_EXPORTER="otlp" \
OTEL_LOGS_EXPORTER="none" \
OTEL_TRACES_EXPORTER="otlp" \
OTEL_TRACES_SAMPLER="always_on" \
OTEL_PROPAGATORS="tracecontext,baggage,xray" \
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4318/v1/traces" \
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT="http://localhost:4318/v1/metrics" \
OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf" \
java -jar /home/ec2-user/ot/target/ot-0.0.1.jar

指标也同样能够收集成功

其他同类库的问题

那么什么时候选择OpenTelemetry Starter?

  • 实现供应商无关的可观测性(轻松切换后端)
  • 跨服务的分布式追踪是优先事项
  • 更倾向于基于推送的遥测

什么时候选择Actuator?

  • Actuator 用于健康/就绪检查
  • OTel 用于遥测
相关推荐
SNOWPIAOP1 天前
Claude Code + CCR + AWS Bedrock 踩坑复盘:上下文超限、模型路由、Mantle 端点与 Qwen3 Coder Next
云计算·claude·aws·上下文·ccr
Flynt3 天前
AWS WorkMail + App Runner:服务退役时的迁移检查清单
app·aws
zhojiew4 天前
AWS云上ECS托管控制器场景服务部署策略实践和原理
云计算·aws
yunson_Liu4 天前
AWS EKS创建EFS存储类
云计算·aws
TG_yunshuguoji4 天前
亚马逊云代理商:如何在AWS上部署Hermes Agent?
人工智能·云计算·aws·hermes agent·hermes
TokenByte-AI导航小贴士5 天前
Claude 4.5 Sonnet / Opus / Haiku:新手选型指南
人工智能·ai·云计算·aigc·claude·aws
China_Yanhy5 天前
[Infra/SRE 知识库] AWS CloudFront API 边缘缓存配置与排障复盘
缓存·云计算·aws
有想法的py工程师5 天前
如何用 AWS CLI 判断 T 系列实例 CPU 不够(实战指南)
大数据·aws
SNOWPIAOP5 天前
WSL 下使用 Claude Code Router 将 VS Code Claude Code 指向 AWS Bedrock GLM-5 模型
云计算·claude·aws·ccr
有想法的py工程师5 天前
PostgreSQL 在AWS的 T 系列实例上的性能陷阱
数据库·postgresql·aws