Рубрики
Без рубрики

Распределенные журналы и трассировка с помощью Spring, Apache Camel, Open Telemetry и Grafana: Пример

Я создал демонстрационный проект Apache Camel & Open Telemetry. Он демонстрирует, как добиться распределенности… С тегами camel, java, open telemetry, grafana.

Я создал демонстрационный проект Apache Camel & Open Telemetry. В нем демонстрируется, как добиться распределенной трассировки по маршрутам Camel и другим компонентам с использованием открытой телеметрии, которая представляет собой проекты OpenCensus и OpenTracing, объединенные в новую единую спецификацию в рамках CNCF. Проект использует Spring Boot в качестве базового сервисного фреймворка, Loki для хранения журналов, Tempo для хранения трассировок, Grafana в качестве программного обеспечения для визуализации.

антон-гончаров/верблюд-открытая телеметрия-графана-демо

Демонстрационный проект Apache Camel и Open Telemetry. Использует Spring Boot в качестве базовой сервисной платформы, Loki в качестве хранилища журналов, Tempo в качестве хранилища трассировки, Grafana в качестве программного обеспечения для визуализации.

Вступление

Apache Camel добавил поддержку открытой телеметрии в версии 3.5. Официальная документация не фокусируется на том, как настроить все для видимости журналов и трассировок, поэтому цель этого примера – заполнить этот пробел.

Open Telemetry – это проект с открытым исходным кодом, созданный в результате слияния OpenCensus и OpenTracing. Его цель состоит в том, чтобы обеспечить наблюдаемость приложения, предоставляя набор стандартизированных инструментов сбора данных для сбора и экспорта показателей, журналов и трассировок. Это один из самых активных проектов CNCF в наши дни.

Использование Camel в сочетании с Open Telemetry instrumentation позволяет нам распределять трассировку по разным маршрутам в одной или нескольких службах и связывать журналы приложений с этими трассировками, что делает его отличной альтернативой ELK и аналогичным решениям.

Это представление журналов и трассировок – это то, чего мы стремимся достичь в конечном итоге:

Важное примечание: в этом примере используется Apache Camel 3.10 (последняя доступная версия по состоянию на июнь 2021 года), которая зависит от OpenTelemetry SDK для Java версии 0.15.0. Спецификация Open Telemetry и ее инструменты быстро развиваются, теперь они выходят за рамки версии 1.x. В Camel tracker я вижу планы по обновлению зависимостей, но сегодня убедитесь, что для бесперебойного выполнения этого примера используется 0.15.0.

Как это работает

Проект представляет собой веб-приложение Spring Boot с именем “hello-service”, обслуживающее 2 конечные точки. /hello отвечает “Привет, ${name}” и /dispatch передает запрос нижестоящей службе.

Конфигурация docker-compose запускает 5 экземпляров контейнера:

  • helloservice (1) (контейнер “отправка”) принимает запросы и отправляет их вниз в hello-service (2)
  • приветственный сервис (2) (контейнер “привет”) обрабатывает отправленные запросы
  • loki – это хранилище журналов
  • tempo – это хранилище трассировок
  • grafana – это веб-панель мониторинга с визуализацией данных loki/tempo

Взаимодействие привет-сервис (1) и hello-service (2) здесь, чтобы продемонстрировать, как Open Telemetry отслеживает запросы в разных контейнерах.

Обзор архитектуры:

Обе службы “привет” отправляют журналы для входа в систему через loki-docker-driver и трассировки в Tempo через открытый экспортер телеметрии. Графана использует Loki и Tempo в качестве источников данных. Собранные журналы связаны с данными трассировки с помощью traceId, назначенного Open Telemetry instrumentation.

Услуга

Open Telemetry instrumentation динамически захватывает телеметрию из ряда популярных Java-фреймворков. Чтобы подключить его, добавьте opentelemetry-javaagent-all.jar в качестве агента java приложения JAR. Эта подготовка выполняется в файле Dockerfile.

Для интеграции с Camel важно, чтобы мы использовали Для интеграции с Camel важно, чтобы мы использовали

ADD /agent/opentelemetry-javaagent-all.jar /etc/agent/opentelemetry-javaagent-all.jar

ENTRYPOINT ["java", "-javaagent:/etc/agent/opentelemetry-javaagent-all.jar" , "-jar", "observable-service.jar"]

Для Camel 3.5+ требуется добавить зависимость camel-opentelemetry-starter . Затем в классе RouteBuilder настройте трассировщик следующим образом:

OpenTelemetryTracer ott = new OpenTelemetryTracer();
ott.init(this.getContext());

