Откуда начинать внедрять трассировку в микросервисе?
Чтобы минимальное представление иметь о работе системы хорошо иметь трейсы на всех граничных точках сервиса ( входных и выходных ). Так мы видим, через какой “порт” входят данные и через какие “выходы” уходят. Это касается как внутренних, так и внешних сервисов. Во внутренние сервисы мы передаем трейс и вызываемый сервис встраивается в него, потому мы можем видеть вызовы через все наши сервисы. Для внешних сервисов - это позволяет отслеживать уход данных в другую систему, а также замерять задержку обработки запроса внешней системой и определять ошибки (указывает, что внешняя система сломала всю цепочку или из-за нее мы тормозим).
Пример: трейс для “входа” запрос веб-сервера или grpc-сервера, трейс для “выхода” оборачиваем http-клиент или grpc-клиент (в параметрах важно указывать имя того сервиса в котором находиться клиент, а не куда он смотрит)
Что покрывать трейсами далее?
Следующим шагом хорошо покрыть трейсингом (добавить спаны) наиболее важный для бизнеса процесс. Трейс может содержать несколько спанов (отрезков). Имя спана не обязательно должно быть именем функции, лучше когда это имя отражает этап бизнес процесса (так вам не нужно будет переводить с языка разработчика на язык бизнеса при выяснении). Добавляйте важные атрибуты (теги ключ/значение) в трейсы. Когда вы добавляете атрибут в спан он становиться атрибутом всего трейса (пример, session.id, country, payment.id, customer.id). Избегайте закладывать в атрибуты трейса огромные объекты, по таким атрибутам должно быть легко искать, а большие объекты при необходимости помещайте в логи.
Логи и трейсы - как связывать? (на примере golang/datadog)
Выполняйте связывание трейсов и логов, тогда вам будет достаточно открыть трейс и получить все логи всех задействованных сервисов. В Go нет механизма автоматического обогащения логов информацией о трейсах, потому нужно добавлять в логи метаданные dd.trace_id, dd.span_id вручную. Данные о трассировке передаются через контекст. Вы получаете из контекста span и берете оттуда информацию о dd.trace_id, dd.span_id для добавления в лог. Связывайте в middelware/interceptor для серверных запросов и также в местах обработки паник.
Может ли трейсинг заменить логи?
Нет. У них разные задачи. Если трейсинг помогает быстро понять, что происходило и как, в каком месте (сервисе) возникла ошибка, то логи описывают в подробностях, что происходило, предоставляют промежуточные данные полезные для понимания состояния процесса.