• Русский
  • TIP

    В этой статье разработчикам будет показано, как интегрировать методы получения TraceID и добавления TraceID в логи приложения в код приложения, что подходит для backend-разработчиков с некоторым опытом разработки.

    Бизнес-логи, связанные с TraceID

    Содержание

    Предпосылки

    • Для корректного объединения нескольких автоматически отправляемых спанов (различных модулей/узлов/сервисов, вызываемых в рамках одного запроса) в один трейс, HTTP-заголовки запроса сервиса будут содержать TraceID и другую информацию, используемую для связывания трейса.

    • Трейс представляет собой процесс вызова одного запроса, а TraceID — уникальный идентификатор, определяющий этот запрос. Наличие TraceID в логах позволяет связать трассировку с логами приложения.

    Исходя из вышеизложенного, в этой статье будет объяснено, как получить TraceID из HTTP-заголовков запроса и добавить его в логи приложения, что позволит точно выполнять поиск логов на платформе по TraceID.

    Добавление TraceID в логи Java-приложения

    TIP
    • Приведённые примеры основаны на фреймворке Spring Boot и используют Log4j и Logback для иллюстрации.

    • Ваше приложение должно соответствовать следующим требованиям:

      • Тип и версия библиотеки логирования должны соответствовать следующим требованиям:

        Logging LibraryТребование по версии
        Log4j 11.2+
        Log4j 22.7+
        Logback1.0+
      • В приложение внедрён Java Agent.

    Метод 1: Настройка logging.pattern.level

    Измените параметр logging.pattern.level в конфигурации приложения следующим образом:

    logging.pattern.level = trace_id=%mdc{trace_id}

    Метод 2: Настройка CONSOLE_LOG_PATTERN

    1. Измените конфигурационный файл logback следующим образом.

      TIP

      Здесь в качестве примера используется вывод в консоль, где %X{trace_id} обозначает значение ключа trace_id, полученное из MDC.

      <property name="CONSOLE_LOG_PATTERN"
          value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [trace_id=%X{trace_id}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    2. В классе, где необходимо выводить логи, добавьте аннотацию @Slf4j и используйте объект log для вывода логов, как показано ниже:

      @RestController
      @Slf4j
      public class ProviderController {
      
          @GetMapping("/hello")
          public String hello(HttpServletRequest request) {
              log.info("request /hello");
              return "hello world";
          }
      }

    Добавление TraceID в логи Python-приложения

    1. В коде приложения добавьте следующий код для получения TraceID из заголовков запроса. Пример кода приведён ниже и может быть адаптирован при необходимости:

      TIP

      Функция getForwardHeaders извлекает информацию о трассировке из заголовков запроса, где значение x-b3-traceid является TraceID.

         def getForwardHeaders(request):
             headers = {}
             incoming_headers = [
                 'x-request-id',  # Все приложения должны передавать x-request-id для access log и согласованных решений по трассировке/выборке логов
                 'x-b3-traceid',  # Заголовок B3 trace, совместимый с Zipkin, OpenCensusAgent и Stackdriver
                 'x-b3-spanid',
                 'x-b3-parentspanid',
                 'x-b3-sampled',
                 'x-b3-flags',
             ]
             for ihdr in incoming_headers:
                 val = request.headers.get(ihdr)
                 if val is not None:
                     headers[ihdr] = val
      
             return headers
    2. В коде приложения добавьте следующий код для включения полученного TraceID в логи. Пример кода приведён ниже и может быть адаптирован при необходимости:

      headers = getForwardHeaders(request)
      tracing_section = ' [%(x-b3-traceid)s,%(x-b3-spanid)s] ' % headers
      logging.info(tracing_section + "Oops, unexpected error happens.")

    Метод проверки

    1. Нажмите на Tracing в левой навигационной панели.

    2. В критериях запроса выберите TraceID, введите TraceID для поиска и нажмите Add to query.

    3. В отображённых ниже данных трейса нажмите View Log рядом с TraceID.

    4. На странице Log Query отметьте Contain Trace ID; система отобразит только лог-данные, содержащие TraceID.