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

Micronaut追踪注解在非Bean类中无法生成Span,是否需注册为Bean?

Micronaut追踪注解生效要求类必须是Bean吗?

是的,Micronaut的@NewSpan和@ContinueSpan这类追踪注解仅对被Micronaut应用上下文管理的Bean生效,你的非Bean类方法没生成Span就是这个原因。

原因说明

Micronaut的追踪注解是基于AOP(面向切面编程)机制实现的:

  • 应用启动时,Micronaut会扫描并注册Bean到上下文,同时为带有追踪注解的Bean创建代理类;
  • 代理类会在目标方法执行前后自动处理Span的创建、延续和提交逻辑;
  • 非Bean类不会被Micronaut上下文扫描和代理,注解的逻辑自然不会被触发。

解决办法

如果需要在非Bean类中实现追踪,有两种方案可选:

  1. 将类转为Bean:给类添加@Singleton、@Prototype等Micronaut Bean注解,让它被上下文管理,这样注解就能正常生效。
  2. 手动使用Tracer API:如果无法将类转为Bean,可以直接注入Tracer实例,手动管理Span:
    import io.micronaut.tracing.opentelemetry.OpenTelemetryTracer;
    
    public class NonBeanClass {
        private final OpenTelemetryTracer tracer;
    
        // 构造注入Tracer(需确保能从上下文获取该实例)
        public NonBeanClass(OpenTelemetryTracer tracer) {
            this.tracer = tracer;
        }
    
        public void doSomething() {
            // 手动创建新Span
            try (var span = tracer.nextSpan().name("non-bean-method").start()) {
                // 执行业务逻辑
                span.tag("operation", "process-data");
            }
        }
    
        public void continueExistingSpan() {
            // 延续当前已存在的Span
            var currentSpan = tracer.getCurrentSpan();
            if (currentSpan != null) {
                try (var scope = tracer.withSpan(currentSpan)) {
                    // 执行业务逻辑
                    currentSpan.tag("action", "continue-processing");
                }
            }
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:07:07