Рубрики
Uncategorized

Отслеживание в Графане с темпом и джеером

Почему мне нужен трассировка, если у меня есть хорошая рамка для ведения журнала и мониторинга? Журналы приложений … с меткой Kubernetes, Devops, мониторинг.

Почему мне нужен трассировка, если у меня есть хорошая рамка для ведения журнала и мониторинга?

Журналы приложений полезны для отображения важных событий, если что-то не работает должным образом (отказ, ошибка, неверный конфиг и т. Д.). Хотя это очень важный элемент в дизайне приложений, нужно возобновить вход. Это связано с тем, что коллекция журнала, преобразование и хранение дороги.

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

В этом посте мы увидим, как ввести трассировку в журналах и легко визуализировать его. В этом примере мы будем использовать 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 И начать разговор:)

использованная литература

Оригинал: «https://dev.to/infracloud/tracing-in-grafana-with-tempo-and-jaeger-ec»