Настроить автоконфигурацию jaeger с пружинной загрузкой

Я работаю над POC и смог интегрировать 2 микросервиса с JaegerUI.

Запрос к конечной точке в serviceA вызывает конечную точку в serviceB и возвращает ответ.

Я использовал следующие зависимости:

spring.boot.version: 2.1.4.RELEASE

<groupId>io.opentracing.contrib</groupId>
            <artifactId>opentracing-spring-jaeger-web-starter</artifactId>
            <version>3.1.1</version>

 <groupId>io.opentracing.contrib</groupId>
        <artifactId>opentracing-spring-cloud-starter</artifactId>
        <version>0.4.0</version>

Автоконфигурация Spring позаботится обо всем, поэтому просто добавлены необходимые свойства:

opentracing.jaeger.http-sender.url

opentracing.jaeger.service-name

opentracing.jaeger.enabled

opentracing.spring.cloud.async.enabled

Я хочу добиться следующего:

  1. Я хочу добавить журналы приложений в диапазон, чтобы они были видны в JaegerUI.
  2. Я хочу добавить несколько полей для охвата тегов, чтобы было удобно искать в JaegerUI.
  3. Кроме того, мне нужны spanId и traceId в журнале приложения.
  4. Можно ли искать в JaegerUI на основе spanId / traceId? Если да, то как?

Основываясь на ответе на вопрос ниже SO:

Как обогатить данные открытия Jaeger с журналами приложений (созданными slf4j) для Spring Boot?

Зависимость opentracing-spring-cloud-starter должна автоматически заботиться об отправке журналов приложений в диапазон в JaegerUI.

У меня есть запись журнала, как показано ниже в serviceA:

logger.info (отправка запроса в serviceB.);

Но указанный выше журнал не фиксируется в соответствующем диапазоне и не отображается в JaegerUI.

Любые предложения о том, как достичь вышеуказанных сценариев, приветствуются!


person Rahul    schedule 17.07.2020    source источник


Ответы (2)


Я изучал Opentracing и Jeager, и я использовал этот учебник, чтобы ознакомиться с основными возможностями: https://github.com/yurishkuro/opentracing-tutorial/tree/master/java

Если вы посмотрите на случай 1 (Hello World), он объясняет, как Аннотировать трассировку с помощью тегов и журналов. Это ответит на ваши вопросы 1, 2 и 3, так как с ним вы можете добавить всю информацию, которую хотите, в диапазоны и журналы.

Вот фрагмент из репозитория (но я бы рекомендовал проверить там, так как он имеет более подробное объяснение):

Span span = tracer.buildSpan("say-hello").start();
span.setTag("hello-to", helloTo);

В этом случае helloTo - это переменная, содержащая имя, с которым приложение поздоровается. Это создаст тег span с именем hello-to со значением, полученным в результате выполнения.

Ниже у нас есть пример для случая журналов, когда все helloStr сообщение добавляется в журналы:

// this goes inside the sayHello method
String helloStr = String.format("Hello, %s!", helloTo);
span.log(ImmutableMap.of("event", "string-format", "value", helloStr));

System.out.println(helloStr);
span.log(ImmutableMap.of("event", "println"));

Что касается последнего вопроса, это было бы проще, вы можете использовать пользовательский интерфейс Jaeger для поиска нужного следа, для этого есть поле в верхнем левом углу:

введите описание изображения здесь

person Juliano Costa    schedule 18.07.2020
comment
Спасибо за ваш ответ. Ваш ответ актуален. Однако я хотел использовать автоматически настроенный экземпляр трассировщика, предоставляемый Spring-Boot. Я понял это. По сути, мы можем внедрить предоставленный Spring трассировщик и использовать его для доступа к активным промежуткам. Я добавлю свой ответ. - person Rahul; 20.07.2020

Вот и все.

  1. Я хочу добавить журналы приложений в диапазон, чтобы они были видны в JaegerUI.
Span span = tracer.buildSpan("my-span-name").start();
span.setTag("my-tag-name", "my-tag-value");

Существуют следующие перегруженные методы.

Span setTag(String key, String value);
Span setTag(String key, boolean value);
Span setTag(String key, Number value);
  1. Я хочу добавить несколько полей для охвата тегов, чтобы было удобно искать в JaegerUI.

    Jaeger API предоставляет метод log для регистрации нескольких полей, которые необходимо добавить на карту, подпись метода следующая:

Span log(Map<String, ?> fields);

eg:

span.log(
   ImmutableMap.Builder<String, Object>()
     .put("event", "soft error")
     .put("type", "cache timeout")
     .put("waited.millis", 1500)
     .build()
); 
  1. Кроме того, мне нужны spanId и traceId в журнале приложения.

spanId и traceId хранятся в классе JaegerSpanContext, который можно получить из метода context () класса Span.

    JaegerSpanContext spanContext = (JaegerSpanContext)sprintSpan.context();
    long spanId = spanContext.getSpanId();
    long traceId = spanContext.getTraceId();
  1. Можно ли искать в JaegerUI на основе spanId / traceId? Если да, то как?

На панели навигации Jaeger UI есть поле поиска, где вы можете искать следы по идентификатору следа.

введите описание изображения здесь

person wosimosi    schedule 24.07.2020