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

如何测试OpenTelemetry的Java自动插装?含GRPC及Maven场景

针对OpenTelemetry插装与Span测试的实践方案

一、分层测试:早发现问题+覆盖全场景

1. 单元测试层:验证Span创建与手动插装逻辑

不用搭完整追踪基础设施,直接用OpenTelemetry的测试工具类模拟Tracer和SpanExporter:

  • 把opentelemetry-sdk-testing加到Maven测试依赖:
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-testing</artifactId>
    <version>最新稳定版</version>
    <scope>test</scope>
</dependency>
  • 测试时创建InMemorySpanExporter和自定义TracerProvider,替换应用里的全局Tracer:
InMemorySpanExporter exporter = InMemorySpanExporter.create();
TracerProvider tracerProvider = OpenTelemetrySdk.builder()
    .setTracerProvider(SdkTracerProvider.builder()
        .addSpanProcessor(SimpleSpanProcessor.create(exporter))
        .build())
    .build()
    .getTracerProvider();

// 把这个Tracer注入到业务服务里(比如通过依赖注入替换原有实例)
MyService service = new MyService(tracerProvider.get("my-service"));
  • 执行测试后直接从exporter拿生成的Span做断言:
    • Span的名称、自定义属性是否符合预期
    • 父/子Span的关联关系是否正确
    • 自定义Netty传输层、队列调度逻辑对应的手动插装Span是否正常生成

2. 集成测试层:验证自动插装与业务逻辑一致性

这一层搭轻量追踪环境,同时验证插装不影响原有业务:

  • 用opentelemetry-javaagent作为Javaagent启动集成测试,在Maven的maven-surefire-plugin里配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.2.5</version>
    <configuration>
        <argLine>
            -javaagent:${settings.localRepository}/io/opentelemetry/opentelemetry-javaagent/${otel.agent.version}/opentelemetry-javaagent-${otel.agent.version}.jar
            -Dotel.traces.exporter=logging
            -Dotel.metrics.exporter=none
            -Dotel.logs.exporter=none
        </argLine>
    </configuration>
</plugin>
  • 测试分两部分:
    • 业务逻辑验证:复用原有业务集成用例,确保所有接口返回、流程结果和无插装时完全一致
    • 自动插装Span验证:通过日志输出的Span信息,检查gRPC自动生成的Span是否存在、属性正确,且和手动插装Span能形成完整链路

二、简化agent-for-testing的配置复杂度

如果一定要用agent-for-testing,把配置抽成Maven属性复用:

<properties>
    <otel.agent.version>最新稳定版</otel.agent.version>
    <otel.test.args>
        -Dotel.traces.exporter=in-memory
        -Dotel.metrics.exporter=none
        -Dotel.logs.exporter=none
    </otel.test.args>
</properties>

然后在测试插件里直接引用,同时结合opentelemetry-sdk-testing的InMemoryExporter获取Span,不用搭外部Otel Collector。

三、手动插装的测试要点

针对Netty自定义传输层和队列调度逻辑:

  • 单元测试单独验证手动Span代码:比如Netty ChannelHandler中创建的Span,是否能正确关联上游请求的Span上下文;队列任务执行时,是否能继承提交时的Span上下文
  • 集成测试验证全链路:从gRPC请求进入,经过自定义传输层、队列调度,最终到业务处理的完整Span链路是否连续,没有上下文断裂的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:35:20