В этом руководстве вы узнаете, что такое трассировка Jaeger, что такое распределенная трассировка и как настроить ее в вашей системе. Мы рассмотрим пользовательский интерфейс Jaeger и затронем такие продвинутые концепции, как выборка и развертывание в производстве.
Вы покинете это руководство, зная, как создавать диапазоны с помощью OpenTelemetry и отправлять их в трассировку Jaeger для визуализации. И все это с нуля.
- Jaeger Tracing: Содержание
- Что такое распределенная трассировка? Введение
- Что такое егерская трассировка?
- Архитектура трассировки Jaeger
- Запуск Jaeger локально с помощью Docker
- Трассировка Jaeger и OpenTelemetry
- Износ клиента Jaeger в пользу OpenTelemetry Distro:
- Пример трассировки Jaeger на Python
- Обзор пользовательского интерфейса трассировки Jaeger
- Расширенные концепции трассировки Jaeger
- Выборка Jaeger
- Выборка на уровне дистрибутива (SDK)
- Выборка на уровне коллектора
- Производственное развертывание Jaeger Tracing
- Все в одном или отдельные контейнеры?
- Затраты на запуск Jaeger (и почему вам может понадобиться альтернатива)
- Глоссарий трассировки Jaeger
Jaeger Tracing: Содержание
- Что такое распределенная трассировка? Введение
- Что такое Jaeger Tracing?
- Архитектура трассировки Jaeger
- Запуск Jaeger локально с помощью Docker
- Трассировка Jaeger и OpenTelemetry
- Пример трассировки Jaeger на Python
- Обзор пользовательского интерфейса Jaeger Tracing
- Расширенные концепции трассировки Jaeger
- Производственное развертывание Jaeger Tracing
- Затраты на эксплуатацию Jaeger
- Глоссарий по трассировке Jaeger
Что такое распределенная трассировка? Введение
Прежде чем мы начнем объяснять все, что вам нужно знать от 0 до 100 о трассировке Jaeger, важно понять зонтичный термин, частью которого является Jaeger — распределенная трассировка.
В мире микросервисов большинство проблем возникает из-за сетевых проблем и связей между различными микросервисами.
Распределенная архитектура (в отличие от монолита) значительно усложняет поиск корня проблемы.
Чтобы решить эти проблемы, нам нужно увидеть, какой сервис отправил какие параметры другому сервису или компоненту (БД, очередь и т.д.).
Распределенная трассировка помогает нам достичь именно этого, позволяя нам собирать данные из различных частей нашей системы, чтобы обеспечить эту желаемую наблюдаемость в нашей системе. Вы можете думать об этом как о «стеках вызовов» для распределенных сервисов.
Чтобы узнать больше о преимуществах распределенной трассировки по сравнению с журналами, прочтите это краткое руководство.
Кроме того, трассировка — это визуальный инструмент, позволяющий нам визуализировать нашу систему для лучшего понимания взаимосвязей между сервисами, что облегчает расследование и выявление проблем.
Визуализация распределенной трассировки с помощью Aspecto
Что такое егерская трассировка?
Теперь, когда вы знаете, что такое распределенная трассировка, мы можем смело говорить о Jaeger.
Jaeger — это система распределенной трассировки с открытым исходным кодом, созданная компанией Uber в 2015 году.
Модель данных Jaeger совместима с OpenTracing — это спецификация, которая определяет, как будут выглядеть собранные данные трассировки, а также библиотеки реализаций на разных языках.
(Подробнее об OpenTracing и OpenTelemetry позже).
Как и в большинстве систем распределенной трассировки, Jaeger работает с диапазонами и трассировками, как определено в спецификации OpenTracing.
Сфера представляет собой действие (HTTP-запрос, обращение к БД и т.д.) и является самой основной единицей работы Jaeger. Промежуток должен иметь имя операции, время начала и продолжительность.
Трасса — это коллекция/список трасс, связанных отношениями «ребенок/родитель» (ее также можно представить как направленный ациклический граф трасс). Трассировки определяют, как запросы распространяются через наши сервисы и другие компоненты.
Архитектура трассировки Jaeger
Вот как выглядит архитектура Jaeger.
Она состоит из нескольких частей, все из которых я объясню ниже:
-
Клиент Jaeger: Клиенты Jaeger — это библиотеки, написанные на различных языках программирования, которые отвечают за создание спанов. Примечание: в настоящее время они устаревают в пользу OpenTelemetry. Опять же, подробнее об этом позже.
-
Агент Jaeger: Jaeger agent — это сетевой демон, который слушает пролеты, полученные от клиента Jaeger по UDP. Он собирает их и затем отправляет коллектору.
-
Jaeger Collector: Коллектор Jaeger отвечает за получение трасс от агента Jaeger и выполняет их проверку и преобразование. После этого он сохраняет их в выбранных резервных хранилищах.
-
Бэкенды хранилищ: Jaeger поддерживает различные бэкенды хранения, которые хранят пролеты и трассы для последующего их извлечения. Поддерживаются такие хранилища, как In-Memory, Cassandra, Elasticsearch и Kafka (только в качестве буфера для другого хранилища, например, Cassandra или elasticsearch).
-
Jaeger Query: Это сервис, отвечающий за получение трасс из бэкенда хранилища jaeger и обеспечение их доступности для пользовательского интерфейса jaeger.
-
Jaeger UI: React-приложение, позволяющее визуализировать трассы и анализировать их. Полезно для отладки системных проблем.
-
Ingester: Ingester актуален только в том случае, если мы используем Kafka в качестве буфера между коллектором и бэкендом хранилища. Он отвечает за получение данных из Kafka и их загрузку в бэкенд хранилища. Более подробную информацию можно найти в официальной документации по трассировке Jaeger.
Запуск Jaeger локально с помощью Docker
Jaeger поставляется с готовым к использованию образом docker, который содержит все компоненты, необходимые для работы Jaeger.
Запустить его на локальной машине очень просто:
docker run -d --name jaeger
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411
-p 5775:5775/udp
-p 6831:6831/udp
-p 6832:6832/udp
-p 5778:5778
-p 16686:16686
-p 14250:14250
-p 14268:14268
-p 14269:14269
-p 9411:9411
jaegertracing/all-in-one:1.30
Затем вы можете просто открыть пользовательский интерфейс jaeger на сайте http://localhost:16686.
Ниже вы узнаете, как отправлять на него данные с помощью Python и OpenTelemetry.
Трассировка Jaeger и OpenTelemetry
Да, вы правы. Я уже упоминал, что модель данных Jaeger совместима со спецификацией OpenTracing.
Возможно, вы уже знаете, что OpenTracing и OpenCensus объединились в OpenTelemetry, и задаетесь вопросом, почему Jaeger использует OpenTracing и можно ли использовать OpenTelemetry для создания отчетов в jaeger.
Что касается того, почему Jaeger использует OpenTracing — ну, причина в том, что Jaeger существует с момента вышеупомянутого слияния.
Чтобы получить полное представление об OpenTelemetry, что это такое, его компонентах и как его использовать, прочитайте это полное руководство.
Износ клиента Jaeger в пользу OpenTelemetry Distro:
Я также упоминал, что клиенты Jaeger теперь устаревают.
Более подробную информацию об этом можно найти здесь, но, по сути, идея заключается в том, что теперь вы должны использовать OpenTelemetry SDK на выбранном вами языке программирования вместе с Jaeger экспортером.
Таким образом, созданные пролеты будут преобразованы в формат, с которым умеет работать Jaeger, пройдут весь путь до коллектора Jaeger и затем до бэкенда хранилища.
На момент написания этой статьи коллектор OpenTelemetry не рассматривается как замена коллектору Jaeger [1]. В будущем планируется использовать коллектор OpenTelemetry вместо коллектора Jaeger, который будет устаревшим [2].
Если вы не можете ждать и хотите попробовать использовать коллектор OpenTelemetry с Jaeger сейчас — смотрите это руководство.
Пример трассировки Jaeger на Python
Здесь приведен пример создания пролетов и отправки их в Jaeger на языке Python. Обратите внимание, что вы также можете использовать автоматические инструменты и по-прежнему использовать экспортер Jaeger (при условии, что вы запускаете Jaeger локально, как показано выше):
# jaeger_tracing.py
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
trace.set_tracer_provider(
TracerProvider(
resource=Resource.create({SERVICE_NAME: "my-hello-service"})
)
)
jaeger_exporter = JaegerExporter(
agent_host_name="localhost",
agent_port=6831,
)
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(jaeger_exporter)
)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("rootSpan"):
with tracer.start_as_current_span("childSpan"):
print("Hello world!")
Вот как они будут выглядеть в пользовательском интерфейсе Jaeger:
Чтобы узнать, как вручную использовать OpenTelemetry в Python с нуля, прочитайте это руководство.
Обзор пользовательского интерфейса трассировки Jaeger
Jaeger UI — это мощный инструмент для отладки и лучшего понимания наших распределенных сервисов.
Вот что вам нужно знать о нем:
Панель поиска:
Вы можете использовать панель поиска для поиска трасс с определенными свойствами.
От какого сервиса они исходят, какая операция была выполнена, конкретные теги, которые были включены в трассу (например, код состояния http), как долго в прошлом искать и ограничение количества результатов.
Когда вы закончите определять свой поиск в этой панели, нажмите кнопку Найти трассы.
Раздел результатов поиска:
В этом примере я выбрал запрос к службе jaeger-query. Я могу увидеть свои следы на временной шкале или в виде списка. Нажмите на нужный след, чтобы просмотреть его подробнее.
Вид конкретной трассы:
Когда вы найдете конкретную трассу, в которой, по вашему мнению, может быть проблема, и нажмете на нее, вы увидите экран, который выглядит следующим образом:
Здесь вы можете найти конкретную информацию о времени выполнения, какие вызовы были сделаны и их продолжительность, конкретные свойства, такие как код состояния http, путь маршрута (в случае вызова http) и многое другое.
Не стесняйтесь, играйте и исследуйте сами с вашими реальными данными.
Расширенные концепции трассировки Jaeger
Выборка Jaeger
Выборка сама по себе является сложным аспектом.
Вы должны знать, что есть два места, где вы можете принять решение о выборке: в коде клиента (на уровне дистрибутива — выборка на основе головы) и на уровне коллектора (выборка на основе хвоста).
Выборка на уровне дистрибутива (SDK)
Устаревающий клиент Jaeger имеет 4 режима выборки:
-
Remote: по умолчанию, используется для того, чтобы сообщить клиенту Jaeger, что выборка производится из бэкенда Jaeger. Подробнее об этом мы поговорим, когда будем обсуждать выборку на основе хвостов.
-
Постоянный: либо берет все следы, либо не берет ни одного. Ничего промежуточного. Получает 1 для всех и 0 для ни одного.
-
Ограничение скорости: выберите, сколько следов будет отбираться в секунду.
-
Вероятностный: выберите процент трасс, которые будут взяты в выборку, например, выберите 0.1, чтобы из каждых 10 трасс в выборку попала 1.
Выборка на уровне коллектора
Если мы решили включить выборку на коллекторе Jaeger, Jaeger поддерживает 2 режима: выборка по файлам и адаптивная выборка.
Выборка из файла — вы указываете путь к файлу конфигурации коллектора, который содержит конфигурацию выборки для каждого сервиса и каждой операции.
Адаптивная выборка — позволяет Jaeger узнать объем трафика, который получает каждая конечная точка, и рассчитать наиболее подходящую скорость для этой конечной точки. Обратите внимание, что на момент написания статьи эту функцию поддерживают только бэкенды Memory и Cassandra.
Более подробную информацию о Jaeger sampling можно найти здесь: https://www.jaegertracing.io/docs/1.30/sampling/.
Производственное развертывание Jaeger Tracing
Все в одном или отдельные контейнеры?
Jaeger all-in-one — это предварительно созданный образ Docker, содержащий все компоненты Jaeger, необходимые для быстрой работы с трассировкой Jaeger путем запуска одной команды.
Многие люди (включая меня самого) спрашивают себя, как правильно запускать Jaeger в продакшене. Безопасно ли использовать Jaeger all-in-one в производстве и т.д.
Хотя на момент написания статьи я не смог найти официального ответа, использовать или не использовать его, я думаю, что правильный ответ — можно, но, скорее всего, не стоит.
Использование его в производстве означает, что у вас есть единственный источник сбоев, который не распределен.
Теоретически, проблема даже с Jaeger UI может разрушить весь контейнер, и вы не сможете получить критические пролеты, созданные вашей системой.
Лучшим способом решения этой проблемы будет запуск каждого образа по отдельности, без «все в одном».
Затраты на запуск Jaeger (и почему вам может понадобиться альтернатива)
Как вы уже, наверное, поняли, Jaeger — мощный, но сложный зверь.
Его развертывание и поддержка отнимает много времени и может быть дорогостоящей, поскольку он включает в себя хранилище, вычисления и обычно требует постоянного времени работы для производственного использования.
Конечно, нет такой суммы, которую я мог бы измерить сейчас и утверждать, что она подходит всем, поскольку она зависит от вашего поставщика облачных услуг и выбора инфраструктуры.
Однако, возможно, вы будете рады узнать, что вам не придется делать все это самостоятельно.
Aspecto имеет бесплатный вечный уровень и предоставляет все, что включено в Jaeger и даже больше. Это что-то вроде Jaeger на стероидах.
Не стесняйтесь, попробуйте сами и подпишитесь на бесплатный вечный план.
Краткий обзор Aspecto
Если у вас есть вопросы, обращайтесь ко мне в Twitter @thetomzach, а также присоединяйтесь к нашему slack-каналу #OpenTelemetry-Bootcamp, чтобы быть в курсе того, что происходит в области наблюдаемости.
Глоссарий трассировки Jaeger
Span — описание действия/операции, которая происходит в нашей системе; HTTP-запрос или операция базы данных, которая охватывает время (начинается в X и имеет продолжительность Y миллисекунд). Обычно это родительский и/или дочерний элемент другого диапазона.
Трассировка — дерево/список диапазонов, представляющих последовательность запросов по мере их обработки различными службами и компонентами нашей системы. Например, отправка API-вызова в user-service привела к запросу в БД к users-db. Это «стеки вызовов» для распределенных сервисов.
Наблюдаемость — мера того, насколько хорошо мы можем понять внутренние состояния системы на основе ее внешних результатов. Когда у вас есть журналы, метрики и трассировки, у вас есть «3 столпа наблюдаемости».
OpenTelemetry — OpenTelemetry — это инструмент с открытым исходным кодом. Коллекция инструментов, API и SDK, созданная под руководством CNCF (Cloud Native Computing Function). OpenTelemetry позволяет автоматически собирать и генерировать трассировки, журналы и метрики с помощью единой спецификации.
OpenTracing — проект с открытым исходным кодом для распределенной трассировки. Он был устаревшим и «влился» в OpenTelemetry. OpenTelemetry предлагает обратную совместимость с OpenTracing.