Все три Go-сервиса (ingest, device-control, rule-engine) отдают /metrics в формате Prometheus: счётчики MQTT/RabbitMQ/ClickHouse операций, гистограммы длительности батч-флашей и диспатча правил, переходы устройств online/offline. Добавлены сервисы prometheus и grafana в docker-compose с провижининг конфигом (datasource + два готовых дашборда: "Ingest & Telemetry" и "Automation & Devices").
2.5 KiB
ingest-service (Go)
Статус: реализован (MVP).
Зона ответственности:
- Подписка на MQTT-топики
devices/{device_id}/telemetry. - Валидация/парсинг payload (device_id, sensor_type, value, timestamp).
- Батч-запись сырых показаний в таблицу ClickHouse
telemetry. - Публикация события «новое показание» в RabbitMQ для rule-engine-service.
Не входит в зону ответственности: интерпретация того, что означает показание датчика (пороги, действия) — это задача rule-engine-service. Этот сервис только принимает и сохраняет данные.
Про zone_id: payload телеметрии несёт zone_id напрямую (публикующее
устройство/эмулятор само знает свою зону), а не ingest-service ищет его в
PostgreSQL. Это удерживает зависимости ingest-service в рамках
MQTT/ClickHouse/RabbitMQ, как и на диаграмме архитектуры в корневом README.
Для реального парка устройств, которые не будут знать свою зону,
понадобится lookup через реестр устройств (с кэшированием, как rule-engine
кэширует правила) — это естественное развитие, пока не реализовано.
Метрики
GET /metrics (порт INGEST_METRICS_PORT, по умолчанию 9101) — формат
Prometheus. Счётчики принятых/невалидных/отброшенных (backlog переполнен)
MQTT-сообщений, флашей батча в ClickHouse (с latency и размером батча),
публикаций в RabbitMQ.
Запуск
cd services/ingest-service
go test ./...
go build ./cmd/ingest-service
Конфигурация читается из переменных окружения (см. секцию ingest-service в
корневом .env.example). Через docker compose up ingest-service сервис
обращается напрямую к контейнерам mosquitto/clickhouse/rabbitmq; для
локального запуска через go run выставь MQTT_HOST=localhost,
CLICKHOUSE_HOST=localhost и т.д.