Quarkus原生编译集成Jaeger追踪部署K8s时JDBC URL识别异常
Quarkus Native镜像接入Jaeger时JDBC URL丢失tracing前缀问题排查
问题描述
- 应用基于Quarkus开发,编译为Native原生镜像同时接入Jaeger Tracing实现分布式链路监控时,在OpenTracing适配阶段出现URL读取错误
- 本地运行模式下功能完全正常,部署到Kubernetes集群后触发配置加载异常:运行日志显示实际生效的JDBC URL缺失
tracing标识段,但日志打印的已加载配置项明确显示读取到了application.properties中配置的正确URL值 - 代码及其他配置位置无该参数硬编码,所有配置均直接从application.properties文件读取
问题相关application.properties配置
quarkus.datasource.db-kind=oracle quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver quarkus.datasource.jdbc.url=jdbc:tracing:oracle:thin:@172.28.2.134:1522/IVR quarkus.datasource.username=${USERNAME_CONNECTION_BD:xxxxxxxxxxxxx} quarkus.datasource.password=${PASSWORD_CONNECTION_BD:xxxxxxxxxx} quarkus.http.port=${PORT:8082} quarkus.http.ssl-port=${PORT-SSl:8083} quarkus.jaeger.service-name=find-puk-code-tracing quarkus.jaeger.sampler-type=const quarkus.jaeger.sampler-param=1 quarkus.jaeger.endpoint=${URL_JAEGER:http://10.161.169.24:14268/api/traces} quarkus.native.add-all-charsets=true quarkus.swagger-ui.path=/api/FindPukCodeBS/swagger-ui quarkus.smallrye-openapi.path=/api/FindPukCodeBS/swagger quarkus.swagger-ui.always-include=true
根因分析
这个问题是Quarkus Native构建的静态预处理逻辑和手动配置的OpenTracing JDBC驱动冲突导致:
- Quarkus Native镜像在构建阶段会对Agroal连接池的JDBC配置做静态解析,自动识别URL中的驱动前缀做元数据初始化
- 当手动指定驱动为
io.opentracing.contrib.jdbc.TracingDriver、URL带jdbc:tracing:自定义前缀时,构建阶段的Agroal扩展会把tracing段判定为非标准驱动前缀,自动剥离该段后拼接底层Oracle驱动的标准前缀jdbc:oracle:,这个逻辑仅在Native构建时执行,因此本地JVM运行模式不会触发 - 配置打印和实际运行值不一致,是因为Native镜像中配置日志的打印时机早于构建时预处理后的配置生效时机,打印的是原始读取到的配置值,而非实际运行时使用的处理后值
修复方案
- 优先使用Quarkus官方的链路埋点方案,不需要手动引入opentracing-contrib的JDBC驱动:
- 删除配置项
quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver - 将JDBC URL改回Oracle标准格式:
quarkus.datasource.jdbc.url=jdbc:oracle:thin:@172.28.2.134:1522/IVR - Quarkus Jaeger扩展会自动对Agroal连接池做链路埋点,无需手动修改URL加tracing前缀即可实现JDBC调用链路上报
- 删除配置项
- 如果有自定义需求必须手动使用TracingDriver,需要在配置中添加Native构建参数,强制TracingDriver在运行时初始化,避免构建阶段预处理URL:
quarkus.native.additional-build-args=--initialize-at-run-time=io.opentracing.contrib.jdbc.TracingDriver - 额外排查K8s部署环境的配置覆盖:Quarkus配置优先级中环境变量高于application.properties,检查集群中是否注入了
QUARKUS_DATASOURCE_JDBC_URL同名环境变量,部分场景下环境变量注入时机晚于配置日志打印时机,也会出现打印值和实际运行值不符的问题
内容的提问来源于stack exchange,提问作者Cesar Justo
相关产品推荐
相关产品推荐

