Я создал демонстрационный проект 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 позволяет просматривать журналы и трассировки бок о бок.
Больше ссылок на эту тему:
- Открыть Веб-сайт Телеметрии
верблюд-открытая телеметрия
Компонент- Открытая Телеметрия Java Instrumentation
Оригинал: “https://dev.to/antongoncharov/distributed-logs-and-tracing-with-spring-apache-camel-opentelemetry-and-grafana-example-554e”