Набор различных способов добавления OpenTelemetry-библиотек (инструментация) в приложения написанные на Python с использованием фреймворков Flask, FastAPI
Набор готовых настроек в виде Docker-контейнеров для быстрого запуска сервисов для работы с метриками, логами и трейсами:
Grafana
- UI для работы с трейсами, логами и метрикамиJaeger UI
- UI и хранилище для трейсовPrometheus
- хранилище метрикOpenTelemetry Collector
- сбор и обработка OpenTelemetry-данныхLoki
- хранилище логовTempo
- хранилище трейсовBeyla
- приложение для автоинструментации приложений с помощью eBPFPyrra
- процессинг и UI для работы с SLO, бюджетом ошибок и другими индикаторамиKarma
- UI для работы с алертамиAlertManager
- процессинг и UI для алертовWebhook Tester
- UI для просмотра отправляемых от AlertManager событийPyroscope
- просмотр профилировочной информации
TODO
TODO
Запустить все сервисы
docker-compose up -d
Пример работы работы распределенных трассировок в Python как с использованием автоинструментации (приложение на Flask), так и без нее, с добавлением opentelemtry-кода (приложение на FastAPI).
Описание цепочки между двумя сервисами:
Описание сервисов:
flask-app
- edge-сервис, в котором телеметрия подключена посредством автоинструментации. Сам сервис написан на Python с Flask без подключения opentelemtry-библиотекfastapi-app
- сервис, с добавлением в коде вызовов opentelemtry-библиотек. Написан на Python с FastAPI. Имеется подключение к БД и запрос данных из нее.
Выполнить запрос к flask-app
:
curl http://127.0.0.1:8001/users
Найти запрос в UI:
- Открыть
Grafana
, выбратьTempo
, переключиться в тип запросаSearch
и нажатьRun query
: - Открыть
Jaeger UI
, выбрать сервис внутриServices
и нажатьFind Traces
:
Открыть трейс запроса и получить всю информацию по спанам:
Пример сбора распределенных трассировок с двух взаимодействующих сервисов без каких-либо манипуляций с их кодом. С обоих сервисов собирается телеметрия посредством автоинструментации: через внешние библиотеки (сервис flask-app
) и через ebpf (сервис golang
)
Описание цепочки между двумя сервисами: TODO
Описание сервисов:
flask-app
- сервис, из предыдущего примера, без подключения opentelemtry-библиотекgolang-app
- простой сервис на Golang, без подключения opentelemtry-библиотек
Выполнить запрос к flask-app
:
curl http://127.0.0.1:8001/albums
Найти запрос в UI:
- Открыть
Grafana
, выбратьTempo
, переключиться в тип запросаSearch
и нажатьRun query
. - Открыть
Jaeger UI
, выбрать сервис внутриServices
и нажатьFind Traces
. - Открыть трейс запроса и получить всю информацию по спанам.
Запуск множества запросов на /users
через k6:
k6 run k6-script.js
Просмотр индикатров SLO в Pyrra:
Просмотр изменения значения индикатров SLO в Pyrra (например Latency - 95% успешных запросов должны быть обработаны быстрее, чем за 1с
):
Просмотр графиков изменения показателей используемых в расчете SLO в Pyrra:
Просмотр графиков изменения показателей используемых в расчете SLO в Pyrra:
Остановить все сервисы
docker-compose down -v
- https://sre.google/books/ - must-have SRE Books
- https://blog.alexewerlof.com/p/slc - инструмент для работы с SLI/SLO
- https://manassharma.hashnode.dev/opentelemetry-logs-deep-dive - хорошая обзорная статья про построение мониторинга на основе связанных сигналов телеметрии на базе OpenTelemtry & OpenObserve
- https://mkaz.me/blog/2024/slo-formulas-implementation-in-promql-step-by-step/ - статья про расчет SLO на основе Prometheus метрик для веб-сервиса
- https://grafana.com/oss/pyroscope/ - использование профилировщика для задач мониторинга