Почему мне нужен трассировка, если у меня есть хорошая рамка для ведения журнала и мониторинга?
Журналы приложений полезны для отображения важных событий, если что-то не работает должным образом (отказ, ошибка, неверный конфиг и т. Д.). Хотя это очень важный элемент в дизайне приложений, нужно возобновить вход. Это связано с тем, что коллекция журнала, преобразование и хранение дороги.
В отличие от ведения журнала, которое является срабатыванием событий и дискретной, трассировка обеспечивает более широкий и непрерывный вид на приложение. Отслеживание помогает нам понять путь процесса/транзакции/сущности при прохождении стека приложения и идентифицируя узкие места на разных этапах. Это помогает оптимизировать приложение и повысить производительность.
В этом посте мы увидим, как ввести трассировку в журналах и легко визуализировать его. В этом примере мы будем использовать Prometheus, Grafana Loki, Jaeger и Tempo Tempo Grafana в качестве источников данных для мониторинга метрик, журналов и следов соответственно в графане.
Что такое распределенная трассировка?
В архитектуре микросервисов понимание поведения приложения может быть интригующей задачей. Это связано с тем, что входящие запросы могут пролиться над несколькими службами, и каждая прерывистая служба может иметь одну или несколько операций по этому запросу. Таким образом, это увеличивает сложность и занимает больше времени при устранении неисправностей.
Распределенные трассировки помогают получать представление о индивидуальной работе и точно определить области отказа, вызванной плохой производительностью.
Что такое OpenCating?
Opengracing Содержит спецификацию API, каркасы и библиотеки для включения распределенной трассировки в любом приложении. OpenCentracing API очень универсально и предотвращает поставщику/продукт блокировки. Недавно OpenCencing и Opencensus объединились в форму Opentelemetry (аббревиатура Otel). Это ориентируется на создание и управление данными телеметрии, такими как следы, метрики и журналы через набор API, SDKS, Tooling и интеграции. Примечание: Opencensus Состоит из набора Libs для различных языков для сбора метрик и следов от приложений, визуализирует их локально и отправлять их удаленно для хранения и анализа.
Каковы фундаментальные элементы описания?
SPAN: Это основной строительный блок распределенного трассировки. Он содержит имя, время начала и продолжительность.
Трассировка: Это визуализация запроса/транзакции, поскольку она пересекает через распределенную систему.
Метки: это информация о ключах для идентификации пролета. Это помогает запросить, фильтровать и анализировать данные трассировки.
Журналы: Журналы — это пары клавишных значений, которые полезны для захвата, специфичных пропаганков, и другие отладки или информационный выход из самого приложения.
SPAN-COUNTEXT: Это процесс ассоциации определенных данных с входящим запросом. Этот контекст доступен во всех других слоях приложения в том же процессе.
Какие доступные инструменты совместимы с OpenCessacing?
Zipkin : Это был один из первых распределительных инструментов, разработанных Twitter, вдохновленный Google Dapper Paper. Zipkin кодируется в Java и поддерживает Cassandra и Elasticsearch для масштабируемости Backend.
Он состоит из них клиентов или репортеров, чтобы собрать данные трассировки, коллекторов, чтобы индексировать и хранить данные, службу запроса для извлечения и извлечения данных трассировки и пользовательские пользователи для визуализации следов. Zipkin совместим с стандартом OpenSentracing, поэтому эти реализации также должны работать с другими распределенными системами трассировки.
Jaeger : Jaeger — это еще один совместимый проект OpenCentracing от Uber Technologies, написанных в Go. JAEGER также поддерживает Cassandra и Elasticsearch как масштабируемые бэкэндские решения. Хотя его архитектура похожа на Zipkin, он содержит дополнительный агент на каждом хосте для совокупных данных в партиях, прежде чем отправлять его коллектору.
Appdash : Appdash, созданный пососграфом, это еще одна распределенная система трассировки, написанная. Он также поддерживает стандарт OpenCracing.
Графана темп : Tempo — это открытый исходный код, масштабируемый распределенный вариант отслеживания. Мы можем легко интегрировать это с Графаной, Локи и Прометей. Требуется только хранилище объектов и совместимо с другими открытыми протоколами трассировки, такими как Jeger, Zipkin и opentelemetry.
Включение и визуализация следов
Доступны много практических учебных пособий/демонстраций, но они существуют для окружающей среды Docker-Compose. Мы будем запускать пример отслеживания в среде Kubernetes. Мы возьмем классический пример, предоставленный JAEGER, I.E., HOTROD. Хотя у Jaeger имеет свой интернет-интерфейс для визуализации следов, мы визуализируем его в Графане с Jaeger в качестве источника данных. Точно так же мы также увидим, как Tempo Grafana полезен для визуализации следов.
Для начала мы будем клонировать jaeger github repo.
git clone https://github.com/jaegertracing/jaeger.git
Включить распределенную трассировку в приложении Micreadervice
Вы можете проверить, как включить OpenCessing, навигацию через репо, как показано ниже.
cd jaeger/examples/hotrod cat pkg/log/factory.go
if span := opentracing.SpanFromContext(ctx); span != nil { logger := spanLogger{span: span, logger: b.logger} if jaegerCtx, ok := span.Context().(jaeger.SpanContext); ok { logger.spanFields = []zapcore.Field{ zap.String("trace_id", jaegerCtx.TraceID().String()), zap.String("span_id", jaegerCtx.SpanID().String()), } }
Конвертировать DeCon-Compose Mailest в Kubernetes Mainest
В каталоге Hotrod проверьте существующие проявления докера.
Вы увидите службы развертывания файлов Docker-Compose.yml, такие как Jeger и Hotrod. Мы будем использовать Компон Чтобы преобразовать докер-составных манифеста в Kubernetes Mainest.
kompose convert
Вы увидите, что некоторые файлы создаются. Мы специально интересуются Hotrod-Deployment.yaml.
, hotrod-service.yaml
, Jaeger-Deployment.yaml
и Jaeger-Service.yaml.
. Для простоты мы добавим следующую метку в манифесте развертывания Hotrod.
metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.21.0 (992df58d8) creationTimestamp: null labels: app: hotrod name: hotrod spec: replicas: 1 selector: matchLabels: app: hotrod
Включить трассировку Jaeger в манифесте развертывания
Теперь нам нужно добавить следующие переменные среды в Hotrod-Deployment.yaml.
.
spec: containers: - args: - all env: - name: JAEGER_AGENT_HOST value: tempo - name: JAEGER_AGENT_PORT value: "6831" - name: JAEGER_SAMPLER_TYPE value: const - name: JAEGER_SAMPLER_PARAM value: "1" - name: JAEGER_TAGS value: app=hotrod image: jaegertracing/example-hotrod:latest imagePullPolicy: "" name: hotrod ports: - containerPort: 8080 resources: {}
Jaeger_agent_host
: Это имя хоста для связи с агентом (по умолчанию для localhost).
Jaeger_agent_port
: Это порт для связи с агентом (по умолчанию до 6831).
Jaeger_sampler_type
: Четыре типов доступны удаленному, Const, вероятностяе, ранее ранее (по умолчанию для удаленного). Например, тип Const относится к решению выборки для каждого следа.
Jaeger_sampler_param
: Это значение от 0 до 1 (1 для отбора проб всех трасных и 0 для отбора проб ни одного из них).
Jaeger_tags
: Это запятой список меток уровня траслера, которые добавляются ко всем сообщенным пропандам.
Теперь мы будем применять эти проявления. Обратите внимание, что это потребует бегущего кластера Kubernetes в качестве предварительного реквизита.
Установите PROMETHEUS и LOKI
Далее мы устанавливаем Premetheus, Loki и Grafana. График оператора PROMETHEUS HELM ( KUBE-PROMETHEUS-Stack
) будет устанавливать прометея и графана. Диаграмма Helm Loki ( Loki-Stack
) установит Loki и ProPtail. Это пост Обеспечивает более подробную информацию о мониторинге журнала с Loki.
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack helm upgrade --install loki grafana/loki-stack
Нам нужно добавить JAEGER и LOKI-источники данных в Grafana. Вы можете достичь этого, либо вручную добавляя его или имею его в коде. У нас будет последний, создав пользовательские значения файла Выпускные ценности.yaml
как показано ниже.
grafana: additionalDataSources: - name: loki type: loki uid: my-loki access: proxy orgId: 1 url: http://loki:3100 basicAuth: false isDefault: false version: 1 editable: true - name: jaeger type: jaeger uid: my-jaeger access: browser url: http://jaeger:16686 isDefault: false version: 1 editable: true basicAuth: false
UID
: Это уникальный пользовательский идентификатор.
доступ
: Он утверждает, является ли доступ прокси или прямой (сервер или браузер).
Isdefault
: Он устанавливает источник данных по умолчанию.
Версия
: Это помогает в версии файла конфигурации.
редактируемый
: Это позволяет обновлять DataSource от UI.
Теперь мы обновим CUBE-PROMETHEUS-CAKE CLECK CHELM с пользовательскими значениями.
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack --values=prom-oper-values.yaml
Если вы перейдете к источникам данных, вы можете увидеть здесь JAEGER и LOKI. Пришло время увидеть, как следы регистрируются в сообщении журнала. Для этого мы пойдем на Hotrod ui и вызвании просьбы оттуда.
Примечание. В нашей конфигурации мы дали имя Локи
и Jaeger
Для источников данных Loki и Jaeger соответственно.
Примечание: Grafana и Hotrod Services используют Clusterip Мы будем использовать переадресацию по порту для доступа к UI.
Перейдите, чтобы исследовать, выберите Loki в качестве источника данных и выберите «Журналы», как {приложение = "Hotrod"}
визуализировать журналы. Вы можете увидеть контекст SPAN, содержащий информацию, как Trace и ID Sailed в Json. Скопируйте идентификатор трассировки. Дублируйте окно и перейдите, чтобы исследовать и выберите JAEGER в качестве источника данных. Вставьте идентификатор трассировки и запустите запрос для визуализации всех следов запроса.
Настройка полей полученных лови
Эта техника не будет эффективным при анализе запросов на всплеск. Нам нужно что-то, что будет более эффективным и легко в эксплуатации. Для этого мы будем использовать концепцию полей производных Локи. Производные поля позволяют добавлять анализируемое поле из сообщения журнала. Мы можем добавить URL, содержащий значение поля Parsed. Давайте посмотрим, как это делает трюк, но сначала добавьте следующий конфиг в Выпускные ценности.yaml
:
- name: loki type: loki access: proxy orgId: 1 url: http://loki:3100 basicAuth: false isDefault: false version: 1 editable: true jsonData: derivedFields: - datasourceUid: my-jaeger matcherRegex: ((\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)) url: '$${__value.raw}' name: TraceID
Обратите внимание, что DataSourceuid
имеет значение jaeger’s UID
. Это поможет определить источник данных при создании внутренней ссылки. MatcherRegex
У рисунка Regex для анализа идентификатора трассировки из сообщения журнала. URL
содержит полную ссылку, если он указывает на внешний источник. Если это внутренняя ссылка, это значение служит запросом для целевого источника данных. $$ {__ value.raw}
Макрос интерполизирует значение поля во внутреннюю ссылку.
Добавьте новые этикетки журнала, используя Projectail Points
Мы добавим еще одно изменение для простоты работы. Как вы видели ранее, на Loki не было никакой этикетки ID трассировки. Чтобы добавить определенную метку, мы будем использовать трубопроводы
сформировать метку из сообщений журнала. Создать Loki-Stack-state.yaml
Файл и добавьте следующий код к нему.
promtail: serviceMonitor: enabled: true additionalLabels: app: prometheus-operator release: prometheus pipelineStages: - docker: {} - match: selector: 'stages: - regex: expression: ".*(?Ptrace_id\"\\S)\\s\"(?P [a-zA-Z\\d]+).*" traceID: traceID - labels: traceID:
Здесь трубопроводы
Используется для объявления конвейера для добавления метки трассировки ID. Вы можете найти более подробную информацию о параметрах трубопровода здесь Отказ Теперь мы будем обновлять как Cube-PrimeTheus-Stack и Helm Helm и Loki-Stack с обновленными значениями.
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack --values=prom-oper-values.yaml helm upgrade --install loki grafana/loki-stack --values=loki-stack-values.yaml
Визуализировать распределенную трассировку в графане, используя JAEGER и TEMPO
Мы снова посетим Hotrod ui и вызвании просьбы оттуда. На панели инструментов Grafana нажмите «Исследовать» и выберите Loki в качестве источника данных. Добавить {приложение = "Hotrod"}
в журнале этикетки. Теперь вы увидите производное поле с именем TraceID с автоматически сгенерированной внутренней ссылкой на JAEGER. Вы также увидите дополнительную метку с именем TraceID. Нажмите на полученное поле TraceID, и он будет напрямую принять вас к источнику данных JAEGER и показать все следы определенного идентификатора трассировки. Это делает переключение между бревнами и следами намного проще. Кроме того, это ясно, как анализировать сообщение журнала в соответствии с требованием.
Далее мы добавим Tempo Tempo Grafana в качестве источника данных и визуализируйте следы с минимальными изменениями с той же настройкой. Чтобы включить это добавить следующие строки в Выпускные ценности.yaml
и обновить диаграмму HELM:
- name: tempo type: tempo uid: my-tempo access: browser url: http://tempo:16686 isDefault: false version: 1 editable: true basicAuth: false
Изменить источник данных UID
В конфигурации Локи к Tempo’s UID
(например, DataSourceuid: My-Tempo
) в Выпускные ценности.yaml
Отказ Tempo использует библиотеки клиентов Jaeger для получения всей информации о трассировке. Итак, мы удалим развертывание JAEGER и его обслуживание. Чтобы установить темп в одном двоичном режиме, мы будем использовать стандартный Helm Диаграмма предоставляется графаной.
helm upgrade --install tempo grafana/tempo
Нам также нужно изменить Jaeger_agent_host
Переменная в Hotrod ( Hotrod-deployment.yaml
) до темп
для правильной идентификации следов. Неправильное значение или отсутствующее значение может привести к следующей ошибке:
Повторно примените манифест по развертыванию Hotrod, чтобы включить внесенные изменения. Еще раз посетите Hotrod UI и вызвать запрос оттуда. Теперь проверьте журналы Hotrod в Локи. Вы замечаете, что ссылка в производных поля меняется на темп. Нажмите на нее, и вы можете визуализировать всю информацию о трассировке, как раньше.
Вывод
Чтобы обобщить пост, мы коснулись следующих моментов:
- Как включить распределенную трассировку в приложении микровисга.
- Как преобразовать Docker-Compose Meanest в Манифест Куберанес.
- Как включить отслеживание Jaeger в развертывании приложения.
- Как настроить проводные поля LOKI.
- Как разбираться в анализе сообщений, чтобы добавить новые метки с использованием концепции трубопровода PROPTAIL.
- Как визуализировать распределенные трассировки в Grafana с использованием источников данных JAEGER и TEMPO.
Мы надеемся, что вы нашли этот блог информативным и учащимся. Если у вас есть вопросы, не стесняйтесь добраться до меня на Twitter или LinkedIn И начать разговор:)
использованная литература
- Что распределена трассировка?
- Tempo-Otel пример
- Комплексный учебник для реализации OpenCessacing с Jaeger
- Используя локи в графане
Оригинал: «https://dev.to/infracloud/tracing-in-grafana-with-tempo-and-jaeger-ec»