В конфигурации docker-compose есть несколько элементов, которые следует выделить.

  • OTEL_EXPORTER_OTLP_ENDPOINT – это конечная точка, куда отправляются открытые данные телеметрии. В нашем случае это приемник Tempo.
  • Мы не отправляем метрики в этой демонстрации, поэтому она отключена, чтобы скрыть все связанные предупреждения.
  • Конечная точка нисходящего потока указывает на адрес второй службы, чтобы показать, как работает распределенная трассировка.
  • В разделах logging указано, что stdout контейнера должен быть передан по конвейеру в локальное хранилище с помощью loki-docker-driver .
dispatch-service:
  image: hello-service:1.0.0
  container_name: dispatch
  networks:
    - "tempo-net"
  ports:
    - "8080:8080"
  environment:
    - OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:55680
    - OTEL_EXPORTER_OTLP_INSECURE=true
    - OTEL_METRICS_EXPORTER=none
    - OTEL_RESOURCE_ATTRIBUTES=service.name=dispatcher
    # sends requests to the 'hello-service' container
    - SRV_DOWNSTREAM_ENDPOINT=http://hello:8080/hello
  logging:
    driver: loki
    options:
      loki-url: "http://localhost:3100/loki/api/v1/push"

Второй экземпляр службы имеет аналогичную настройку, за исключением того факта, что у него нет нижестоящей службы.

В application.properties | logging.pattern форматирует выходные данные журнала таким образом, чтобы включить Трассировка и испанский . Это необходимо для того, чтобы система могла индексировать журналы и связывать их со следами.

Локи

Loki – это масштабируемая система агрегирования журналов для использования с Grafana.

Конфигурация Loki в значительной степени используется по умолчанию. Он открывает порт 3100, чтобы все остальные контейнеры docker могли отправлять туда журналы.

loki:
  hostname: "loki"
  image: grafana/loki:2.2.0
  ports:
    - "3100:3100"
  networks:
    - "tempo-net"
  command: "-config.file=/etc/loki/local-config.yaml"

Темп

Tempo – это масштабируемое хранилище трассировок. В нем есть приемники для телеметрии Jaeger, Zipkin и Open.

Файл tempo-config.yaml монтируется из проекта. Он отключает авторизацию и указывает, что экземпляр Tempo должен предоставлять открытый приемник телеметрии. Порт отеля по умолчанию – 55680.

tempo:
    hostname: "tempo"
    image: grafana/tempo:latest
    networks:
      - "tempo-net"
    volumes:
      - ./tempo-config.yaml:/etc/tempo-config.yaml
    command: "-config.file=/etc/tempo-config.yaml"

Графана

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

Как запустить

Я использовал Maven 3.8.1 + JDK11 для создания демо-версии, поэтому она должна работать со всеми версиями, начиная с этих версий.

Шаги по запуску и попытке:

1. Подготовить Докер

Установите драйвер Loki в Docker (для потоковой передачи журналов из стандартного вывода контейнера)

docker plugin install grafana/loki-docker-driver:latest -- 
alias loki --grant-all-permissions

Создайте сеть для демонстрационных сервисов:

docker network create tempo-net

2. Упакуйте сервис с помощью Maven

mvn package

3. Создайте образ контейнера

docker build . -t hello-service:1.0.0

4. Запустите скрипт docker-compose, чтобы открыть демо-версию

docker-compose run

5. Откройте веб-браузер и перейдите на панель управления Grafana: http://localhost:3000 . Перейдите в пункт меню Конфигурация->Источники данных.

6. Добавить новый источник данных Tempo (хранилище для трассировок)

7. Добавить новый источник данных Loki (хранилище для журналов)

Настройте “Производное поле” в источнике данных Loki, чтобы связать журналы со следами

8. Отправьте образец запроса

curl http://localhost:8080/dispatch?name=Ada

9. После того, как все настроено и выполнено, как указано выше, перейдите к пользовательскому интерфейсу Grafana по адресу http://localhost:3000 . Откройте вид “Исследовать” и переключитесь на локальный вид, используя выпадающий список сверху.

Поиск {container_name="dispatch"} выведет последние журналы для hello-service (1) выполняется в контейнере dispatch .

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

Нажмите на запись, которая имеет трассировку. Это развернуло бы подробную информацию о записи в журнале. Рядом с полем “traceId” есть кнопка, которая приведет нас к соответствующей трассировке.

Вуаля, мы добрались до распределенной трассировки для этого запроса. Каждый интервал содержит соответствующие записи журнала, сгруппированные в поле “Журналы” на этой панели.

Комбинированный разделенный просмотр в Grafana позволяет просматривать журналы и трассировки бок о бок.

Больше ссылок на эту тему:

Оригинал: “https://dev.to/antongoncharov/distributed-logs-and-tracing-with-spring-apache-camel-opentelemetry-and-grafana-example-554e”