К концу этой статьи вы узнаете, как использовать оператор OpenTelemetry для реализации трассировки в вашем приложении без изменения какого-либо кода.
Давайте сначала разберемся, что такое распределенная трассировка и зачем она нам нужна.
Зачем нужна Распределенная трассировка? Почему мы не можем просто использовать индексибревно? Предположим, у вас есть архитектура микросервисов, как показано ниже.
Теперь представьте запрос от клиента.
Из диаграммы архитектуры выше мы видим, что запрос может пройти через десятки или сотни сетевых вызовов. Из-за этого сложно узнать весь путь, по которому прошел запрос, а устранение неполадок может быть очень сложным, если у вас есть только журналы и метрики.
Когда что-то идет не так с нашим приложением, нам приходится многое решать.
Распределенная трассировка может помочь увидеть взаимодействие между службами на протяжении всего запроса и обеспечить понимание всего жизненного цикла запроса в системе. Это помогает нам находить ошибки, узкие места и проблемы с производительностью в наших приложениях.
Трассировка начинается с момента взаимодействия пользователя с приложением, и мы должны иметь возможность видеть весь запрос до последнего уровня.
Данные трассировки (в виде промежутков) генерируют информацию (метаданные), которая может помочь понять, как возникают задержки или ошибки запросов и какое влияние они оказывают на общий запрос.
Если вы хотите узнать больше о распределенной трассировке, прочтите Руководство для начинающих по распределенной трассировке, чтобы узнать, как отслеживать архитектуру микросервисов.
Чтобы реализовать отслеживание, нам необходимо сделать следующее:
Для этого мы можем использовать два открытых исходных кодапроект:OpenTelemetry
и Jaeger
。
OpenTelemetry Может использоваться для сбора данных из приложений. Это набор инструментов и API. и SDK собирать,Мы можем использовать их для обнаружения, генерации, сбора и экспорта данных телеметрии (индекс, краткая трассировка).,Чтобы помочь проанализировать производительность и поведение приложений.
Опен Телеметрия — это:
OpenTelemetry Он включает в себя три столпа наблюдаемости: отслеживание и отслеживание. (В центре внимания данной статьи Волясосредоточиться на Отслеживание)
OpenTelemetry предусмотрена одна Независимость от поставщикаизСтандарт наблюдаемости,потому что оно направленосуществовать Стандартизированное отслеживаниеизгенерировать。проходить С помощью OpenTelemetry мы можем отделить точки обнаружения от серверной части. Это означает, что мы не зависим ни от какого инструмента (или поставщика).
Мы не только можем использовать любой язык программирования, который хотим, мы также можем выбрать любую совместимую систему хранения данных, избегая привязки к конкретному коммерческому поставщику.
Разработчики могут инструментировать свои приложения, не зная, где будут храниться данные.
OpenTelemetry Нам предоставлены инструменты для создания данных трассировки. Чтобы получить эти данные, нам сначала необходимо настроить приложение для сбора данных. Для этого нам нужно использовать OpenTelemetry SDK。
Данные приборов для приложения могут быть сгенерированы с использованием автоматизированных или ручных (или гибридных) средств. Чтобы инструментировать приложение с помощью OpenTelemetry, вы можете посетить репозиторий OpenTelemetry, выбрать язык для своего приложения и следовать инструкциям.
Автоматическое обнаружение
Использование Автоматическое обнаружение — хороший способ использовать Автоматическое обнаружение.,Потому что это просто и легко,Не требуется много изменений кода.
Этот подход идеален, если у вас нет необходимых знаний (или времени) для создания кода отслеживания, адаптированного к вашему приложению.
при использовании Автоматическое Обнаружение, Воля создает набор предопределенных пролеты и заполните соответствующие свойства.
Ручное обнаружение
Ручное обнаружение — это написание специального кода для приложения. Это процесс добавления кода наблюдаемости в ваше приложение. Это позволит более эффективно удовлетворить ваши потребности, поскольку вы сможете добавлять свойства и события самостоятельно. Недостаток этого подхода в том, что вам придется импортировать библиотеку и выполнять всю работу самостоятельно.
коммуникатор
может быть W3C tracecontext
、baggage
иb3
и т.д. В Конфигурацию добавлен коммуникатор (Пропагаторы).
Другой коммуникатор определяет конкретные поведенческие спецификации для распространения через границы процесса с контекстными данными.
Trace Context
:используется длясуществовать HTTP headers Среднее кодирование trace данные для передачи этих данных между различными сервисами.Baggage
:используется длясуществовать span Передавать пары ключ-значение между данными, например пользователями. идентификатор, запрос ID ждать.B3
:используется длясуществовать HTTP headers Среднее кодирование trace данные, так что существующие могут передавать эти данные между различными службами (в основном используются для Zipkin или Он совместим с системой).выборка
выборка - это метод сокращения сбора и отправки назад частьиз отслеживать количество образцов для контроля OpenTelemetry Представляем шумовой и накладной механизм.
могу сказать OpenTelemetry Осуществить выборку по количеству отправляемого трекинга/трафика. (например, только выборка 10% данные отслеживания).
Двумя распространенными методами выбора являются выбор головы и выбор хвоста.
Протокол открытой телеметрии Спецификация (OTLP) описывает источник данных телеметрии, Коллектор телеметрии сзади. из механизма кодирования, передачи и доставки между частями.
SDK для каждого языка предоставляет экспортер OTLP, который можно настроить для экспорта данных через OTLP. Затем пакет OpenTelemetry SDK преобразует события в данные OTLP.
OTLP — это связь между актером (конфигурация как отправитель) и сборщиком (конфигурация как получатель).
Данные телеметрии приложения можно отправлять в сборщики OpenTelemetry.
Коллектор — это компонент OpenTelemetry, который получает данные телеметрии (промежутки, метрики, журналы и т. д.), обрабатывает (предварительно обрабатывает данные) и экспортирует данные (отправляет их на нужный коммуникационный сервер).
Receivers
Приемники Приемники — это способ поступления данных в сборщик: принудительная или вытягивающая. Сборщики OpenTelemetry могут получать данные телеметрии в различных форматах.
Ниже приведен приемник в порту 4317(gRPC) и 4318(http) принять на OTLP Пример конфигурации данных:
otlp:
protocols:
http:
grpc:
endpoint: "0.0.0.0:4317"
То же, что и в примере ниже, который может получать данные телеметрии по протоколу HTTP Jaeger Thrift.
jaeger: # Jaeger протоколполучатель protocols: # Определение получателя поддерживается из протокола
thrift_http: # проходить Jaeger Thrift HTTP Согласие полученное
endpoint: "0.0.0.0:14278"
Processors
После получения данных,Коллекционер может обрабатывать данные. Процессор существует для получения и экспорта между обработками данных. Процессор не является обязательным из,Но некоторые рекомендуются из.
например batch
Процессор настоятельно рекомендуется из. Пакетный процессор получает интервалы, индекс или бревно, и объединяет их в пакеты. Пакетная обработка помогает лучше сжимать файлы и уменьшать количество исходящих соединений, необходимых для передачи файлов. Этот процессор поддерживает на основе размера и времени и пакетной обработки.
processors:
batch:
Обратите внимание, что настройка процессора не включает его. нужно пройти service
частичный pipelines
Давать возможность.
service:
pipelines:
traces:
receivers: [jaeger]
processors: [batch]
exporters: [zipkin]
Exporters
Для визуализации и анализа телеметрии нам также понадобится использовать экспортер. Экспортер OpenTelemetry Компонент и способ отправки данных в разные системы/серверы.
например console exporter
является общимизэкспортер,для задач разработки и отладки очень полезны,Он выведет на консоль «Воляданные».
существовать exporters
раздел, чтобы добавить дополнительные пункты назначения. Например, если вы хотите отправить данные отслеживания на Grafana Tempo, просто добавьте конфигурацию, как показано ниже:
exporters:
logging:
otlp:
endpoint: "<tempo_endpoint>"
headers:
authorization: Basic <api_token>
Конечно, для того, чтобы в конечном итоге подействовать, ему также необходимо существовать. service
частичный pipelines
середина Давать возможность.
service:
pipelines:
traces:
receivers: [otlp]
processors: []
exporters: [logging, otlp]
OpenTelemetry Поставляется с различными экспортерами, существуют OpenTelemetry Коллекционер Contrib можно найти в репозитории.
Extensions
Расширение в основном подходит для задач, не предполагающих обработку телеметрии. Примеры расширений включают мониторинг работоспособности, обнаружение и пересылку служб. Расширения не являются обязательными.
Расширение в основном используется для задач, не предполагающих обработку телеметрии. например, мониторинг состояния, обнаружение услуг и данные переадресации. Расширения не являются обязательными.
extensions:
health_check:
pprof:
zpages:
memory_ballast:
size_mib: 512
OpenTelemetry Коллекционер можно сделать разными способами, поэтому нам нужно подумать, как это сделать. Какую стратегию выбрать, зависит от вашей команды и организационной ситуации.
В этом случае существует OpenTelemetry Обнаружить из приложения Воляданные, отправленные из (Коллекционер) актерского мастерства, которое находится вместе с приложением мастерство。Затем,Долженактерское мастерствопрограмма Воля Возьмите на себя и обработайте все запросы от Приложенияотслеживатьданные。
Коллекционер Можетпроходить sidecar Способразвертыватьдляактерское мастерство,sidecar Можно настроить для отправки данных непосредственно в хранилище.
Вы также можете решить отправить данные другому OpenTelemetry Коллекционер и затем из (центра) Коллекционер далее Воляданные отправляются на склад сзади. часть。существовать Этот вид Конфигурациясередина,У нас есть один Центр из Коллекционера OpenTelemetry., он использует deployment
модельразвертывать,Имеет много преимуществ,Например, автоматическое расширение.
Некоторые преимущества использования центра Коллекционериз:
Ниже мы подведем итоги некоторых стратегий развертывания.
Базовая версия — использование OTLP-клиента для обнаружения авторизованных данных, отправляемых группе сборщиков.
могут быть данные Отправить нескольким экспортерам.
существовать Kubernetes начальстворазвертывать OpenTelemetry Collector режимы, которые можно использовать, когда
режим коляски:
Агент в качестве корзины, использующей сборщик OpenTelemetry. Добавление контейнеров в модуль рабочей нагрузки. Затем экземпляр настраивается для отправки на внешний сборщик, который может находиться в другом пространстве имен или кластере.
режим демонсета:
Агент действует как DaemonSet, поэтому у нас есть один модуль агента на каждый узел Kubernetes.
Балансировка нагрузки — балансировка нагрузки на основе идентификатора трассировки:
Несколько кластеров - актерское мастерство、рабочая нагрузкаиплоскость управления Коллекционер:
Мультиарендная модель
Два арендатора, у каждого свой егерь.
Режим сигнала
Два Коллекционера, каждый Коллекционер соответствует типу данных телеметрии.
OpenTelemetry Коллекционер не предлагает себе иззаднюю часть, поэтому можно использовать продукт любого поставщика или продукт с открытым исходным кодом!
Хотя OpenTelemetry не предоставляет собственную серверную часть, используя ее, мы не зависим от какого-либо инструмента или поставщика, поскольку она не зависит от поставщика. Мы не только можем использовать любой язык программирования, который хотим, но также можем выбрать серверную часть хранилища и легко переключиться на другую серверную часть/поставщика, просто настроив другой экспортер.
Для визуализации и анализа данных телеметрии,Нам просто нужно существование OpenTelemetry Тип сборщика настраивает экспортер.
например Jaeger — очень популярный продукт с открытым исходным кодом для анализа и запросов.
нас Можетсуществовать OpenTelemetry Коллекционерсередина Конфигурация Jaeger экспортер для отправки данных Jaeger。
exporters:
jaeger:
endpoint: "http://localhost:14250"
существовать Kubernetes Использовать на OpenTelemetry,В основномразвертывать OpenTelemetry Коллекционер. Мы рекомендуем использовать OpenTelemetry Operator Приходите на развертывание, так как это помогает нам легко управлять развертыванием. OpenTelemetry Коллекционер,возвращаться Может Автоматическое обнаружениеприложение.
Здесь мы используем Helm Chart Приходитьразвертывать OpenTelemetry Оператор, добавьте сначала Helm Chart склад:
$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
$ helm repo update
По умолчанию для проверки используется развертывание одного контроллера допуска. OpenTelemetry Operator Конфигурация правильная? Для того, чтобы сделать? APIServer умеющий работать с Webhook Компоненты взаимодействуют с веб-перехватчиками нужен APIServer Настроить как доверенный TLS Сертификат.
Для простоты мы напрямую используем метод автоматического создания сертификата подписи. Используйте следующую команду, чтобы установить оператор OpenTelemetry одним щелчком мыши:
$ helm upgrade --install --set admissionWebhooks.certManager.enabled=false --set admissionWebhooks.certManager.autoGenerateCert=true opentelemetry-operator open-telemetry/opentelemetry-operator --namespace kube-otel --create-namespace
После завершения обычной развертывания вы увидите соответствующий из Pod Уже работает нормально:
$ kubectl get pods -n kube-otel -l app.kubernetes.io/name=opentelemetry-operator
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-6f77dc895c-4wn8z 2/2 Running 0 33s
Кроме того, для нас будут автоматически добавлены два CRD, связанные с OpenTelemetry:
$ kubectl get crd |grep opentelemetry
instrumentations.opentelemetry.io 2023-09-05T03:23:28Z
opentelemetrycollectors.opentelemetry.io 2023-09-05T03:23:28Z
Иди сюда OpenTelemetry Operator Сразуразвертыватьзаконченный。
Тогда мы решили использовать центр здесь OpenTelemetry Коллекционер и пусть другие OpenTelemetry актерское Мастерство мастера отправлено коллекционеру мастерство получает и зданные Волясуществовать этот Коллекционер обрабатывается и проходит, экспортер отправляет на склад часть. Весь рабочий процесс показан ниже:
Создайте его, как показано ниже. OpenTelemetryCollector
Экземплярный объект:
# central-collector.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: simplest
spec:
config: |
receivers:
otlp:
protocols:
grpc:
http:
processors:
memory_limiter:
check_interval: 1s
limit_percentage: 75
spike_limit_percentage: 15
batch:
send_batch_size: 10000
timeout: 10s
exporters:
logging:
otlp:
endpoint: "<tempo_endpoint>"
headers:
authorization: Basic <api_token> # echo -n "<your user id>:<your api key>" | base64
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [logging, otlp]
существоватьздесь OpenTelemetry Collector проходить grpc и http Два протокола для получения данных телеметрии и передачи записей для экспорта и Grafana Tempo записать эти Спан, это будет Span написать получить Span из OpenTelemetry Collector Пример изConsole и Grafana Tempo Перейти к бэкэнду.
Тогда мы будем использовать Sidecar модельразвертывать OpenTelemetry актерское мастерство。Долженактерское Мастерство Воля Приложение по отслеживанию отправлено в наш центр (шлюз) OpenTelemetry Коллекционер。
# sidecar.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: sidecar
spec:
mode: sidecar
config: |
receivers:
otlp:
protocols:
grpc:
http:
processors:
batch:
exporters:
logging:
otlp:
endpoint: "<path_to_central_collector>.<namespace>:4317"
service:
telemetry:
logs:
level: "debug"
pipelines:
traces:
receivers: [otlp]
processors: []
exporters: [logging, otlp]
OpenTelemetry Operator Можно вводить и Конфигурация OpenTelemetry Автоматическое Обнаружение библиотеки. В настоящее время поддерживается DotNet、Java、NodeJS、Python и Golang (необходимо включить вручную).
Чтобы использовать Автоматическое Обнаружения, нужно быть SDK и Обнаружение Конфигурациядобавить водин Instrumentation
ресурс.напримердля Java приложение, настроенное следующим образом.
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: java-instrumentation
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: always_on
java:
Если это приложение Python, конфигурация следующая:
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: python-instrumentation
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: always_on
python:
Чтобы включить обнаружение, нам необходимо обновить файл развертывания и добавить к нему аннотации. так мы говорим OpenTelemetry Operator Воля sidecar и java Инструменты внедряются в наше приложение.
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
sidecar.opentelemetry.io/inject: "true"
Здесь мы используем имя один вместо Воля. Petclinic из Java приложение, которое представляет собой использование Maven или Gradle Построить из Spring Boot Приложение. Приложение, которое использует Воля. OpenTelemetry Сгенерируйте данные.
для Java Приложения, которые мы можем скачать OpenTelemetry Предоставить из opentelemetry-javaagent этот jar пакет для использования OpenTelemetry Автоматическое обнаружениеприложение.
Просто Воляэтот jar Сумкадобавить вприезжать Приложения Команда запускасередина Вот и все,например:
java -javaagent:opentelemetry-javaagent.jar -jar target/*.jar
Java Автоматическое Обнаружение использования может быть прикреплено к любому Java 8+ Приложения Java актерское мастерство БАНКА. Он динамически внедряет байт-код для сбора данных телеметрии из многих популярных библиотек и платформ. Его можно использовать для захвата «границы» приложения или службы из данных телеметрии, таких как входящие запросы, исходящие HTTP вызов、данные Библиотекавызовждать.проходить Запустить какначальство Заказ,Мы можем инструментировать приложение,и сгенерировать данные ссылки,И в нашем приложении нет никаких изменений.
особенносуществовать Kubernetes среду, мы можем использовать OpenTelemetry Operator внедрить и Конфигурацию OpenTelemetry Автоматическое Обнаружение библиотеки, так что подключайтесь javaagent Нам больше не нужно вводить вручную.
Мы сначаларазвертывать Petclinic приложение.
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
spec:
containers:
- name: app
image: cnych/spring-petclinic:latest
Тогда мы делаем Java Приложение добавляет Instrumentation
ресурс.
# java-instrumentation.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: java-instrumentation
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: always_on
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
Чтобы включить Автоматическое Обнаружение, нам необходимо обновить развернутый файл и добавить к нему аннотации. Таким образом мы можем сказать OpenTelemetry Operator Воля sidecar и java-instrumentation Внедрён в наше приложение. Исправлять Deployment
Конфигурация следующая:
# petclinic.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: petclinic
spec:
selector:
matchLabels:
app: petclinic
template:
metadata:
labels:
app: petclinic
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
sidecar.opentelemetry.io/inject: "sidecar"
spec:
containers:
- name: app
image: cnych/spring-petclinic:latest
а затем создайте еще один NodePort Тип из Service Сервисы по выставлению приложения.
# petclinic-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: petclinic
spec:
selector:
app: petclinic
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
Просто примените приведенный выше список ресурсов напрямую:
$ kubectl apply -f central-collector.yaml
$ kubectl apply -f sidecar.yaml
$ kubectl apply -f java-instrumentation.yaml
$ kubectl apply -f petclinic.yaml
$ kubectl apply -f petclinic-svc.yaml
После завершения обычной развертывания вы увидите соответствующий из Pod Уже работает нормально:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
petclinic-6fdd56f4d7-qfff7 2/2 Running 0 62s
simplest-collector-87d8bf9bf-dh8pl 1/1 Running 0 36m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
petclinic NodePort 10.103.6.52 <none> 80:30941/TCP 46s
simplest-collector ClusterIP 10.102.131.126 <none> 4317/TCP,4318/TCP 17m
simplest-collector-headless ClusterIP None <none> 4317/TCP,4318/TCP 17m
simplest-collector-monitoring ClusterIP 10.98.65.171 <none> 8888/TCP 17m
Тогда мы сможем провести http://<node_ip>:30941
прийти в гости Petclinic приложение.
Когда мы получаем доступ к приложению,Приложение генерирует следы на Воляданных,и Воляпришлите это намизсередина Сердце Коллекционер。нас Можетпроходитьдоступ Grafana Tempo Чтобы просмотреть данные отслеживания, вы также можете посетить консоль центра Коллекционериз для просмотра данных отслеживания. Потому что мы существуем Центр Коллекционер в Конфигурация экспортера записей и Grafana Tempo Два экспортера, конечно, можно настроить и другие экспортеры.
$ kubectl logs -f petclinic-6fdd56f4d7-qfff7 -c otc-container
# ......
2023-09-10T04:11:41.164Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 76}
2023-09-10T04:12:11.012Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 3}
2023-09-10T04:12:16.221Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 23}
^C
$ kubectl logs -f simplest-collector-677f4779ff-x8h2m
# ......
2023-09-10T04:11:09.221Z info service/service.go:161 Everything is ready. Begin running and processing data.
2023-09-10T04:11:49.222Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 1, "spans": 76}
2023-09-10T04:12:19.224Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "logging", "resource spans": 2, "spans": 26}
Таким образом, Grafana Tempo также может видеть соответствующие данные трассировки:
Аналогично, если вы добавите еще один Jaeger из экспортера, то вы также можете существовать Jaeger См. соответствующие данные трассировки в.
Если у вас возникнут какие-либо проблемы в процессе развертывания, мы можем провести просмотр приложения и контейнера и своевременно устранить неполадки.
существуют В этой статье,Мы демонстрируем, как реализовать отслеживание в приложении с помощью оператора OpenTelemetry.,без изменения какого-либо кода.
Конечно, есть много другого контента, который не был охвачен. OpenTelemetry используется в Prometheus Приходитьсобиратьиндексданные,каксуществовать OpenTelemetry используется в Loki Приходите и собирайте бревноданные и многое другое, в том числе некоторые стратегии выбора, коммуникаторы, пакетные процессоры, Ручное обнаружениеждатьждать.