Начало работы с Grafana Tempo

Давайте изучим основы Grafana Tempo, серверной части распределенной трассировки.

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

Таким образом, используя распределенную трассировку, вы можете получить консолидированное представление обо всех службах. И Grafana Tempo как раз об этом.

Что такое Графана Темпо?

На конференции ObservabilityCon в этом году было несколько важных обновлений от Grafana Labs, и Grafana Tempo была одной из них. Grafana Labs добавила еще один проект Grafana Tempo в свое портфолио с открытым исходным кодом.

Графана темп — это распределенный сервер трассировки с открытым исходным кодом, который легко масштабируется и прост в использовании. Tempo полностью совместим с другими протоколами отслеживания, такими как Zipkin, Jaeger, OpenTelemetry и OpenCensus. В настоящее время он поддерживает механизм обнаружения данных Tempo в Loki, платформы мониторинга, такие как Prometheus и Grafana. Grafana 7.3+ обеспечивает беспроблемное взаимодействие между Grafana и Tempo.

Зачем использовать темп?

Темп используется для корреляции метрик, трассировок и журналов. Бывают ситуации, когда пользователь получает одну и ту же ошибку несколько раз. Если я хочу понять, что происходит, мне нужно будет посмотреть на точные следы. Но из-за понижения дискретизации некоторая ценная информация, которую я мог бы искать, была бы потеряна. С Tempo теперь нам не нужно понижать частоту распределенных данных трассировки. Мы можем хранить полную трассировку в хранилище объектов, таком как S3 или GCS, что делает Tempo очень экономичным.

Кроме того, Tempo позволяет ускорить отладку/устранение неполадок, позволяя быстро переходить от метрик к соответствующим трассировкам конкретных журналов, в которых зафиксированы некоторые проблемы.

Ниже приведены параметры конфигурации, используемые в Tempo.

  • Распределитель: они используются для настройки параметров получения для получения диапазонов и последующей отправки их получателям.
  • Ingester: они используются для создания пакетов трассировок и отправки их в TempoDB для хранения.
  • Компактор: он передает блоки из хранилища, такого как S3 или GCS, объединяет их и записывает обратно в хранилище.
  • Хранилище: используется для настройки TempoDB. В этой конфигурации необходимо указать имя серверной части хранилища (S3 или GCS) с другими параметрами.
  • Список участников: используется для координации между компонентами Tempo.
  • Аутентификация/сервер: Tempo использует сервер Weaveworks/Common. Он используется для настройки конфигурации сервера.

Архитектура темпа

На приведенной выше диаграмме показана рабочая архитектура Grafana Tempo.

Во-первых, распространитель получает спаны в разных форматах от Zipkin, Jaeger, OpenTelemetry, OpenCensus и отправляет эти спаны ингестерам, хешируя идентификатор трассировки. Затем Ingester создает пакеты трассировок, которые называются блоками.

Затем он отправляет эти блоки в серверное хранилище (S3/GCS). Когда у вас есть идентификатор трассировки, который вы хотите устранить, вы будете использовать пользовательский интерфейс Grafana и поместить идентификатор трассировки в строку поиска. Теперь querier отвечает за получение сведений о введенном вами идентификаторе трассировки либо из хранилища объектов, либо из хранилища объектов.

Во-первых, он проверяет, присутствует ли этот идентификатор трассировки в приемнике; если он не находит его, он проверяет серверную часть хранилища. Он использует простую конечную точку HTTP для предоставления трассировок. Тем временем компактор берет блоки из хранилища, объединяет их и отправляет обратно в хранилище, чтобы уменьшить количество блоков в хранилище.

Настройте Tempo с помощью Docker

В этом разделе я шаг за шагом настрою Grafana Tempo с помощью Docker. Во-первых, вам нужен бэкенд Tempo, поэтому настройте сеть докеров.

[[email protected] ~]$ docker network create docker-tempo

Загрузите файл конфигурации Tempo.

[[email protected] ~]$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

Ниже приведен список параметров протокола, которые вы получаете:

Протокол
Порт
Открытая телеметрия
55680
Jaeger – Бережный Компакт
6831
Jaeger — Экономичный бинарник
6832
Jaeger — Бережливый HTTP
14268
Джагер — GRPC
14250
Зипкин
9411

Используя файл конфигурации tempo, запустите контейнер Docker. Вот я выбираю Джагер – Формат Thrift Compact (порт 6831) для отправки трассировок.

[[email protected] ~]$ docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml

Теперь вам нужно запустить контейнер запросов Tempo. Итак, сначала загрузите файл конфигурации темпового запроса.

[[email protected] ~]$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

Используя файл конфигурации запроса темпа, запустите контейнер Docker.

[[email protected] ~]$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml

Теперь пользовательский интерфейс Jaeger будет доступен по адресу http://localhost:16686, как показано ниже.

В строке поиска вы можете добавить идентификатор трассировки из журнала, который вы хотите устранить, и он сгенерирует трассировки для вас.

Запуск демонстрационного приложения в Tempo

Пришло время запустить демонстрационный пример, предоставленный Grafana Tempo. Я запущу пример docker-compose, поэтому, если вы пытаетесь сделать то же самое, на вашем компьютере должен быть установлен docker-compose.

Загрузите zip-файл Grafana Tempo: https://github.com/grafana/темпо

Извлеките его в домашнюю папку и перейдите в каталог docker-compose. Вы найдете несколько примеров docker-compose; Я использую пример, когда данные приложения хранятся локально.

[[email protected] ~]$ cd tempo-master/example/docker-compose/
[[email protected] docker-compose]$ ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png

Запустите команду ниже, чтобы запустить стек.

[[email protected] docker-compose]$ docker-compose up -d
Starting docker-compose_prometheus_1 ... done
Starting docker-compose_tempo_1 ... done
Starting docker-compose_grafana_1 ... done
Starting docker-compose_tempo-query_1 ... done
Starting docker-compose_synthetic-load-generator_1 ... done

Как видите, он запустил контейнеры для Grafana, Loki, Tempo, Tempo-query и Prometheus.

[[email protected] docker-compose]$ docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS         PORTS                                                                                                      NAMES
84cd557ce07b   grafana/tempo-query:latest                 "/go/bin/query-linux…"   10 minutes ago   Up 4 seconds   0.0.0.0:16686->16686/tcp                                                                                   docker-compose_tempo-query_1
f7cd9cf460d9   omnition/synthetic-load-generator:1.0.25   "./start.sh"             10 minutes ago   Up 4 seconds                                                                                                              docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1   grafana/grafana:7.3.0-beta1                "/run.sh"                10 minutes ago   Up 6 seconds   0.0.0.0:3000->3000/tcp                                                                                     docker-compose_grafana_1
d8574ea25028   grafana/tempo:latest                       "/tempo -config.file…"   10 minutes ago   Up 6 seconds   0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp                                                          docker-compose_tempo_1
5f9e53b5a09c   prom/prometheus:latest                     "/bin/prometheus --c…"   10 minutes ago   Up 6 seconds   0.0.0.0:9090->9090/tcp                                                                                     docker-compose_prometheus_1

Вы также можете зайти в браузер и проверить, запущены ли Grafana, Jaeger UI, Prometheus.

Теперь генератор синтетической нагрузки, работающий внутри контейнера, генерирует идентификаторы трассировки, которые он помещает внутрь tempo. Запустите команду ниже, и вы сможете просмотреть журналы.

[[email protected] docker-compose]$ docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1 
| using params: 
--jaegerCollectorUrl http://tempo:14268
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
synthetic-load-generator_1 

Это идентификаторы трассировки, которые необходимо передать для создания трассировки.

Я копирую один из идентификаторов трассировки и помещаю его в панель поиска пользовательского интерфейса Jaeger.

Вы можете видеть, что он успешно сгенерировал трассировки, связанные с идентификатором трассировки, который я предоставил.

Вывод

Вот и все о Grafana Tempo. Продолжайте и начните использовать Tempo для создания трассировок, чтобы детально изучить метрики и проблемы в ваших журналах.

Все фиксируется в Tempo, и вы не упустите ни одной детали из-за понижения частоты дискретизации, которое имело место раньше. Tempo позволяет разработчику или рабочей группе понять основную причину ошибок или предупреждений, которые могут появиться в журналах.