IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Работа с трассировкой в Golang на примере фрагмента кода

Давайте разберем ваш код и определим, в какой момент и как происходит отправка трейса:

1. Создание OTLP gRPC экспортера
  • Что делает?
    Создает OTLP gRPC экспортер, который будет отправлять данные трассировки на указанный адрес (localhost:4317).
  • Как работает?
    Экспортер выступает интерфейсом для передачи данных в Collector. Он ничего не отправляет сам по себе — это задача процессора (например, BatchSpanProcessor), который взаимодействует с экспортером.

2. Настройка TracerProvider

  • Что делает?
    Создает TracerProvider, который управляет трассировщиками и отправкой данных.
  • Особенности trace.WithBatcher(exporter):
    • Используется BatchSpanProcessor:
      • Данные трассировок сначала буферизуются в памяти.
      • Буфер отправляется в экспортер либо по истечении заданного времени (ScheduleDelay), либо когда буфер достигает заданного размера (MaxExportBatchSize).
      • Это позволяет избежать синхронной отправки данных при создании спанов, уменьшая влияние на производительность.
    • Отправка данных происходит асинхронно через отдельные горутины.

3. Создание и завершение спана

  • Что делает?
    • Создает спан с именем "daemon-operation".
    • Спан активен до вызова span.End().
  • Когда отправляются данные?
    • В момент вызова span.End() данные передаются в BatchSpanProcessor.
    • Процессор решает, отправлять данные сразу (если буфер заполнен), либо ждать окончания ScheduleDelay.

4. Закрытие TracerProvider

  • Что делает?
    • В момент вызова tp.Shutdown(ctx) происходит:
      • Завершение всех активных спанов.
      • Принудительная отправка всех данных, находящихся в буфере BatchSpanProcessor, в экспортер.
      • Завершение работы фоновых горутин.
  • Особенность: Если вы не вызовете Shutdown, часть трассировок может остаться в буфере и не будет отправлена.

Асинхронная или синхронная отправка?

  1. В момент создания спана (tracer.Start) — данных на экспорт не отправляется.
  2. В момент завершения спана (span.End()) — данные передаются в буфер BatchSpanProcessor асинхронно.
  3. Фактическая отправка данных — происходит асинхронно в фоне, когда:
    • Буфер достигает максимального размера.
    • Истекает время ожидания (ScheduleDelay).
    • Принудительно вызывается tp.Shutdown.

Итог:

  • Отправка данных трассировок происходит асинхронно.
  • BatchSpanProcessor минимизирует влияние на основной поток выполнения программы, обрабатывая данные в фоне.
  • В вашем коде отправка произойдет либо по истечении времени ожидания (ScheduleDelay), либо при вызове tp.Shutdown(ctx).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *