Подключение OpenTelemetry
На этой странице:
- Введение
- Агент или коллектор
- Включение поддержки OpenTelemetry на агенте
- Отправка трейсов и метрик OpenTelemetry Агенту ProtoOBP
- Отправка через существующий OpenTelemetry Collector
- Логи OpenTelemetry-приложений
- Примеры подключения OpenTelemetry инструментации
Введение
OpenTelemetry – это open source observability framework, предоставляющий ИТ-командам стандартизированные протоколы и инструменты для сбора и маршрутизации телеметрии приложений (метрики, логи и трейсы). Созданный в качестве инкубаторского проекта Cloud Native Computing Foundation (CNCF), OpenTelemetry обеспечивает единообразный формат данных для их инструментации, генерации, сбора и экспорта в платформы мониторинга.
Proto Observability Platform нативно поддерживает формат данных OpenTelemetry.
Если ваши приложения и сервисы инструментированы библиотеками OpenTelemetry, вы можете выбрать способ отправки трейсов, метрик и логов в бэкэнд Proto Observability Platform.

OpenTelemetry
Эта страница описывает приём трейсов. Обзор всех способов отправки OpenTelemetry (трейсы, метрики, логи) и навигация по разделам — на странице OpenTelemetry в Proto Observability Platform.Агент или коллектор
Трейсы OpenTelemetry можно принимать двумя способами — выбор зависит от того, что у вас уже развёрнуто:
Если у вас уже настроена инфраструктура OpenTelemetry (собственный OpenTelemetry Collector, приложения уже отправляют OTLP) — используйте
proto-otel-collector. Менять приложения не нужно: направьте телеметрию из вашего коллектора в коллектор ProtoOBP. Подробнее — OpenTelemetry в Proto Observability Platform.Если у вас уже развёрнуты Агенты ProtoOBP и инструментация на трейсерах ProtoOBP или Datadog, а нужно добавить новый источник, который работает только с OpenTelemetry, — отправляйте трейсы в Агент (встроенный OTLP-приём, разделы ниже).
Включение поддержки OpenTelemetry на агенте
Proto Observability Platform поддерживает стандарт W3C Trace Context, обеспечивая захват полного трейса, даже если запрос перемещается между сервисами, которые были инструментированы различными средствами. Обработка данных OTLP в Агентe ProtoOBP позволяет отправлять данные телеметрии непосредственно из приложений, оснащенных SDK OpenTelemetry. Агент может получать трейсы OTLP и метрики OTLP через gRPC или HTTP.
Поддерживаемые сигналы Agent 7.80.2
OTLP receiver Агента 7.80.2 принимает трейсы и метрики, но не реализует
OTLP LogsService. Не добавляйте экспортёр Агента на :4317 или :4318 в pipeline
logs OpenTelemetry Collector. Коллектор вернёт ошибку Unimplemented: unknown service opentelemetry.proto.collector.logs.v1.LogsService и отбросит записи.
Логи контейнеров собирайте Logs Agent через Docker labels или Kubernetes
annotations. Нативные OTLP-логи отправляйте через proto-otel-collector либо
напрямую в proto-log-storage. См. Получение логов.
Чтобы приступить к работе, сначала подключите инструментацию для своего приложения с помощью OpenTelemetry SDK. Затем экспортируйте данные телеметрии в формате OTLP в Агента. Настройка этого зависит от типа инфраструктуры, на которой развернут ваш сервис, как описано на странице ниже. Хотя целью является совместимость с последней версией OTLP, обработка OTLP в Агенте совместима не со всеми версиями OTLP.
Ознакомьтесь с документацией по инструментации OpenTelemetry, чтобы понять, как направить данные в Агента. Раздел receiver, описанный ниже, соответствует схеме конфигурации receiver в OTLP OpenTelemetry Collector.
По умолчанию OTLP интеграция отключена, вы можете включить ее, изменив конфигурацию файла protoobp.yaml Агента или задав переменные окружения. Следующие конфигурации protoobp.yaml включают эндпоинты на портах по умолчанию.
Для удобства в следующих примерах в качестве адреса эндпоинта используется 0.0.0.0. Это позволяет подключаться с любого сетевого интерфейса.
Для gRPC по умолчанию используется порт 4317:
otlp_config:
receiver:
protocols:
grpc:
endpoint: 0.0.0.0:4317
Для HTTP порт по умолчанию 4318:
otlp_config:
receiver:
protocols:
http:
endpoint: 0.0.0.0:4318
В качестве альтернативы можно настроить эндпоинты, указав порт в переменных окружения:
Для gRPC:
POBP_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT=0.0.0.0:4317Для HTTP:
POBP_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT=0.0.0.0:4318
Добавьте переменные окружения к контейнеру с ProtoOBP Агентом:
Для gRPC:
POBP_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT: 0.0.0.0:4317Для HTTP:
POBP_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT: 0.0.0.0:4318
Убедитесь, что порты
4317и4318у контейнера открыты/подключены к хосту.
Включите эндпоинты OTLP на агенте, отредактировав секцию
protoobp.otlpв файлеvalues.yamlHelm чарта:Для gRPC:
protoobp: ... otlp: receiver: protocols: grpc: endpoint: 0.0.0.0:4317 enabled: trueДля HTTP:
protoobp: ... otlp: receiver: protocols: http: endpoint: 0.0.0.0:4318 enabled: trueЕсть чарт уже был применен, обновите его, чтобы новые параметры применились, например:
helm upgrade protoobp -f values.yaml protoobp/protoobp --namespace protoobp
Отправка трейсов и метрик OpenTelemetry Агенту ProtoOBP
Для контейнера с приложением установите переменную окружения
OTEL_EXPORTER_OTLP_ENDPOINTтак, чтобы она указывала на контейнер с Агентом. Например:HTTP
OTEL_EXPORTER_OTLP_ENDPOINT=http://protoobp-agent:4318 # HTTPGRPC
OTEL_EXPORTER_OTLP_ENDPOINT=http://protoobp-agent:4317 # GRPCЗадайте имя сервиса и общие resource attributes. Они попадут в трейсы и метрики и позволят фильтровать демо или группу приложений как единое целое:
environment: OTEL_SERVICE_NAME: checkout OTEL_RESOURCE_ATTRIBUTES: "service.version=3.0.0,service.namespace=shop,deployment.environment.name=prod,team=otel-devs,service_group=otel-demo-3"Убедитесь, что оба контейнера (с приложением и Агентом) находятся в одной и той же Docker сети, чтобы порт Агента был доступен для контейнера с приложением.
В файле деплоймента приложения укажите эндпоинт, который будет использоваться OpenTelemetry клиентом для отсылки трейсов с помощью переменной окружения OTEL_EXPORTER_OTLP_ENDPOINT.
Для gRPC:
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(HOST_IP):4317" # GRPC
Для HTTP:
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(HOST_IP):4318" # HTTP
Добавьте к контейнеру имя сервиса и одинаковый набор resource attributes:
env:
- name: OTEL_SERVICE_NAME
value: checkout
- name: OTEL_RESOURCE_ATTRIBUTES
value: "service.version=3.0.0,service.namespace=shop,deployment.environment.name=prod,team=otel-devs,service_group=otel-demo-3"
Если все поды отправляют данные через существующий Service Агента, вместо
HOST_IP можно использовать адрес вида
http://protoobp.protoobp.svc.cluster.local:4317. Новый Агент в namespace
приложения для этого не требуется.
Отправка через существующий OpenTelemetry Collector
Если приложения уже отправляют OTLP в свой Collector, добавьте экспортёр
ProtoOBP только в pipelines traces и metrics:
exporters:
otlp_grpc/protoobp:
endpoint: protoobp.protoobp.svc.cluster.local:4317
tls:
insecure: true
sending_queue:
batch: {}
service:
pipelines:
traces:
exporters: [debug, otlp_grpc/protoobp]
metrics:
exporters: [debug, otlp_grpc/protoobp]
logs:
# Agent 7.80.2 не принимает OTLP logs на этом endpoint.
exporters: [debug]
В Docker Compose используйте DNS-имя контейнера, например
endpoint: protoobp-agent:4317. В Kubernetes используйте Service уже
развёрнутого Агента. После изменения перезапустите Collector и убедитесь, что в
его логах нет DeadlineExceeded, Unimplemented и переполнения очереди.
Логи OpenTelemetry-приложений
Наличие OpenTelemetry SDK не означает, что stdout/stderr контейнера автоматически попадёт в OTLP. Для контейнерных приложений рекомендуемый путь выглядит так:
- Приложение пишет логи в stdout/stderr.
- Logs Agent обнаруживает контейнер по Docker label или Kubernetes annotation.
- Значения
service,source,env,versionиservice_groupсвязывают логи с трейсами и метриками того же сервиса.
Полные примеры для Docker Compose и Kubernetes приведены в разделе «Сбор логов контейнеров».
Примеры подключения OpenTelemetry инструментации
Keycloak
environment:
KC_TRACING_ENABLED: true # включение инструментации для Keycloak
KC_TRACING_ENDPOINT: http://protoobp-agent:4317 # адрес агента Proto Observability Platform (для Kubernetes смотри примеры переменных для Java)
KC_TRACING_SERVICE_NAME: keycloak-otel # имя сервиса для отображения в интерфейсе Proto Observability Platform
Ingress NGINX Controller
Совместимость версий
Инструкции ниже написаны и проверены для Ingress-NGINX Controllerv1.13.3 (Helm chart ingress-nginx 4.13.3). Поддержка OpenTelemetry встроена в образ контроллера начиная с v1.10; на более ранних версиях имена и набор параметров конфигурации могут отличаться.Если вы НЕ используете Ingress-NGINX Helm chart
Для начала убедитесь, что в спецификации пода контроллера Ingress установлена переменная окружения HOST_IP. Если нет, добавьте следующую запись в блок env в спецификации пода:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(HOST_IP):4317"
Затем включите инструментацию OpenTelemetry для контроллера. Создайте или отредактируйте ConfigMap со следующими деталями:
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
enable-opentelemetry: "true"
otel-sampler: AlwaysOn
otel-service-name: "nginx-ingress" # имя сервиса в ProtoOBP
otel-sampler-ratio: "0.01" # уровень сэмплирования трейсов
Если вы используете Ingress-NGINX Helm chart
Измените файл values.yaml:
controller:
config:
enable-opentelemetry: "true"
otel-service-name: "nginx-ingress"
otel-sampler: AlwaysOn
otel-sampler-ratio: 0.01
exporter_otlp_protocol: grpc
exporter_otlp_insecure: "true"
extraEnvs:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(HOST_IP):4317"
Установите или обновите чарт:
helm install my-release ingress-nginx/ingress-nginx -f values.yaml
Инструментация Go через eBPF (AutoSDK)
Go-приложения можно подключить к Proto Observability Platform без изменения кода и без пересборки — с помощью eBPF-агента OpenTelemetry (otel/autoinstrumentation-go). Агент прикрепляется к уже запущенному бинарю, автоматически инструментирует net/http, google.golang.org/grpc, database/sql и github.com/segmentio/kafka-go, а ручные спаны (AutoSDK) собираются без настройки SDK в коде. Телеметрия отправляется в OTLP-приёмник Агента (см. разделы выше).
Подробная инструкция — требования, а также готовая конфигурация для Docker и Kubernetes — на странице инструментации Go: OpenTelemetry AutoSDK (eBPF).