Jaeger для отслеживания ссылок на микросервисы

монитор
Jaeger для отслеживания ссылок на микросервисы

Обзор Егеря

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

1.1 Концепция Егеря

Jaeger, вдохновленная Dapper и OpenZipkin, представляет собой распределенную систему отслеживания, выпущенную Uber Technologies с открытым исходным кодом. Он используется для мониторинга и диагностики распределенных систем на основе микросервисов, в том числе:

  • Распространение распределенного контекста
  • Распределенный мониторинг транзакций
  • Анализ причин
  • Анализ зависимостей сервисов Оптимизация производительности/задержек

1.2 Особенности

1.2.1 Высокая масштабируемость

Серверная часть Jaeger разработана без единой точки отказа и может масштабироваться в соответствии с потребностями бизнеса. Например, любая конкретная установка Jaeger в Uber обычно обрабатывает миллиарды спанов в день.

1.2.2 Встроенная поддержка OpenTracing

Серверная часть Jaeger, веб-интерфейс и библиотека инструментов полностью разработаны для поддержки стандарта OpenTracing.

  • Представлять трассировки в виде ориентированных ациклических графов (а не только деревьев) с помощью ссылок на интервалы.

  • Поддержка строго типизированных тегов span и структурированных журналов через багаж

  • Поддержка общего распределенного механизма распространения контекста

1.2.3 Несколько серверных хранилищ

Jaeger поддерживает две популярные базы данных NoSQL с открытым исходным кодом в качестве серверных частей хранилища для отслеживания: Cassandra 3.4+ и Elasticsearch 5.x/6.x/7.x. Эксперименты сообщества с другими базами данных, такими как ScyllaDB, InfluxDB, Amazon DynamoDB, продолжаются. Jaeger также поставляется с простым хранилищем памяти для тестирования настроек.

1.2.4 Современный пользовательский интерфейс

Веб-интерфейс Jaeger реализован на Javascript с использованием популярных фреймворков с открытым исходным кодом, таких как React. В версии 1.0 было выпущено несколько улучшений производительности, позволяющих пользовательскому интерфейсу эффективно обрабатывать большие объемы данных и отображать трассы с тысячами интервалов (например, мы попробовали трассировку с 80 000 интервалов).

1.2.5 Собственное облачное развертывание

Серверная часть Jaeger распространяется в виде набора образов Docker. Эти двоичные файлы поддерживают различные методы настройки, включая параметры командной строки, переменные среды и файлы конфигурации в различных форматах (yaml, toml и т. д.). Шаблоны Kubernetes и диаграммы Helm помогают развернуть его в кластере Kubernetes.

1.2.6 Наблюдаемость

Все бэкэнд-компоненты Jaeger по умолчанию предоставляют метрики Prometheus (другие метрики также поддерживаются). Используйте библиотеку структурированного ведения журналов zap для записи журналов в стандартный вывод.

1.2.7 Безопасность

Сторонние аудиты безопасности Jaeger доступны по адресу https://github.com/jaegertracing/security-audits. См. вопрос № 1718 для сводки механизмов безопасности, доступных в Jaeger.

1.2.8 Обратная совместимость с Zipkin

Хотя мы рекомендуем использовать API OpenTracing для инструментирования вашего приложения и привязки к клиентской библиотеке Jaeger, чтобы воспользоваться расширенными функциями, недоступными в других местах, если ваша организация уже вложила средства в инструментирование с использованием библиотеки Zipkin, вам не нужно переписывать весь код. . Jaeger обеспечивает обратную совместимость с Zipkin, принимая диапазоны в формате Zipkin (Thrift или JSON v1/v2) по HTTP. Переключение с бэкенда Zipkin — это просто вопрос маршрутизации трафика из библиотеки Zipkin на бэкэнд Jaeger.

Два быстрых старта

