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

Quarkus BuildStep注解转换失效,如何为Redis ValueCommands方法添加WithSpan

问题分析与解决方案

核心问题点

你的代码存在几个关键问题导致注解未生效:

  1. 错误操作Jandex不可变对象:直接调用t.annotations().add(annot)无效,因为Jandex的MethodInfo及其注解集合是不可变结构,必须通过TransformationContext提供的官方API来完成注解修改。
  2. 注解转换范围限制:appliesTo仅返回CLASS类型,但你需要修改方法级别的注解,应调整为支持METHOD类型。
  3. 目标类的代理特性:ValueCommands并非直接的CDI bean,Quarkus Redis客户端通过动态生成代理类实现功能,直接修改原始接口注解无法自动传递到代理类。

修正后的代码

public class TestTelemetryBuilder {
    
    @BuildStep
    AnnotationsTransformerBuildItem transform() {
        return new AnnotationsTransformerBuildItem(new AnnotationsTransformer() {
            
            private final DotName VALUE_COMMANDS = DotName.createSimple("io.quarkus.redis.datasource.value.ValueCommands");
            private final DotName WITH_SPAN = DotName.createSimple("io.opentelemetry.instrumentation.annotations.WithSpan");

            @Override
            public boolean appliesTo(AnnotationTarget.Kind kind) {
                // 仅针对方法类型进行处理
                return kind == AnnotationTarget.Kind.METHOD;
            }

            @Override
            public void transform(TransformationContext context) {
                AnnotationTarget target = context.getTarget();
                // 校验当前方法所属类是否为ValueCommands
                if (target.asMethod().declaringClass().name().equals(VALUE_COMMANDS)) {
                    // 使用官方API添加注解
                    context.transform()
                            .add(WITH_SPAN)
                            .done();
                }
            }
        });
    }
}

额外配置与验证要点

  • 启用OpenTelemetry扩展:确保项目依赖中包含quarkus-opentelemetry和对应导出器(如quarkus-opentelemetry-exporter-otlp),否则Span无法被采集和导出。
  • 构建时索引验证:添加启动参数-Dquarkus.debug.jandex=true,查看构建日志中ValueCommands的方法是否已成功添加WithSpan注解。
  • 运行时Span校验:启动应用后调用Redis的ValueCommands方法,通过OpenTelemetry后端(如Jaeger)检查是否生成对应Span。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:18:15