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

如何在OpenTelemetry Span中集中式展示服务调用方代码信息?

解决方案:集中式为OpenTelemetry Span添加代码模块信息

一、全局Resource配置(一键生效所有Span)

直接通过环境变量或配置文件设置全局资源属性,所有生成的Span都会自动携带这些代码模块信息,完全无需修改业务代码:

  • 环境变量方式:设置OTEL_RESOURCE_ATTRIBUTES=service.module=你的模块标识,team=业务分组,比如订单模块可设为service.module=order-service。在Jaeger中查看Span时,能在Span的Resource区域找到这些属性。
  • 配置文件方式:若使用otel-config.yaml,添加以下配置:
    resource:
      attributes:
        - key: service.module
          value: "order-service"
        - key: service.namespace
          value: "e-commerce"
    
    该方案适合整个服务归属同一模块的场景,一次配置全量Span生效。

二、自定义SpanProcessor(细粒度模块识别)

如果服务包含多个代码模块,需要给不同模块生成的Span附加对应标识,可通过自定义SpanProcessor集中实现,无需侵入业务代码:

  1. 实现SpanProcessor接口,在Span启动时根据调用栈识别代码模块并添加属性:
    public class ModuleSpanProcessor implements SpanProcessor {
        @Override
        public void onStart(Context parentContext, ReadWriteSpan span) {
            // 通过调用栈判断当前代码所属模块
            for (StackTraceElement elem : Thread.currentThread().getStackTrace()) {
                if (elem.getClassName().startsWith("com.yourcompany.order")) {
                    span.setAttribute("code.module", "order-service");
                    break;
                } else if (elem.getClassName().startsWith("com.yourcompany.payment")) {
                    span.setAttribute("code.module", "payment-service");
                    break;
                }
            }
        }
    
        @Override
        public void onEnd(ReadableSpan span) {}
        @Override
        public boolean isStartRequired() { return true; }
        @Override
        public boolean isEndRequired() { return false; }
    }
    
  2. 集中注册该Processor到OpenTelemetry TracerProvider:
    OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
        .setTracerProvider(
            SdkTracerProvider.builder()
                .addSpanProcessor(new ModuleSpanProcessor())
                .build()
        )
        .buildAndRegisterGlobal();
    
    该方案能自动识别不同代码模块,给对应Span打上精准的模块标签。

三、Spring Boot环境专属配置

如果是Spring Boot项目,可通过自定义OpenTelemetryCustomizer实现无侵入集中配置:

@Component
public class ModuleSpanCustomizer implements OpenTelemetryCustomizer {
    @Override
    public void customize(OpenTelemetrySdkBuilder builder) {
        builder.setTracerProvider(
            SdkTracerProvider.builder()
                .addSpanProcessor(new ModuleSpanProcessor())
                .build()
        );
    }
}

也可以直接在application.properties中配置全局Resource属性:

otel.resource.attributes=service.module=order-service,service.version=1.0.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:52:14