Ваше приложение должно быть оснащено инструментами, прежде чем оно сможет отправлять данные трассировки на серверную часть Jaeger. Ознакомьтесь с разделом «Клиентские библиотеки», чтобы узнать, как использовать OpenTracing API, а также как инициализировать и настроить трассировщик Jaeger.

2.1 Введение

Ваше приложение должно быть оснащено инструментами, прежде чем оно сможет отправлять данные трассировки на серверную часть Jaeger. Ознакомьтесь с разделом «Клиентские библиотеки», чтобы узнать, как использовать OpenTracing API, а также как инициализировать и настроить трассировщик Jaeger.

2.2 All in One

All-in-one — это исполняемый файл для быстрого локального тестирования с компонентами хранилища в памяти, которые запускают пользовательский интерфейс Jaeger, коллекторы, запросы и агенты. Самый простой способ начать работу с многофункциональным устройством — использовать готовый образ (одна командная строка), опубликованный на DockerHub.

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.14

Or run the jaeger-all-in-one(.exe) executable from the binary distribution archives:

jaeger-all-in-one --collector.zipkin.http-port=9411

You can then navigate to http://localhost:16686 to access the Jaeger UI.

Контейнеры должны открывать порты

Port Protocol Component Function
5775 UDP agent accept zipkin.thrift over compact thrift protocol (deprecated, used by legacy clients only)
6831 UDP agent accept jaeger.thrift over compact thrift protocol
6832 UDP agent accept jaeger.thrift over binary thrift protocol
5778 HTTP agent serve configs
16686 HTTP query serve frontend
14268 HTTP collector accept jaeger.thrift directly from clients
14250 HTTP collector accept model.proto
9411 HTTP collector Zipkin compatible endpoint (optional)

2.3 Kubernetes and OpenShift

2.4 Пример приложения: HotROD

HotROD (Ride on Demand) — демонстрационное приложение, состоящее из нескольких микросервисов и иллюстрирующее использование OpenTracing API. Учебник / пошаговое руководство представлено в сообщении блога:OpenTracing API.способ проведения HotROD. Он может работать автономно, но для просмотра трассировки требуется серверная часть Jaeger.Take OpenTracing for a HotROD ride

2.4.1 Особенности

  • График зависимости от приводной данных архитектуру системы найден
  • Посмотреть график и ошибку запроса; понять работу приложения.
  • Найдите источники задержки и отсутствия параллелизма.
  • Ведение журнала с высокой степенью контекстуализации.
  • Используйте распределение багажа, чтобы:
    • Диагностика конфликтов (очередей) между запросами.
    • Собственное время, затраченное сервисом
  • Используйте библиотеки с открытым исходным кодом с интеграцией OpenTracing, чтобы получить бесплатные инструменты, не зависящие от поставщика.

2.4.2 Предпосылки

  • Для запуска из исходного кода на вашем компьютере должен быть установлен Go 1.11 или более поздней версии.
  • Для просмотра трассировок требуется работающий бэкэнд Jaeger.

2.4.3 Бег

2.4.3.1 Исходный код

mkdir -p $GOPATH/src/github.com/jaegertracing
cd $GOPATH/src/github.com/jaegertracing
git clone git@github.com:jaegertracing/jaeger.git jaeger
cd jaeger
make install
go run ./examples/hotrod/main.go all

2.4.3.2 docker

docker run --rm -it \
  --link jaeger \
  -p8080-8083:8080-8083 \
  -e JAEGER_AGENT_HOST="jaeger" \
  jaegertracing/example-hotrod:1.14 \
  all

2.4.3.3 Двоичный

Run example-hotrod(.exe) executable from the binary distribution archives:

$ example-hotrod all

Then navigate to http://localhost:8080.

2.5 Миграция с Zipkin

Служба сборщика предоставляет совместимый с Zipkin REST API/api/v1/spans, который принимает Thrift и JSON. Также есть /api/v2/spans для JSON и Proto. По умолчанию он отключен. Его можно включить с помощью --collector.zipkin.http-port=9411.

Zipkin Thrift IDL and Zipkin Proto IDL files can be found in jaegertracing/jaeger-idlрепозиторий, они совместимы сopenzipkin/zipkin-api Thrift and Proto.

Три Архитектуры

3.1 Терминология

3.1.1 Span

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

图片描述

Каждый Span содержит следующие объекты:

  • Имя операции: имя операции (также известное как имя диапазона).
  • Метка времени начала: время начала.
  • Отметка времени окончания: время окончания.
  • Тег Span: набор тегов Span, состоящий из набора пар ключ-значение. В паре ключ-значение ключ должен быть строкой, а значение может быть строкой, логическим значением или числом.
  • Журнал Span: набор журналов Span. Каждая операция журнала содержит пару ключ-значение и отметку времени. В паре ключ-значение ключ должен быть строкой, а значение может быть любого типа.
  • SpanContext: объект контекста панорамирования. Каждый SpanContext содержит следующее состояние:
    • Для реализации любого OpenTrawacing вам необходимо полагаться на уникальный диапазон для передачи состояния текущей цепочки вызовов на границе процесса (например: Trace и ID SPARE).
    • Функция багажа - это сопровождающие данные трассировки, является ключевым значением коллекции, существует в следах, также требует перекрестной обработки граничной передачи.
  • Ссылки (связь между спанами): связанные ноль или более спанов (связь между спанами устанавливается через SpanContext).

3.1.2 Trace

Трассировка — это путь данных/выполнения через систему, и ее можно рассматривать как направленный ациклический граф отрезков.

3.2 Компоненты

Jaeger можно развернуть как двоичный файл «все в одном», когда все серверные компоненты Jaeger работают в одном процессе, или как масштабируемую распределенную систему, как описано ниже. Существует два основных варианта развертывания:

  • Сборщик пишет напрямую в хранилище.

图片描述

  • Сборщик пишет в Kafka в качестве предварительного буфера.

图片描述

В этом разделе подробно описаны компоненты Jaeger и их взаимосвязь. Он организован в порядке, в котором ваше приложение взаимодействует с ним.

3.2.1 Jaeger client libraries

Клиент Jaeger — это языковая реализация OpenTracing API. Их можно использовать для инструментирования приложений для распределенной трассировки либо вручную, либо с помощью различных существующих платформ с открытым исходным кодом, которые интегрируются с OpenTracing (например, Flask, Dropwizard, gRPC и т. д.).

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

Инструмент имеет минимальные накладные расходы и предназначен для постоянной работы в производстве. Обратите внимание, что хотя все трассы были сгенерированы, выборка производилась только для некоторых из них. Выборка трассы помечает трассу для дальнейшей обработки и хранения. По умолчанию клиент Jaeger производит выборку 0,1% трассировок (1 из каждых 1000) и может получить политику выборки от агента.

图片描述

3.2.2 Agent

Агент Jaeger — это сетевой демон, который прослушивает диапазоны, отправленные по UDP, и отправляет их сборщику пакетами. Он предназначен для развертывания на всех хостах в качестве компонента инфраструктуры. Этот прокси абстрагирует маршрутизацию и обнаружение сборщика от клиента.

3.2.3 Collector

Сборщик Jaeger получает трассировки от агентов Jaeger и пропускает их через конвейер обработки. В настоящее время наш конвейер проверяет трассировки, индексирует их, выполняет любые преобразования и, наконец, сохраняет их. Устройства хранения Jaeger являются сменными компонентами и в настоящее время поддерживают Cassandra, Elasticsearch и Kafka.

3.2.4 Query

Query — это служба, которая извлекает трассировки из хранилища и размещает пользовательский интерфейс для отображения трассировок.

3.2.5 Ingester

Ingester is a service that reads from Kafka topic and writes to another storage backend (Cassandra, Elasticsearch).

3.3 Sampling

