Включен ли OpenTracing для реактивных маршрутов в Quarkus?

Недавно я изменил свое приложение Quarkus с RestEasy на Реактивные маршруты для реализации моих конечных точек 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.

Включен ли OpenTracing, когда я использую реактивные маршруты?


person Sergio Rodríguez Calvo    schedule 17.11.2020    source источник


Ответы (2)


Да, добавление @Traced позволяет активировать трассировку на реактивных маршрутах.

К сожалению, использование как реактивных, так и реактивных маршрутов JAX-RS приводит к ошибкам при трассировке потоков цикла событий, используемых реактивной конечной точкой JAX-RS при их выполнении.

Я запустил Quarkus только 2 дня назад, так что я не совсем понимаю причину такого поведения (и нормально ли это или это ошибка), но, очевидно, переключение между двумя полностью испортило трассировку.

Вот пример, который легко воспроизвести:

  • Создайте реактивную конечную точку REST Easy, возвращающую пустой Multi
  • Создайте собственный реактивный маршрут
  • настроить потоки ввода-вывода на 2 (проще быстро воспроизвести)
  • Запустите приложение и поочередно запросите две конечные точки.

Вот скриншот, который показывает проблему  введите описание изображения здесь

Как вы можете видеть, как только ресурс JAX-RS используется и выполняется в одном из двух доступных потоков, он портит его, искажая сообщенный trace_id (я не знаю, генерируется ли это генерация или отчет в журналах). сломанный) в журналах для следующих вызовов реактивного маршрута.

Этого не происходит на ресурсе JAX-RS, как вы также можете заметить на скриншоте. Так что, похоже, это относится только к реактивным маршрутам.

Еще одним моментом здесь является тот факт, что реактивные ресурсы JAX-RS неправильно сообщаются в Jaeger. (с упоминанием отсутствующего корневого диапазона) Не уверен, связано ли это с проблемой, но это еще один неприятный момент.

Я думаю полностью удалить реактивную конечную точку JAX-RS и заменить их обычным реактивным маршрутом, чтобы устранить эту ошибку. Я был бы признателен, если бы кто-нибудь с большим опытом, чем я, мог проверить это или сказать мне, что я сделал не так :)

РЕДАКТИРОВАТЬ 1: Я добавил фильтр маршрута с приоритетом 500, чтобы очистить MDC, и ошибка все еще существует, поэтому определенно не из MDC.

РЕДАКТИРОВАТЬ 2: Я открыл отчет об ошибке в Quarkus.

РЕДАКТИРОВАТЬ 3: Похоже, это связано с тем, как работают обе реализации (локальные потоки по сравнению с распространением контекста в контексте на основе акторов) Итак, если реактивные ресурсы JAX-RS не помечены @Blocking (и не выполняются в отдельном пуле потоков), реактивный JAX-RS и Реактивные маршруты Vertx несовместимы, когда дело доходит до трассировки (но, вероятно, то же самое и для информации, связанной с MDC, поскольку MDC также связан с потоками)

person kij    schedule 18.02.2021

По умолчанию трассировка включена только для конечных точек JAX-RS, но не для реактивных маршрутов в данный момент. Вы можете активировать отслеживание, отметив свой маршрут знаком @org.eclipse.microprofile.opentracing.Traced.

person Jan Martiška    schedule 18.11.2020
comment
Кажется, есть проблема с traceId, сообщаемым в журналах при смешивании JAX-RS (реактивного) с реактивными маршрутами. (последняя версия quarkus) Как только достигается конечная точка JAX-RS, трассировка начинает прослушиваться в любом потоке цикла событий, выполняющем любой реактивный маршрут. - person kij; 18.02.2021