OpenTelemetry 101: что такое трассировка?

  • 7 октября, 13:27
  • 3667
  • 0

OpenTelemetry - это структура с открытым исходным кодом для наблюдения и сбора данных телеметрии для облачного программного обеспечения. Существует три типа данных телеметрии, которые включают сигналы наблюдаемости - трассировку, метрики и журналы. Сегодня более подробно рассмотрим первый из них, трассировку.

Когда мы ссылаемся на трассировку в OpenTelemetry, мы обычно имеем в виду распределенную трассировку (или распределенную трассировку запросов).

Традиционно трассировка - это низкоуровневая практика, используемая разработчиками для профилирования и анализа кода приложения с помощью комбинации специализированных инструментов отладки (таких как dtrace в Linux или ETW в Windows) и методов программирования. Распределенная трассировка, напротив, представляет собой применение этих методов к современным архитектурам на основе микросервисов.

Микросервисы создают значительные проблемы для отслеживания запроса через приложение благодаря распределенному характеру развертывания микросервисов. Рассмотрим традиционное монолитное приложение: поскольку ваш код централизован на одном хосте, диагностика сбоя может быть такой же простой, как отслеживание стека. Когда ваше приложение состоит из десятков, сотен или тысяч сервисов, работающих на многих хостах, вы не можете полагаться на одну трассировку стека - вам нужно что-то, что представляет весь запрос при его перемещении от сервиса к сервису, от компонента к компоненту. Распределенная трассировка решает эту проблему, предоставляя мощные возможности, такие как обнаружение аномалий, распределенное профилирование, моделирование рабочей нагрузки и диагностика стационарных проблем.

Большая часть терминологии и ментальных моделей, которые мы используем для описания распределенной трассировки, связаны с такими системами, как Magpie, X-Trace и Dapper. Dapper, в частности, оказал большое влияние на современную распределенную трассировку, и многие ментальные модели и терминологию, которые использует OpenTelemetry. Цель этих распределенных систем трассировки состояла в том, чтобы профилировать запросы, которые перемещаются между процессами и хостами, и генерировать данные о тех запросах, которые подходят для анализа.

Вышеприведенная диаграмма представляет пример трассировки. Трассировка - это набор связанных промежутков, именованных и синхронизированных операций, представляющих единицу работы в запросе.

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

Чтобы выразить это более конкретно, давайте рассмотрим поток запросов системы, с которой вы можете столкнуться в реальном мире, например, приложения для совместного использования поездок. Когда пользователь запрашивает поездку, начинают выполняться несколько действий - информация передается между службами для аутентификации и авторизации пользователя, проверки его платежной информации, определения местоположения ближайших водителей и отправки одного из них, чтобы забрать пасажыра. Упрощенная схема этой системы и след запроса через нее показаны на следующем рисунке. Как видите, каждая операция генерирует диапазон, представляющий работу, выполняемую во время ее выполнения. Эти промежутки имеют неявные отношения (parent-child) как с начала всего запроса на клиенте, так и от отдельных сервисов в трассировке.

Каждый диапазон в OpenTelemetry содержит несколько частей информации, таких как имя операции, которую он представляет, отметка времени начала и конца, события и атрибуты, которые произошли во время периода, ссылки на другие участки и состояние операции. На приведенной выше диаграмме пунктирные линии, соединяющие отрезки, представляют контекст трассы. Контекст (или контекст трассировки) содержит несколько фрагментов информации, которые могут передаваться между функциями внутри процесса или между процессами через RPC. В дополнение к контексту span, идентификаторам, которые представляют родительскую трассировку и span, контекст может содержать другую информацию о процессе или запросе, например пользовательские метки.

Как было упомянуто ранее, одной из важных особенностей диапазонов является то, что они инкапсулируют другую информацию. Большая часть этой информации требуется - например, имя операции, метки времени запуска и остановки - но некоторые являются необязательными.

OpenTelemetry предлагает два типа данных, Attribute и Event которые являются невероятно ценным, поскольку они помогают контекстуализировать, что произошло во время выполнения, измеренного с помощью одного пролета. 

Attributes (известный как tags в OpenTracing) - это пары ключ-значение, которые можно свободно добавлять в диапазон, чтобы помочь в анализе данных трассировки. Вы можете думать об атрибутах как о данных, которые вы хотели бы в конечном итоге объединить или использовать для фильтрации данных трассировки, таких как идентификатор клиента, имя хоста процесса или что-либо еще, что вы можете себе представить.

Events (известный как logs в OpenTracing) - строки с метками времени, которые можно прикрепить к диапазону, с дополнительным набором Attributes, которые дополнительно его описывают. 

Давайте подведем итоги:

  1. Пролет является основным строительным блоком трассировки. Трассировка - это набор связанных пролетов.
  2. Пролеты - это объекты, представляющие единицу работы, которая является именованной операцией, такой как выполнение микросервиса или вызов функции.
  3. Диапазон без предшественника называется корневым или родительским диапазоном трассы.
  4. Пролеты содержат атрибуты и события, которые описывают и контекстуализируют работу, выполняемую в промежутке.
  5. Трассировщик используется для создания и управления интервалами внутри процесса и через границы процесса с помощью пропагаторов.

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