Садржај поста
Всем привет! Сегодня хочется немного подушнить) Поговорим про трейсинг и OpenTelemetry. Трейсинг — это подход, позволяющий смотреть, как выполнялся тот или иной запрос, какие вызовы происходили и какие были взаимодействия между микросервисами. Сейчас трейсинг — это уже база для observability микросервисной архитектуры. Вся магия работает на двух основных понятиях: трейс и спан. Трейс, как можно догадаться, это уникальный путь запроса, который состоит из спанов — конкретных шагов выполнения. Чаще всего спаны содержат информацию о запросах к БД, внешних вызовах к другим сервисам или же просто ключевых моментах работы сервиса. Сейчас становится уже стандартом использовать OpenTelemetry. Огромное SDK позволяет почти не думать о том, как собирать трейсы, как связывать спаны друг с другом, куда сохранять трейсы, а также как распространять трейсы между микросервисами при запросах. Казалось бы, всё круто! Но есть нюанс… Если вы пользуетесь стандартными инструментами OpenTelemetry, то с минимальными настройками вы сможете настроить трейсы для синхронных вызовов, но что делать с асинхронными задачами? Под асинхронными задачами я имею в виду те задачи, которые запускаются где-то в фоновых процессах, воркерах и зачастую фактически выполняются в другом месте (контейнере или сервере). Например, у нас есть очередь с использованием базы данных: один процесс записывает запись в БД, а другой периодически обращается к БД и выполняет какую-то работу. Если мы хотим в одном трейсе видеть все процессы, включая фоновые, нам придётся подумать, как именно наша система трейсинга узнает, что трейсы на самом деле связаны? Для этого нам на помощь приходит механизм Propagation (если быть честным, то под капотом мы его же используем и для синхронных вызовов, но сейчас опустим это). Идея очень простая: давайте просто сохраним ID в какую-нибудь промежуточную структуру, сохраним её, например, в БД, а потом в другом процессе извлечём и скажем OpenTelemetry: “Привяжи спаны к трейсу, который мы тебе даём”. Такой подход позволяет наглядно видеть, какие процессы вообще происходят в нашей системе, и делает проще поиск проблем в нашем сложном распределённом мире! Ну всё, подушнил немного и хватит😂 А вы используете трейсинг в своих проектах? И если да, то настраиваете ли его для асинхронных задач? Оставляйте свои комментарии, буду рад обсудить данный подход!