Настроить monitoring сообщений в системе inter-agent communication
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить monitoring сообщений в системе inter-agent communication
1. Цель задачи
Сконфигурировать сбор и визуализацию ключевых метрик обмена сообщениями между агентами: количество сообщений в секунду (msg/s), задержка сообщений (latency), доля ошибок (error rate) и размер очереди недоставленных сообщений (DLQ size). Построить дашборд в Grafana для оперативного контроля состояния коммуникации между агентами и выявления аномалий.
Ключевой результат Рабочий дашборд Grafana с четырьмя панелями (msg/s, latency, error rate, DLQ size) на данных из Prometheus, полученных от instrumented-кода агента или симулированного брокера сообщений.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Система с inter-agent communication (например, несколько микросервисов, общающихся через очередь) | Существующий проект (Pet 241, AI Agency sandbox) или созданный вручную Python-эмулятор |
| Брокер сообщений (RabbitMQ / Kafka / NATS) | Docker контейнер localhost:5672 (RabbitMQ) или localhost:9092 (Kafka) |
| Метрики от брокера (msg/s, latency, error rate, DLQ size) | Prometheus exporter (rabbitmq_exporter, kafka_exporter) или ручной exporters на Python |
| Prometheus | docker-образ prom/prometheus:latest |
| Grafana | docker-образ grafana/grafana:latest |
| Python 3.10+ | Для эмуляции трафика, если брокера нет |
Если нет реального брокера — симулируем:
- Написать Python-скрипт
simulate_agent.py, который имитирует отправку сообщений (через простую очередь asyncio.Queue) и собирает статистику (время отправки, успешность). - Выставить метрики в Prometheus формате через prometheus_client на порту 8000 (например,
/metrics). - Запустить скрипт и Prometheus (локально или в Docker) так, чтобы Prometheus scraper собирал метрики.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Брокер сообщений | RabbitMQ / Kafka / NATS | Передача сообщений между агентами |
| Prometheus | prom/prometheus | Сбор и хранение метрик |
| Exporter для метрик | rabbitmq_exporter / kafka_exporter / custom Python exporter | Экспорт метрик из брокера в Prometheus |
| Grafana | grafana/grafana | Визуализация дашбордов |
| Python | prometheus_client, asyncio | Имитация агентов и метрик (если нет реального брокера) |
| Docker / docker-compose | — | Поднятие инфраструктуры локально |
4. Этапы выполнения
Этап 1: Настройка брокера сообщений и сбор метрик (45–60 минут)
Действия
-
Запустить брокер сообщений (выберите любой доступный).
-
Настроить экспорт метрик в Prometheus:
-
Написать/сконфигурировать prometheus.yml:
scrape_configs: - job_name: 'rabbitmq' static_configs: - targets: ['localhost:9419'] - job_name: 'custom_agent_metrics' static_configs: - targets: ['localhost:8000'] -
Запустить Prometheus:
docker run -d --name prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -
Проверить в http://localhost:9090/targets — состояние UP для всех таргетов.
Ожидаемый результат этапа Prometheus собирает метрики брокера (и/или кастомного Python-экспортера).
Этап 2: Генерация тестового трафика и измерение базовых метрик (30–45 минут)
Действия
-
Создать Python-скрипт
agent_traffic.py, который:- Подключается к брокеру (pika/Kafka-Python/nats-py)
- Публикует сообщение каждые 0.1–1 секунду (random interval)
- Измеряет время отправки (до подтверждения от брокера)
- В случайном порядке симулирует ошибки (таймауты, отказ публикации), увеличивая счётчик
error_total - Выставляет метрики через prometheus_client:
from prometheus_client import Counter, Histogram, Gauge, start_http_server msg_counter = Counter('messages_total', 'Total messages sent', ['status']) msg_latency = Histogram('message_latency_seconds', 'Latency of message send', buckets=(0.001, 0.01, 0.05, 0.1, 0.5, 1.0)) error_rate = Counter('message_errors_total', 'Total send errors') dlq_gauge = Gauge('dlq_size', 'Current DLQ size') - Периодически (раз в N сообщений) увеличивает DLQ_gauge на случайную величину (симуляция недоставленных)
-
Запустить скрипт (убедиться, что брокер доступен) и дать поработать 2–3 минуты.
-
Проверить в Prometheus Graph: rate(messages_total[1m]),
message_latency_seconds_bucket,message_errors_total— данные есть.
Ожидаемый результат этапа Prometheus содержит временные ряды четырёх ключевых метрик.
Этап 3: Расчёт производных метрик (latency percentiles, error rate, msg/s) (20–30 минут)
Действия
-
Проверить, что Prometheus записывает latency гистограмму — из неё можно получить p50, p95, p99 с помощью PromQL:
histogram_quantile(0.95, rate(message_latency_seconds_bucket[5m])) -
Рассчитать error rate как отношение ошибок к общему числу:
rate(message_errors_total[5m]) / rate(messages_total[5m]) * 100 -
Рассчитать msg/s:
rate(messages_total[5m]) -
Записать эти PromQL-запросы — они понадобятся для панелей дашборда.
Ожидаемый результат этапа Заготовлены 4 PromQL-запроса для панелей дашборда.
Этап 4: Создание дашборда в Grafana (30–45 минут)
Действия
-
Запустить Grafana:
docker run -d --name grafana -p 3000:3000 grafana/grafana -
Добавить источник данных Prometheus:
-
Создать новый дашборд (ID: 188-monitoring-agents) с четырьмя панелями:
Панель Тип PromQL-запрос Единицы Messages per second Time series rate(messages_total{status="success"}[5m])msg/s Message latency Time series (с перцентилями) histogram_quantile(0.95, rate(message_latency_seconds_bucket[5m]))seconds Error rate Time series rate(message_errors_total[5m]) / rate(messages_total[5m]) * 100% DLQ size Gauge / Stat dlq_sizeсообщения - Для панели latency добавить несколько запросов: p50, p95, p99 (Overrides).
- Настроить переключатели временного диапазона (last 1h, 6h, 24h).
-
Настроить alert (опционально): для error rate > 5% и DLQ > 1000.
-
Сохранить дашборд, экспортировать JSON в файл
dashboard_188.json.
Ожидаемый результат этапа Рабочий дашборд с 4 панелями, показывающий динамику метрик в реальном времени.
Этап 5: Документирование и проверка интеграции (15–20 минут)
Действия
-
Написать краткий
README.md:- Как запустить эмулятор / брокер
- Как подключиться к дашборду
- Какие метрики отображаются
- PromQL-запросы для каждой панели
-
Протестировать отказоустойчивость: временно остановить брокер — убедиться, что msg/s упал до нуля, error rate вырос, на DLQ прибавилось.
-
Зафиксировать скриншоты дашборда (две контрастные ситуации: нормальная работа + момент сбоя).
Ожидаемый результат этапа Комплект артефактов: дашборд (JSON), README, скриншоты.
5. Критерии приемки (Definition of Done)
- Дашборд Grafana отображает 4 панели: msg/s, latency (p95), error rate (%), DLQ size
- Все панели обновляются в режиме реального времени (интервал не более 15 секунд)
- Prometheus успешно собирает метрики из брокера/экспортера (targets UP)
- При симуляции сбоя (остановка публикации) метрики мгновенно отражают изменения
- Latency панель показывает минимум два перцентиля (p50 и p95)
- Error rate корректно вычисляется как отношение ошибок к общему числу сообщений
- DLQ size отображается в виде gauge (текущее значение)
- Дашборд имеет понятные названия, единицы измерения, легенду
- README описывает шаги запуска и PromQL запросы
- Все компоненты запускаются в Docker (или эквиваленте) одной командой docker-compose up
6. Ожидаемый результат
Основной артефакт
- Файл
dashboard_188.json— экспорт дашборда Grafana
Дополнительные артефакты
agent_traffic.py— симулятор трафика (если брокер не используется)prometheus.yml— конфиг PrometheusREADME.mdс инструкцией- Скриншоты дашборда в нормальном режиме и в момент сбоя
Содержимое дашборда
- Название: «Monitoring inter-agent communication»
- Переменные: нет (или выбрать временной диапазон)
- 4 панели: msg/s, latency (p50/p95/p99), error rate (%), DLQ size
- Alert-правила: error rate > 5%, DLQ > 1000 (опционально)
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Нет доступа к реальному брокеру сообщений | Использовать Python + prometheus_client как симулятор (см. Этап 2) |
| Метрики не отображаются в Prometheus (target DOWN) | Проверить сетевые порты, Docker network (--network host или общая bridge сеть). Убедиться, что exporter запущен и доступен изнутри контейнера Prometheus. |
| Grafana не видит Prometheus | Добавить Prometheus как Data Source с URL http://localhost:9090 или http://host.docker.internal:9090 (в зависимости от ОС) |
| DLQ size не растёт | В скрипте эмуляции вручную увеличивать Gauge при каждой ошибке или по таймеру |
| Latency гистограмма даёт пустые значения | Убедиться, что есть сообщения с разной задержкой, и buckets правильно настроены (начиная с очень малых значений) |
| Ошибка rate деления на ноль | В PromQL добавить or vector(0) или использовать rate(...) / (rate(messages_total) + 1) с последующим игнорированием |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Настройка брокера и Prometheus | 45–60 мин |
| Этап 2: Генерация трафика и базовых метрик | 30–45 мин |
| Этап 3: Расчёт производных метрик | 20–30 мин |
| Этап 4: Создание дашборда в Grafana | 30–45 мин |
| Этап 5: Документирование и проверка | 15–20 мин |
| Итого | 2 ч 20 мин – 3 ч 20 мин |
Примечание: При первом выполнении (если нет опыта работы с Prometheus/Grafana/брокерами) время может увеличиться до 5–6 часов. Рекомендуется заложить резерв.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 42 | Основы PromQL: rate, irate, increase |
| 55 | Настройка RabbitMQ Management Plugin |
| 78 | Экспорт метрик RabbitMQ в Prometheus |
| 112 | Проектирование дашбордов в Grafana |
| 134 | Мониторинг очередей Kafka: lag, throughput |
| 167 | Алертинг в Grafana на основе метрик очередей |
| 203 | Histogram vs Summary: выбор при сборе latency |
| 219 | Симуляция нагрузки для тестирования мониторинга |
| 245 | Docker Compose для стека Prometheus + Grafana |
| 288 | Best practices для мониторинга inter-agent систем |
10. Чек-лист самопроверки
- Я запустил брокер/симулятор и убедился, что метрики попадают в Prometheus
- Я написал все PromQL-запросы, которые планирую использовать в дашборде, и проверил их в Prometheus Graph
- В дашборде есть как минимум 4 панели, указанные в ТЗ
- Панель latency показывает не менее двух перцентилей (p50 и p95)
- Я добавил понятные заголовки и единицы измерения на каждую панель
- Я экспортировал дашборд в JSON-файл
- Я написал README с инструкцией по запуску стека
- Я сделал скриншоты дашборда в двух состояниях (норма и сбой)
- Я проверил, что при остановке эмиттера сообщений метрики адекватно падают до нуля
- Все файлы (docker-compose.yml, config, скрипты, дашборд) собраны в одной папке и готовы к передаче