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

Quarkus Reactive SQL Client是否支持链路追踪?配置后未生成查询Span

Quarkus Reactive Postgres Client 链路追踪问题解析与解决方案

核心结论

Quarkus的Reactive Postgres Client不支持你当前配置的JDBC链路追踪方案,因为它不属于JDBC实现,JDBC相关的追踪配置对它完全无效。

原因分析

  1. 组件本质差异:

    • 你配置的quarkus.datasource.jdbc.tracing=true和io.opentracing.contrib:opentracing-jdbc依赖,都是针对传统JDBC数据源的追踪方案。
    • Reactive Postgres Client是基于Netty的异步非JDBC客户端,底层不依赖JDBC API,因此JDBC追踪逻辑无法捕获它的查询请求。
    • Flyway能生成Span是因为它使用的是JDBC数据源,和业务层的Reactive Client是完全独立的组件。
  2. 官方支持现状:

    • Quarkus官方文档中,JDBC链路追踪确实仅针对非Reactive数据源。Reactive Postgres Client的追踪支持需要依赖OpenTelemetry或特定的OpenTracing集成,而非JDBC追踪体系。

解决方案

方案1:切换到OpenTelemetry集成(推荐)

OpenTelemetry是Quarkus官方主推的追踪方案,能自动支持Reactive Postgres Client的Span生成,同时兼容Datadog:

  • 依赖调整:
    移除io.opentracing.contrib:opentracing-jdbc,添加以下Gradle依赖:
    implementation "io.quarkus:quarkus-opentelemetry"
    implementation "io.quarkus:quarkus-opentelemetry-exporter-otlp"
    
  • 配置调整:
    在application.properties中添加:
    quarkus.opentelemetry.tracer.exporter.otlp.endpoint=http://${DD_AGENT_HOST}:4317
    quarkus.opentelemetry.tracer.exporter.otlp.protocol=grpc
    
  • 启动参数简化:
    移除JDBC相关的Datadog参数(如dd.integration.jdbc-datasource.enabled=true),保留Datadog Agent相关配置即可,OpenTelemetry会自动处理所有追踪逻辑。

方案2:手动实现OpenTracing追踪(不推荐)

如果坚持使用OpenTracing,需要手动为Reactive Postgres Client的查询添加Span:

  • 在每个查询方法中,手动创建并激活Span,关联到当前追踪上下文:
    @Inject
    Tracer tracer;
    
    public Uni<MyEntity> findById(Long id) {
        Span span = tracer.buildSpan("reactive-pg-query")
                .withTag("db.statement", "SELECT * FROM my_entity WHERE id = $1")
                .withTag("db.type", "postgresql")
                .start();
        try (Scope scope = tracer.activateSpan(span)) {
            return client.preparedQuery("SELECT * FROM my_entity WHERE id = $1")
                    .execute(Tuple.of(id))
                    .map(row -> row.map(MyEntity.class))
                    .onItem().invoke(() -> span.finish())
                    .onFailure().invoke(e -> {
                        span.setTag(Tags.ERROR, true);
                        span.log(Map.of(Fields.ERROR_OBJECT, e));
                        span.finish();
                    });
        }
    }
    
  • 这种方式需要手动维护所有查询的Span,工作量大且容易遗漏。

验证步骤

  1. 部署更新后的服务,发起包含Reactive Postgres查询的请求。
  2. 查看Datadog的APM面板,确认是否生成了reactive-pg-client相关的Span。
  3. 检查Datadog Agent的OTLP接收端口(默认4317)是否正常监听。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:13:02