OpenTelemetry 在 Spring Boot 项目中的3种集成方式

目录

[1. 自动埋点(Java Agent)](#1. 自动埋点(Java Agent))

[2. 注解驱动(@WithSpan)](#2. 注解驱动(@WithSpan))

[3. 手动埋点(SDK 编程)](#3. 手动埋点(SDK 编程))

配置关键点

方案选择建议


OpenTelemetry 在 Spring Boot 项目中的应用主要有以下三种方式,按实现复杂度由低到高排列:


1. 自动埋点(Java Agent)

原理 :通过 JVM 的 -javaagent 参数加载 OpenTelemetry Java Agent,自动收集框架层(如 Spring MVC、JDBC、HTTP 客户端)的遥测数据。
优点:

  • 零代码侵入:无需修改业务逻辑
  • 开箱即用 :支持主流组件(Tomcat、HikariCP、RestTemplate 等)
    实现步骤:
  1. 下载 opentelemetry-javaagent.jar

  2. 启动时添加 JVM 参数:

    bash 复制代码
    java -javaagent:path/to/opentelemetry-javaagent.jar \
         -Dotel.service.name=your-service-name \
         -Dotel.exporter.otlp.endpoint=http://otel-collector:4317 \
         -jar your-spring-boot-app.jar

2. 注解驱动(@WithSpan)

原理 :使用 OpenTelemetry 的注解标记需要追踪的方法,结合 SDK 手动埋点。
适用场景 :需定制关键业务方法的追踪(如核心算法、外部调用)。
实现步骤:

  1. 添加依赖:

    XML 复制代码
    <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-api</artifactId>
      <version>1.32.0</version>
    </dependency>
    <dependency>
      <groupId>io.opentelemetry</groupId>
      <artifactId>opentelemetry-sdk</artifactId>
      <version>1.32.0</version>
    </dependency>
  2. 在方法上添加注解:

    java 复制代码
    import io.opentelemetry.instrumentation.annotations.WithSpan;
    
    @Service
    public class OrderService {
      @WithSpan("process-order") // 自定义 Span 名称
      public void processOrder(Order order) {
        // 业务逻辑
      }
    }

3. 手动埋点(SDK 编程)

原理 :直接调用 OpenTelemetry API 创建 Span、记录事件。
适用场景:

  • 需要精细控制追踪逻辑(如异步操作、复杂事务)
  • 集成非标准组件
    代码示例:
java 复制代码
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;

@Service
public class PaymentService {
  private final Tracer tracer = 
      GlobalOpenTelemetry.getTracer("com.example.payment");

  public void pay(Order order) {
    Span span = tracer.spanBuilder("process-payment").startSpan();
    try (Scope scope = span.makeCurrent()) {
      span.addEvent("Payment started");
      // 支付逻辑
      span.setAttribute("payment.amount", order.getAmount());
    } catch (Exception e) {
      span.recordException(e);
      span.setStatus(StatusCode.ERROR);
    } finally {
      span.end();
    }
  }
}

配置关键点

所有方式均需配置 OTLP 导出器(以推送到 Collector):

yaml 复制代码
# application.yml
otel:
  service.name: order-service
  exporter.otlp.endpoint: http://otel-collector:4317
  traces.sampler: parentbased_always_on # 采样率控制

方案选择建议

方案 适用场景 维护成本
Java Agent 快速接入,标准组件监控 低
注解驱动 关键方法定制追踪 中
手动埋点 非标逻辑/深度定制 高

💡 最佳实践:优先使用 Java Agent 覆盖基础监控,再通过注解补充核心业务追踪,最后对特殊场景手动埋点。

相关推荐
xiaoye-duck2 分钟前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚25 分钟前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
学长毕设1 小时前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
FRing031 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光1 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
SL_staff1 小时前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易2 小时前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
starzy19902 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_2 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
装不满的克莱因瓶2 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba