OpenTelemetry (OTel) — это проект с открытым исходным кодом, направленный на предоставление независимого от поставщика стандарта для сбора, обработки и экспорта телеметрических данных в распределённых системах, таких как архитектуры микросервисов. Он помогает разработчикам проще анализировать производительность и поведение программного обеспечения, что облегчает диагностику и устранение проблем в приложениях.
| Термин | Объяснение |
|---|---|
| Trace | Данные, отправляемые на OTel Server, представляющие собой набор связанных событий или операций, используемых для отслеживания потока запросов в распределённых системах; каждый Trace состоит из нескольких Spans. |
| Span | Независимая операция или событие внутри Trace, включающая время начала, длительность и другую релевантную информацию. |
| OTel Server | Сервер OTel, способный принимать и хранить данные Trace, например Jaeger, Prometheus и др. |
| Jaeger | Система распределённого трассирования с открытым исходным кодом, используемая для мониторинга и отладки архитектур микросервисов, поддерживающая интеграцию с OpenTelemetry. |
| Attributes | Пары ключ-значение, прикреплённые к Trace или Span для предоставления дополнительной контекстной информации. Включает Resource Attributes и Span Attributes; см. Attributes для подробностей. |
| Sampler | Компонент стратегии, определяющий, следует ли сэмплировать и отправлять Trace. Можно настроить различные стратегии сэмплирования, такие как полное сэмплирование, пропорциональное и др. |
| ALB (Another Load Balancer) | Программное или аппаратное устройство, распределяющее сетевые запросы между доступными узлами в кластере; балансировщик нагрузки (ALB), используемый на платформе, является программным балансировщиком уровня 7, который можно настроить для мониторинга трафика с помощью OTel. ALB поддерживает отправку Trace на указанный Collector и позволяет использовать разные стратегии сэмплирования; также поддерживает настройку отправки Trace на уровне Ingress. |
| FT (Frontend) | Конфигурация порта для ALB, задающая настройки на уровне порта. |
| Rule | Правила маршрутизации на порту (FT), используемые для сопоставления конкретных маршрутов. |
| HotROD (Rides on Demand) | Пример приложения, предоставляемый Jaeger для демонстрации использования распределённого трассирования; подробности см. в Hot R.O.D. - Rides on Demand. |
| hotrod-with-proxy | Указывает адреса внутренних микросервисов HotROD через переменные окружения; подробности см. в hotrod-with-proxy. |
Убедитесь, что существует работоспособный ALB: Создайте или используйте существующий ALB, имя которого в данном документе заменено на <otel-alb>. Инструкции по созданию ALB см. в Deploy ALB.
Убедитесь, что имеется адрес сервера отчёта данных OTel: Этот адрес далее будет называться <jaeger-server>.
На Master-узле кластера используйте CLI для выполнения команды редактирования конфигурации ALB:
Добавьте следующие поля в раздел spec.config:
Пример окончательной конфигурации:
Выполните команду для сохранения изменений:
После обновления ALB по умолчанию будет включён OpenTelemetry, и вся информация о Trace запросов будет отправляться на Jaeger Server.
Включение или отключение OTel на Ingress
Настройка включения OTel на Ingress позволяет лучше мониторить и отлаживать поток запросов приложений, выявляя узкие места производительности или ошибки путём трассировки запросов при их прохождении между сервисами.
Процедура
Добавьте следующую аннотацию в поле metadata.annotations Ingress:
Объяснение параметра:
true контроллер Ingress включает функциональность OpenTelemetry при обработке запросов через этот Ingress, что означает сбор и отправку информации о Trace запросов. При значении false или отсутствии этой аннотации сбор и отправка Trace не выполняются.Включение или отключение доверия OTel на Ingress
OTel Trust определяет, доверяет ли Ingress и использует ли информацию Trace (например, trace ID) из входящих запросов.
Процедура
Добавьте следующую аннотацию в поле metadata.annotations Ingress:
Объяснение параметра:
true Ingress продолжает использовать уже существующую информацию Trace, что помогает поддерживать согласованность в межсервисном трассировании, позволяя полностью проследить и проанализировать всю цепочку запросов в системе распределённого трассирования. При значении false для запроса будет сгенерирована новая информация трассировки, что может привести к тому, что запрос будет рассматриваться как часть новой цепочки трассировки после входа в Ingress, прерывая непрерывность межсервисного трассирования.Добавление различных конфигураций OTel на Ingress
Эта настройка позволяет кастомизировать поведение OTel и методику экспорта данных для разных ресурсов Ingress, обеспечивая тонкий контроль над стратегией трассирования или целевым назначением для каждого сервиса.
Процедура
Добавьте следующую конфигурацию в поле metadata.annotations Ingress:
Объяснение параметров:
Ниже приведена полная структура конфигурации OTel, которая может использоваться для определения включения и использования возможностей OTel в приложениях.
На Master-узле кластера выполните команду CLI для получения полной структуры конфигурации OTel:
Результат:
Объяснение параметров:
| Параметр | Описание |
|---|---|
| otel.enable | Включение функциональности OTel. |
| exporter.collector.address | Адрес сервера отчёта данных OTel, поддерживает протоколы http/https и доменные имена. |
| flags.hide_upstream_attrs | Отчёт информации о правилах upstream. |
| flag.notrust_incoming_span | Доверие и использование информации Trace OTel (например, trace ID) из входящих запросов. |
| flags.report_http_request_header | Отчёт заголовков запросов. |
| flags.report_http_response_header | Отчёт заголовков ответов. |
| sampler.name | Имя стратегии сэмплирования; подробности см. в Sampling Strategies. |
| sampler.options.fraction | Доля сэмплирования. |
| sampler.options.parent_name | Родительская стратегия для стратегий parent_base. |
По умолчанию, если в ALB настроены определённые параметры OTel, а в FT они не настроены, FT наследует параметры от ALB как свою конфигурацию; то есть FT наследует конфигурацию ALB, а Rule может наследовать конфигурации как от ALB, так и от FT.
ALB: Конфигурация на ALB обычно глобальная и по умолчанию. Здесь можно настроить глобальные параметры, например адреса Collector, которые будут унаследованы нижестоящими FT и Rule.
FT: FT может наследовать конфигурации от ALB, то есть параметры OTel, не настроенные в FT, будут использовать настройки ALB. При этом FT можно дополнительно уточнять; например, можно выборочно включать или отключать OTel на FT без влияния на другие FT или глобальные настройки ALB.
Rule: Rule может наследовать конфигурации как от ALB, так и от FT. При этом Rule также можно уточнять; например, конкретное правило может отказаться от доверия входящей информации Trace OTel или изменить стратегии сэмплирования.
Процедура
Настройте поле spec.config.otel в YAML-файлах ALB, FT и Rule для добавления конфигурации, связанной с OTel.
| Параметр | Объяснение |
|---|---|
| always on | Всегда отправлять все данные трассировки. |
| always off | Никогда не отправлять данные трассировки. |
| traceid-ratio | Решение об отправке принимается на основе traceid. Формат traceparent — xx-traceid-xx-flag, где первые 16 символов traceid представляют 32-битное шестнадцатеричное число. Если это число меньше fraction, умноженного на 4294967295 (то есть (2^32-1)), данные будут отправлены. |
| parent-base | Решение об отправке принимается на основе флага в traceparent запроса. При флаге 01 данные отправляются; например: curl -v "http://$ALB_IP/" -H 'traceparent: 00-xx-xx-01'. При флаге 02 данные не отправляются; например: curl -v "http://$ALB_IP/" -H 'traceparent: 00-xx-xx-02'. |
Resource Attributes
Эти атрибуты отправляются по умолчанию.
| Параметр | Описание |
|---|---|
| hostname | Имя хоста Pod ALB |
| service.name | Имя ALB |
| service.namespace | Пространство имён, где расположен ALB |
| service.type | По умолчанию ALB |
| service.instance.id | Имя Pod ALB |
Span Attributes
Атрибуты, отправляемые по умолчанию:
| Параметр | Описание |
|---|---|
| http.status_code | Код состояния |
| http.request.resend_count | Количество повторных попыток |
| alb.rule.rule_name | Имя правила, с которым совпал данный запрос |
| alb.rule.source_type | Тип правила, с которым совпал запрос, в настоящее время только Ingress |
| alb.rule.source_name | Имя Ingress |
| alb.rule.source_ns | Пространство имён, где расположен Ingress |
Атрибуты, отправляемые по умолчанию, но могут быть исключены изменением поля flag.hide_upstream_attrs:
| Параметр | Описание |
|---|---|
| alb.upstream.svc_name | Имя Service (внутреннего маршрута), на который перенаправляется трафик |
| alb.upstream.svc_ns | Пространство имён Service (внутреннего маршрута), на который перенаправляется трафик |
| alb.upstream.peer | IP-адрес и порт Pod, на который перенаправляется трафик |
Атрибуты, не отправляемые по умолчанию, но могут быть отправлены изменением поля flag.report_http_request_header:
| Параметр | Описание |
|---|---|
**http.request.header.<header>** | Заголовок запроса |
Атрибуты, не отправляемые по умолчанию, но могут быть отправлены изменением поля flag.report_http_response_header:
| Параметр | Описание |
|---|---|
**http.response.header.<header>** | Заголовок ответа |
Ниже приведена YAML-конфигурация, которая разворачивает ALB и использует Jaeger в качестве сервера OTel, с Hotrod-proxy в качестве демонстрационного бэкенда. Настройка правил Ingress позволяет при запросах клиентов к ALB перенаправлять трафик на HotROD. Кроме того, взаимодействие между внутренними микросервисами HotROD также маршрутизируется через ALB.
Сохраните следующий YAML в файл с именем all.yaml.
В CLI выполните команду для развертывания Jaeger, ALB, HotROD и всех необходимых CR для тестирования.
Выполните команду для получения адреса доступа к Jaeger.
Выполните команду для получения адреса доступа к otel-alb.
Выполните команду для отправки запроса к HotROD через ALB. ALB при этом отправит Trace в Jaeger.
Откройте адрес доступа Jaeger, полученный в Шаге 3, чтобы просмотреть результаты.

