是否为 Quarkus 中的 Reactive Routes 启用了 OpenTracing?
Is OpenTracing enabled for Reactive Routes in Quarkus?
我最近将我的 Quarkus 应用程序从 RestEasy 更改为 Reactive Routes 以实现我的 HTTP 端点。
我的 Quarkus 应用程序启用了 OpenTracing,并且运行良好。更改 HTTP 资源层后,我在 Jaeger 中看不到任何痕迹。
在 DEBUG 中设置日志级别后,我可以看到我的应用程序已在 Jaeger 中注册,但我在日志中没有看到任何 traceId 或 spanId,在 Jaeger 中也没有任何痕迹:
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。
当我使用 Reactive Routes 时是否启用了 OpenTracing?
默认情况下,仅对 JAX-RS 端点启用跟踪,目前对反应式路由不启用。您可以通过使用 @org.eclipse.microprofile.opentracing.Traced
.
注释您的路线来激活跟踪
是的,添加@Traced 启用以激活对反应路线的跟踪。
不幸的是,同时使用 JAX-RS 反应式路由和反应式路由会在 JAX-RS 反应式端点执行时使用的事件循环线程上跟踪错误。
我 2 天前才开始使用 Quarkus,所以我不太清楚这种行为的原因(以及它是正常还是错误),但显然在两者之间切换完全搞砸了跟踪。
这里有一个可以轻松重现的例子:
- 创建一个返回空 Multi 的 REST Easy 反应端点
- 创建自定义反应路线
- 将 IO 线程设置为 2(更容易快速重现)
- 运行应用,交替请求两个端点
这是显示问题的屏幕截图
如您所见,一旦 JAX-RS 资源存在并在两个可用线程之一上执行,它就会“破坏”它,弄乱 trace_id 报告(我不知道如果是日志的生成或报告被破坏)在日志中以用于反应路由的下一次调用。
这不会发生在 JAX-RS 资源上,您也可以在屏幕截图中注意到这一点。所以它似乎只与反应路线有关。
这里的另一点是 JAX-RS Reactive 资源在 Jaeger 上的报告不正确。 (提到缺少根跨度)不确定它是否与问题有关,但这也是另一个烦人的地方。
我正在考虑完全删除 JAX-RS Reactive 端点并用正常的反应路由替换它们以消除此错误。
如果有比我更有经验的人可以验证这一点或告诉我我做错了什么,我将不胜感激:)
编辑 1:我添加了一个优先级为 500 的路由过滤器来清除 MDC,但错误仍然存在,所以绝对不是来自 MDC。
编辑 2:我在 Quarkus
上打开了一个 bug report
编辑 3:这似乎与两种实现的工作方式有关(线程本地与基于 actor 的上下文中的上下文传播)
因此,除非 JAX-RS 反应性资源被标记为@Blocking(并在单独的线程池中执行),否则 JAX-RS 反应性和 Vertx 反应性路由在跟踪时是不兼容的(但对于 MDC 相关信息也可能是相同的,因为 MDC也是线程相关的)
我最近将我的 Quarkus 应用程序从 RestEasy 更改为 Reactive Routes 以实现我的 HTTP 端点。
我的 Quarkus 应用程序启用了 OpenTracing,并且运行良好。更改 HTTP 资源层后,我在 Jaeger 中看不到任何痕迹。
在 DEBUG 中设置日志级别后,我可以看到我的应用程序已在 Jaeger 中注册,但我在日志中没有看到任何 traceId 或 spanId,在 Jaeger 中也没有任何痕迹:
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。
当我使用 Reactive Routes 时是否启用了 OpenTracing?
默认情况下,仅对 JAX-RS 端点启用跟踪,目前对反应式路由不启用。您可以通过使用 @org.eclipse.microprofile.opentracing.Traced
.
是的,添加@Traced 启用以激活对反应路线的跟踪。
不幸的是,同时使用 JAX-RS 反应式路由和反应式路由会在 JAX-RS 反应式端点执行时使用的事件循环线程上跟踪错误。
我 2 天前才开始使用 Quarkus,所以我不太清楚这种行为的原因(以及它是正常还是错误),但显然在两者之间切换完全搞砸了跟踪。
这里有一个可以轻松重现的例子:
- 创建一个返回空 Multi 的 REST Easy 反应端点
- 创建自定义反应路线
- 将 IO 线程设置为 2(更容易快速重现)
- 运行应用,交替请求两个端点
这是显示问题的屏幕截图
如您所见,一旦 JAX-RS 资源存在并在两个可用线程之一上执行,它就会“破坏”它,弄乱 trace_id 报告(我不知道如果是日志的生成或报告被破坏)在日志中以用于反应路由的下一次调用。
这不会发生在 JAX-RS 资源上,您也可以在屏幕截图中注意到这一点。所以它似乎只与反应路线有关。
这里的另一点是 JAX-RS Reactive 资源在 Jaeger 上的报告不正确。 (提到缺少根跨度)不确定它是否与问题有关,但这也是另一个烦人的地方。
我正在考虑完全删除 JAX-RS Reactive 端点并用正常的反应路由替换它们以消除此错误。 如果有比我更有经验的人可以验证这一点或告诉我我做错了什么,我将不胜感激:)
编辑 1:我添加了一个优先级为 500 的路由过滤器来清除 MDC,但错误仍然存在,所以绝对不是来自 MDC。
编辑 2:我在 Quarkus
上打开了一个 bug report编辑 3:这似乎与两种实现的工作方式有关(线程本地与基于 actor 的上下文中的上下文传播) 因此,除非 JAX-RS 反应性资源被标记为@Blocking(并在单独的线程池中执行),否则 JAX-RS 反应性和 Vertx 反应性路由在跟踪时是不兼容的(但对于 MDC 相关信息也可能是相同的,因为 MDC也是线程相关的)