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.