Quarkus能否为SmallRye应用自动创建OpenTelemetry的Consumer/Producer Span?
Quarkus OpenTelemetry 对SmallRye响应式消息的自动Span支持
是的,Quarkus的OpenTelemetry扩展无需额外编写代码,就能为SmallRye Reactive Messaging应用自动创建Consumer和Producer类型的Span,覆盖消息的发送、接收全链路追踪。
具体操作步骤
1. 添加必要依赖
在项目的构建文件中引入OpenTelemetry扩展和对应的消息连接器依赖(以Kafka为例):
Maven:
<dependencies> <!-- OpenTelemetry核心扩展 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry</artifactId> </dependency> <!-- SmallRye Reactive Messaging Kafka连接器 --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-reactive-messaging-kafka</artifactId> </dependency> </dependencies>
2. 配置OpenTelemetry导出
在application.properties中配置OpenTelemetry追踪数据的导出目标(以Jaeger为例):
# 配置OTLP导出端点 quarkus.opentelemetry.tracer.exporter.otlp.endpoint=http://localhost:4317 quarkus.opentelemetry.tracer.exporter.otlp.protocol=grpc # 设置采样策略为全量采集 quarkus.opentelemetry.tracer.sampler.type=always_on
3. 编写基础响应式消息组件
无需添加任何追踪相关代码,直接编写标准的Producer和Consumer:
消息生产者:
import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.reactive.messaging.Outgoing; import io.smallrye.mutiny.Multi; import java.time.Duration; @ApplicationScoped public class MessageProducer { @Outgoing("output-messages") public Multi<String> generateMessages() { return Multi.createFrom().ticks().every(Duration.ofSeconds(1)) .map(tick -> "Generated message: " + tick); } }
消息消费者:
import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.reactive.messaging.Incoming; @ApplicationScoped public class MessageConsumer { @Incoming("input-messages") public void processMessage(String message) { System.out.println("Received message: " + message); } }
4. 配置消息连接器
在application.properties中添加Kafka连接器的配置:
# 生产者配置 mp.messaging.outgoing.output-messages.connector=smallrye-kafka mp.messaging.outgoing.output-messages.topic=demo-topic mp.messaging.outgoing.output-messages.value.serializer=org.apache.kafka.common.serialization.StringSerializer # 消费者配置 mp.messaging.incoming.input-messages.connector=smallrye-kafka mp.messaging.incoming.input-messages.topic=demo-topic mp.messaging.incoming.input-messages.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer mp.messaging.incoming.input-messages.group.id=demo-consumer-group
5. 验证自动追踪
- 启动Jaeger(或其他OpenTelemetry兼容的收集器);
- 启动Quarkus应用;
- 打开Jaeger UI,选择对应的服务,即可看到自动生成的
Producer(对应消息发送)和Consumer(对应消息接收)类型Span,完整展示消息链路的追踪数据。
补充说明
- 除Kafka外,Quarkus OpenTelemetry扩展还支持SmallRye Reactive Messaging的其他主流连接器(如AMQP、MQTT等),配置方式类似;
- 如果需要为Span添加自定义属性或扩展追踪逻辑,可以通过OpenTelemetry的Java API手动实现,但基础的消息链路追踪无需额外代码。
内容的提问来源于stack exchange,提问作者Youcef
相关产品推荐
相关产品推荐

