我最近将我的Quarkus应用程序从RestEasy更改为Reactive Routes来实现我的HTTP端点。
我的Quarkus应用程序启用了OpenTracing,并且工作正常。更改HTTP资源层后,我在Jaeger中看不到任何跟踪。
在DEBUG中设置日志级别后,我可以看到我的应用程序已在积家中注册,但我在日志中没有看到任何traceId或spanId,也没有在积家中看到任何踪迹:
15:44:36 DEBUG traceId=, spanId=, sampled= [io.qu.ja.ru.JaegerDeploymentRecorder] (main) Registering tracer to GlobalTracer JaegerTracer(version=Java-0.34.3, serviceName=employee, reporter=RemoteReporter(sender=HttpSender(), closeEnqueueTimeout=1000), sampler=ConstSampler(decision=true, tags={sampler.type=const, sampler.param=true}), tags={hostname=employee-8569585469-tg8wg, jaeger.version=Java-0.34.3, ip=10.244.0.21}, zipkinSharedRpcSpan=false, expandExceptionLogs=false, useTraceId128Bit=false)
15:45:03 INFO traceId=, spanId=, sampled= [or.se.po.re.EmployeeResource] (vert.x-eventloop-thread-0) getEmployees
我使用的Quarkus的最新版本是1.9.2.Final。
当我使用反应式路由时,它是否启用了OpenTracing?
发布于 2021-02-18 18:11:01
是的,添加@Traced enable以激活反应式路由上的跟踪。
不幸的是,同时使用JAX-RS反应式和反应式路由会在JAX-RS反应式端点执行时对事件循环线程进行跟踪。
我两天前才开始使用Quarkus,所以我真的不知道这种行为的原因(无论是正常还是错误),但显然在两者之间切换完全搞乱了跟踪。
下面是一个简单的重现它的例子:
以下是显示该问题的屏幕截图
正如您所看到的,一旦JAX-RS资源生成并在两个可用线程中的一个线程上执行,它就会“破坏”它,从而扰乱跟踪_在反应式路由的下一次调用的日志上报告的id (我不知道是生成还是日志报告已损坏)。
这不会发生在JAX-RS资源上,正如您在屏幕截图上也可以注意到的那样。因此,它似乎只与反应路由有关。
这里的另一点是,在Jaeger上错误地报告了JAX-RS反应资源。(提到丢失的根跨度)不确定这是否与问题有关,但这也是另一个恼人的问题。
我正在考虑完全删除JAX-RS反应端点,并将其替换为正常的反应路由,以消除此bug。如果比我更有经验的人能证实这一点,或者告诉我我做错了什么,我将不胜感激:)
编辑1:我添加了一个优先级为500的路由过滤器来清除MDC,但bug仍然存在,所以肯定不是来自MDC。
编辑2:我打开了一个bug report论Quarkus
编辑3:它似乎与两种实现的工作方式有关(线程本地与基于参与者的上下文中的上下文传播),因此,除非JAX-RS反应资源被标记为@Blocking (并在单独的线程池中执行),否则JAX-RS反应和Vertx反应路由在跟踪时是不兼容的(但对于MDC相关信息也可能是相同的,因为MDC也是线程相关的)
https://stackoverflow.com/questions/64878686
复制相似问题