Quarkus BuildStep注解转换失效,如何为Redis ValueCommands方法添加WithSpan
问题分析与解决方案
核心问题点
你的代码存在几个关键问题导致注解未生效:
- 错误操作Jandex不可变对象:直接调用
t.annotations().add(annot)无效,因为Jandex的MethodInfo及其注解集合是不可变结构,必须通过TransformationContext提供的官方API来完成注解修改。 - 注解转换范围限制:
appliesTo仅返回CLASS类型,但你需要修改方法级别的注解,应调整为支持METHOD类型。 - 目标类的代理特性:
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
相关产品推荐
相关产品推荐

