Распределенная трассировка в GMONIT происходит через отправку спанов от агентов в коллектор. Спаны представляют собой сегменты обработки запроса в сервисе. Они группируются общим trace ID, который передается между сервисами во время обработки конкретного запроса. В коллекторе GMONIT спаны объединяются по trace ID, образуя полные трейсы.
Спаны — это события, объединенные общим идентификатором, называемым trace ID, который сохраняется в контексте одной цепочки запросов. Когда сервис обрабатывает запрос пользователя или инициирует обработку по расписанию, он становится так называемым trace origin. Остальные сервисы, получая запросы от trace origin, сохраняют trace ID и передают его далее, если инициируют запросы к другим сервисам в рамках того же контекста.
Передача trace ID осуществляется в соответствии с рекомендациями W3C. Агенты добавляют в исходящие HTTP-запросы два заголовка:
traceparent— содержит trace ID и идентификатор приложения, которое отправило запрос. Используются для объединения спанов в трейс в правильном порядке.tracestate— содержит дополнительную информацию о трейсе.
Также с помощью SDK можно передавать заголовки traceparent и tracestate не только по HTTP, но и через системы вроде Kafka, объединяя обработку запросов в единый трейс. Однако следует учитывать, что это может увеличить нагрузку на брокер сообщений.
Как и события, трейсы семплируются. Однако для семплирования трейсов важно сохранить целостность всей цепочки обработки запроса, поэтому APM-агенты используют адаптивное семплирование для эффективного захвата системной активности:
- По умолчанию, trace origin агент выбирает 10 трейсов в минуту и учитывает количество транзакций в предыдущую минуту.
- Если, например, в предыдущую минуту было 100 транзакций, агент выберет 1 из каждых 10 для выборки.
- Агенты ограничивают количество спанов до 2000 в минуту, отбрасывая спаны с более низким приоритетом, если это необходимо для сохранения трейсов с высоким приоритетом, что может привести к фрагментации трассировки в интерфейсе.
- Остальные сервисы в цепочке не участвуют в логике семплирования. Они только следуют указаниям trace origin: записывают данные только в случае, если получили запрос с trace id от trace origin.