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

Golang трассировка Open Telemetry: как лучше расставлять трассировки, чтобы не загрязнять код?

Добавление трассировки (tracing) в код — мощный инструмент для анализа производительности и диагностики проблем, но важно сделать это аккуратно, чтобы код оставался читаемым и трассировка была полезной. Вот рекомендации по расстановке трассировок, их именованию и поддержанию чистоты кода.


1. Где расставлять трассировки?

1.1. Высокоуровневые операции

Создавайте основные спаны (Span) для ключевых операций:

  • Обработка входящих запросов (HTTP, gRPC и т. д.).
  • Выполнение бизнес-логики.
  • Взаимодействие с базами данных, кэшем или другими внешними системами.

Пример:

1.2. Внешние вызовы

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

  • HTTP-запросы.
  • Вызовы RPC (gRPC, Kafka, etc.).
  • Чтение/запись в базу данных.

Это помогает отслеживать задержки и выявлять узкие места.

1.3. Длительные или критические операции

Если функция содержит долгие или критически важные блоки, добавляйте вложенные спаны внутри них.

Пример:

1.4. Места, где могут возникнуть ошибки

Если есть потенциально проблемные участки кода (например, сложные алгоритмы, нестабильные зависимости), добавляйте спаны и события, чтобы фиксировать их.


2. Как минимизировать загрязнение кода трассировкой?

2.1. Используйте обёртки и хелперы

Создайте утилитарные функции для работы с трассировкой.

Пример:

Теперь вместо дублирования вызова Start:

Вы можете писать:

2.2. Интеграция с middleware

Вместо ручной трассировки в каждом обработчике, интегрируйте трассировку в middleware.

Пример для HTTP:

2.3. Инкапсулируйте трассировку в библиотеках

Если вы пишете универсальные функции или используете библиотеки, интегрируйте трассировку там. Например:

  • Трассировка запросов к базе данных.
  • Трассировка выполнения фоновых задач.

3. Именование спанов

3.1. Следуйте иерархии

Имена должны отражать иерархию операций. Например:

  • "HTTP GET /api/v1/resource" для входящих HTTP-запросов.
  • "Database Query: SELECT * FROM users" для запросов к БД.
  • "BusinessLogic: CalculateScore" для выполнения бизнес-логики.

3.2. Будьте информативными

Имена должны быть конкретными:

  • Используйте глагол: "ProcessOrder", "FetchData".
  • Указывайте ресурс: "Database Query: users table".

3.3. Добавляйте параметры только если это безопасно

Например:

  • Хорошо: "HTTP POST /api/v1/user/{id}".
  • Плохо: "HTTP POST /api/v1/user/123", так как это может утекать в логи и нарушать безопасность.

4. Что включать в атрибуты?

4.1. Общие атрибуты

Для всех спанов:

  • http.method, http.url для HTTP-запросов.
  • db.system, db.statement для запросов к БД.
  • rpc.method, rpc.service для RPC.

Пример:

4.2. Контекстные атрибуты

Добавляйте ключевые параметры, которые помогают понять, что произошло:

  • Идентификаторы: order.id, user.id.
  • Состояния: task.status, operation.phase.

4.3. Ошибки

Если возникает ошибка, фиксируйте её:

5. Уровень детализации трассировки

5.1. Оценивайте производительность

Не добавляйте слишком много спанов для мелких операций, чтобы избежать снижения производительности.

5.2. Делайте трассировку конфигурируемой

Позвольте настраивать уровень детализации через параметры или переменные окружения:

  • "minimal": Только ключевые операции.
  • "detailed": Полная трассировка.

6. Пример структуры трассировки

Вывод

  1. Минимизируйте трассировку в коде:
    • Используйте обёртки и middleware.
    • Инкапсулируйте трассировку в библиотеках.
  2. Имейте понятные имена:
    • Отражайте контекст операции.
    • Не добавляйте лишние детали.
  3. Используйте атрибуты и события:
    • Для ошибок, важных данных и состояния.
  4. Настраивайте уровень детализации:
    • Делайте трассировку детализированной только при необходимости.

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

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