Библиотека Jaeger реализует последовательную предварительную (или основанную на заголовке) выборку. Например, предположим, что у нас есть простой граф вызовов, где служба A вызывает службу B, которая вызывает службу C: A->B->C. Когда служба A получает запрос, который не содержит информации о трассировке, средство отслеживания Jaeger запускает новую трассировку, присваивает ей случайный идентификатор трассировки, а затем принимает решение о выборке на основе установленной в данный момент политики выборки. Решение о выборке будет распространено на B и C вместе с запросом, поэтому эти службы не будут снова принимать решение о выборке, но будут уважать решение, принятое вышестоящей службой A. Такой подход гарантирует, что при выборке трассы все ее интервалы будут записаны в серверной части. Если бы каждая служба принимала собственное решение о выборке, мы бы редко получали полную трассировку на серверной части.

3.3.1 Конфигурация выборки клиентов

При создании экземпляра трекера с объектом конфигурации тип сэмплера можно выбрать с помощью свойств sampler.type и sampler.param. Библиотека Jaeger поддерживает следующие сэмплеры:

  • Constant (sampler.type=const) sampler always makes the same decision for all traces. It either samples all traces (sampler.param=1) or none of them (sampler.param=0).
  • Probabilistic (sampler.type=probabilistic) sampler makes a random sampling decision with the probability of sampling equal to the value of sampler.param property. For example, with sampler.param=0.1 approximately 1 in 10 traces will be sampled.
  • Rate Limiting (sampler.type=ratelimiting) sampler uses a leaky bucket rate limiter to ensure that traces are sampled with a certain constant rate. For example, when sampler.param=2.0 it will sample requests with the rate of 2 traces per second.
  • Remote (sampler.type=remote, which is also the default) sampler consults Jaeger agent for the appropriate sampling strategy to use in the current service. This allows controlling the sampling strategies in the services from a central configuration in Jaeger backend, or even dynamically (see Adaptive Sampling).

3.3.2 Пример адаптации

Адаптивный сэмплер — это составной сэмплер, который сочетает в себе две функции:

  • Он принимает решения о выборке на основе каждой операции (т. е. на основе имени операции диапазона). Это особенно полезно в службах API, чьи конечные точки могут иметь очень разный трафик, а использование одного вероятностного семплера для всей службы может привести к голоданию некоторых конечных точек с низким числом запросов в секунду (никогда не сэмплировать).
  • Он поддерживает самую низкую гарантированную частоту дискретизации, например всегда допускает до N трассировок в секунду, а затем с некоторой вероятностью производит выборку всех частот дискретизации (все на операцию, а не на сервис).

Каждый рабочий параметр можно настроить статически или периодически извлекать из бэкенда Jaeger с помощью удаленного сэмплера. Адаптивный сэмплер предназначен для использования с готовящейся к выпуску адаптивной функцией сэмплирования серверной части Jaeger.

3.3.3 Пример конфигурации коллекции

Сборщики могут быть созданы со стратегией статической выборки с помощью параметра --sampling.strategies-file (который распространяется на соответствующую службу, если он настроен с удаленным сэмплером). Для этого параметра требуется путь к файлу json с определенной стратегией выборки.

{
  "service_strategies": [
    {
      "service": "foo",
      "type": "probabilistic",
      "param": 0.8,
      "operation_strategies": [
        {
          "operation": "op1",
          "type": "probabilistic",
          "param": 0.2
        },
        {
          "operation": "op2",
          "type": "probabilistic",
          "param": 0.4
        }
      ]
    },
    {
      "service": "bar",
      "type": "ratelimiting",
      "param": 5
    }
  ],
  "default_strategy": {
    "type": "probabilistic",
    "param": 0.5
  }
}

Четыре пробных теста

доступ:http://139.9.163.110:8080/

图片描述

图片描述

图片描述

Для примера кода, пожалуйста, обратитесь к примеру go boss:GitHub.com/Бессердечный не…

Ссылка на ссылку