Перейти к содержанию

Приложение. Метрики мониторинга

Приложение дополняет подраздел 2.1.4 «Мониторинг состояния системы» в разделе 2. В основном разделе приведены оперативные проверки UI, API, контейнеров, дисков, GPU и inference-контура. Здесь зафиксированы технические метрики Prometheus, бизнес-метрики ClickHouse, источники их сбора, health-check механизмы, логирование и ограничения текущей реализации BOX5-DIT-MGSN.

1. Общая схема сбора

Метрики делятся на два класса:

  • бизнес-метрики - все показатели, которые хранятся или рассчитываются в ClickHouse: события, счётчики, статистика нарушений, витрины, отчётные и dashboard-агрегаты;
  • технические метрики - всё, что собирается вне ClickHouse: Prometheus /metrics, up, CPU, память, uptime, health/readiness endpoints, состояние контейнеров, дисков, GPU, Kafka, Redis, PostgreSQL, MinIO и журналы Loki.

Технические метрики собираются внутренним контуром elk-log. Сервис log-prometheus опрашивает /metrics у настроенных targets и хранит временные ряды в локальной TSDB. Журналы контейнеров собираются в log-loki и используются вместе с метриками для диагностики.

flowchart LR services["Сервисы BOX5-DIT-MGSN
GET /metrics"] --> prom["log-prometheus
Prometheus TSDB"] push["inf-pushgateway
агрегированные samples"] --> prom logs["Docker logs"] --> loki["log-loki
журналы контейнеров"] clickhouse["ClickHouse
бизнес-метрики
события, счётчики, витрины"] --> grafana["Grafana заказчика
внешний мониторинг"] prom -.->|"при согласованном подключении"| grafana

Исходный Mermaid-код схемы: И3-MER-005. 1. Общая схема сбора.

Внешняя Grafana заказчика не является сервисом BOX5-DIT-MGSN. Она может получать показатели из согласованных источников: аналитические и прикладные показатели из ClickHouse, технические метрики - из Prometheus или из экспортированного набора временных рядов, если такой доступ настроен эксплуатационно. Публиковать внутренние /metrics сервисов наружу без отдельного сетевого ограничения не следует.

2. Классификация метрик

При описании мониторинга BOX5-DIT-MGSN используется следующее правило: если показатель лежит в ClickHouse или рассчитывается запросом к ClickHouse, это бизнес-метрика; если источник не ClickHouse, это техническая метрика.

Класс Источник Примеры Назначение
Бизнес-метрики ClickHouse-инстансы доменов statistics, severstal, inference Количество событий и нарушений, счётчики присутствия/проходов, агрегаты по объектам и камерам, статистика подтверждений, данные витрин и отчётов. Анализ производственного процесса, отчётность, графики заказчика, проверка корректности бизнес-сценариев.
Технические метрики Prometheus log-prometheus, service /metrics, inf-pushgateway up, request_count_total, request_error_total, request_duration_*, cpu_usage, memory_usage, uptime. Контроль доступности сервисов, нагрузки, ошибок и деградации API.
Технические health/readiness сигналы Docker healthcheck, /-/ready, /-/healthy, /ready, /healthcheck, pg_isready, redis-cli PING Состояние контейнера, readiness Prometheus/Loki/Pushgateway, готовность Redis/PostgreSQL/Schema Registry/Node-RED/Flower. Быстрое обнаружение отказа процесса или локальной зависимости.
Технические журналы Docker logs, log-loki, локальные stdout/stderr и редкие файловые диагностические логи INFO, WARNING, ERROR, DEBUG, access-логи nginx/uvicorn, stack trace, сообщения Kafka consumers. Расследование причин отказа, поиск ошибок, подтверждение последовательности действий.
Техническое состояние узла Docker, ОС, GPU, диски, tmpfs, Kafka lag docker ps, df -h, nvidia-smi, состояние /dev/shm, consumer lag. Контроль инфраструктурных ресурсов, без которых бизнес-метрики могут перестать обновляться.

Бизнес-метрики не заменяют технический мониторинг: отсутствие новых событий в ClickHouse может быть следствием бизнес-сценария, недоступности камеры, отказа Kafka, заполнения диска или ошибки модели. Поэтому инцидент проверяется с двух сторон: сначала техническая доступность сервисов и потоков, затем корректность бизнес-данных в ClickHouse.

3. Проверка Prometheus и Loki

Проверки выполняются из внутренней сети контура или на узле поставки. Конкретный способ доступа зависит от deployment-профиля: Docker Compose, Docker Swarm и сетевых правил площадки.

Компонент Проверка Норма
log-prometheus GET http://log-prometheus:9090/-/ready и /-/healthy Prometheus готов и принимает запросы.
Targets Prometheus GET http://log-prometheus:9090/api/v1/targets или запрос up Ожидаемые targets находятся в состоянии up; недоступные targets видны как down.
Конфигурация Prometheus GET http://log-prometheus:9090/api/v1/status/config Загружена актуальная конфигурация scrape-targets.
log-loki GET http://log-loki:3100/ready Readiness Loki возвращает 200; если endpoint даёт 503, проверяются /loki/api/v1/status/buildinfo, query API, права на ${COMPOSE_DATA}/elk-log/loki и логи log-loki.
Loki API GET http://log-loki:3100/loki/api/v1/status/buildinfo API журналов отвечает, версия Loki доступна.
Хранилище метрик Каталог ${COMPOSE_DATA}/elk-log/prometheus Каталог доступен на запись Prometheus.
Хранилище логов Каталог ${COMPOSE_DATA}/elk-log/loki Каталог доступен на запись Loki; ошибки прав отражаются в логах log-loki.

Штатная конфигурация log-prometheus монтируется как /etc/prometheus/prometheus.yml; исходный файл находится в дереве поставки elk-log/configs/prometheus/prometheus.yml. Локальное хранилище Prometheus монтируется в контейнер как /prometheus.

4. Формат endpoint /metrics

Сервисы, поддерживающие Prometheus, отдают метрики в формате text exposition:

# HELP request_count_total Total Request Count
# TYPE request_count_total counter
request_count_total{method="AddCamera"} 1.0

Типовые элементы ответа:

Элемент Назначение
# HELP <metric_name> <description> Описание метрики.
# TYPE <metric_name> <type> Тип метрики: counter, gauge или histogram.
<metric_name>{label="value"} number Значение метрики с набором labels.

Типовые labels:

Label Назначение Примеры
method Имя gRPC/RPC/endpoint-метода. AddCamera, GetCameraList, SyncCameras
code Код ошибки для неуспешного запроса. Errors.NotFound
le Верхняя граница bucket у histogram-метрик. 0.05, 0.5, 1.0, +Inf
job, instance Labels, добавляемые Prometheus при scrape. load-balancer, inf-load-balancer:3000

5. Типовые семейства метрик

Метрика Тип Назначение
request_count_total counter Общее количество обработанных запросов по методу.
request_count_created gauge Timestamp создания series для request_count_total.
request_traffic_total counter Накопленный объём входящего payload по методу, в байтах.
request_traffic_created gauge Timestamp создания series для request_traffic_total.
response_traffic_total counter Накопленный объём исходящего payload по методу, в байтах.
response_traffic_created gauge Timestamp создания series для response_traffic_total.
request_duration_bucket histogram bucket Количество запросов, уложившихся в границу le.
request_duration_count histogram count Количество наблюдений длительности запроса.
request_duration_sum histogram sum Суммарное время обработки запросов, в секундах.
request_duration_created gauge Timestamp создания series для request_duration.
request_error_total counter Количество запросов, завершившихся ошибкой, с label code.
request_error_created gauge Timestamp создания series для request_error_total.
cpu_usage gauge Текущее использование CPU процессом или сервисом, в процентах.
memory_usage gauge Текущее использование памяти процессом или сервисом, в байтах.
uptime gauge Timestamp старта процесса сервиса.
up gauge Состояние scrape-target с точки зрения Prometheus: 1 - доступен, 0 - недоступен.

Пример фрагмента ответа:

request_count_total{method="AddObjectObservation"} 1.0
request_count_total{method="DeleteCamera"} 2.0
request_error_total{code="Errors.NotFound",method="DeleteCamera"} 1.0
request_duration_bucket{le="0.05",method="DeleteCamera"} 2.0
cpu_usage 21.4
memory_usage 1.27717376e+08
uptime 1.77666508638e+09

6. Источники метрик текущей реализации

В текущей реализации наличие маршрута /metrics зависит от конкретного сервиса и версии образа. Нельзя считать /metrics универсальной проверкой работоспособности всех контейнеров. Метрики из таблицы ниже относятся к техническому мониторингу, если они собираются через Prometheus/Loki, и к бизнес-мониторингу, если тот же показатель рассчитывается из ClickHouse.

Группа Примеры источников Что контролировать
Inference control-plane inf-load-balancer:3000/metrics, inf-image-storage:3000/metrics, inf-monitoring:3000/metrics Доступность target, количество запросов, ошибки, длительность ответов, CPU, память, uptime.
Агрегированные метрики inf-pushgateway:80/metrics, inf-pushgateway:80/-/ready Доступность gateway и наличие агрегированных samples, если producers настроены.
Statistics-сервисы st-auth, st-camera-storage, st-event-statistic, st-report-email, st-report-pdf-xlsx-generator, st-audit, st-comments, st-virt-cam-video-upload RPC-нагрузка, ошибки, длительность методов, трафик, CPU и память.
Интеграционные сервисы svr-severstal-org-sync Вызовы синхронизации, ошибки RPC, доступность зависимостей ПК-КОТ и st-camera-storage по профильным проверкам.
Временное хранилище ds-data-temporary-storage:3000/metrics Ошибки операций чтения/записи, трафик, доступность Redis sidecar.
Loki log-loki:3100/metrics Метрики самого хранилища журналов и HTTP-запросов Loki.
Песочница Node-RED /sandbox/flower/metrics, /sandbox/flower/healthcheck через nr-sbx-nginx Состояние Celery worker-ов и очередей песочницы; не является мониторингом промышленного инференса.
WebRTC relay inf-coturn:9641/metrics, если target добавлен в Prometheus Метрики Coturn и process-метрики; наличие endpoint не означает, что он включён в scrape-конфигурацию.

Основные targets Prometheus для inference-контура: inf-load-balancer, inf-image-storage, inf-monitoring, inf-pushgateway. Набор targets в промышленном контуре определяется активной конфигурацией поставки, поэтому при диагностике сначала проверяется текущий /etc/prometheus/prometheus.yml внутри log-prometheus.

7. Ограничения и альтернативные проверки

Часть контейнеров не имеет собственного Prometheus endpoint, а у части сервисов маршрут /metrics может возвращать 404 или 500 в текущей версии. В таких случаях для эксплуатационного контроля применяются профильные проверки.

Сервис или группа Ограничение /metrics Рабочая проверка
ui-react, ui-nginx, ui-rest-to-gprc Собственный /metrics не предусмотрен. GET /login, GET /config.json, GET /api/base/ping/, состояние контейнеров и логи.
PostgreSQL sidecar Собственный /metrics обычно не предусмотрен. pg_isready, SQL-подключение, наличие ожидаемых таблиц, резервные копии.
Redis sidecar Собственный /metrics обычно не предусмотрен. redis-cli PING, INFO keyspace, DBSIZE, логи клиентов.
Nginx-gateway сервисы /metrics, /health или stub_status часто не настроены. nginx -t, доступность upstream-маршрутов, HTTP-коды и Loki/Docker logs.
inf-nri-inference HTTP /metrics не предусмотрен. Процессы launch.py, tsm_inference.py, models_manager_service.py, heartbeat topics camera_nri_state_heartbeat, models_summary_heartbeat, tsm_process_stats_heartbeat, логи NRI.
inf-mediaserver В текущей конфигурации GET /metrics на :3000 возвращает 404. GET /api/status на debug-порту, heartbeat в Kafka, IPC-файлы /inference_ipc и /dev/shm, логи медиасервера.
Conversion-сервисы /metrics отсутствует или возвращает 404. GET /status_server через Unix socket, наличие socket-файла, успешный polling статуса конвертации, появление артефактов модели.
Часть statistics/severstal сервисов Endpoint может быть заявлен, но фактически возвращать 500. Проверка контейнера, read-only API/gRPC, доступность БД/MinIO/Kafka, consumer lag и логи.
Песочница Node-RED Большинство сервисов песочницы не имеет Prometheus endpoint; Flower покрывает только Celery. /sandbox/, /sandbox/config.json, /sandbox/flower/healthcheck, Redis/Kafka/Celery status и логи.

Для состояния камер, распределения по нодам и FPS основным источником остаются прикладные API из подраздела 2.1.4:

  • POST /api/inference/monitoring/light - состояние камер и heartbeat;
  • GET /api/inference/load-balancer/info2/ - распределение камер по нодам;
  • GET /api/inference/load-balancer/info/with_monitoring/ - распределение вместе с состоянием, если используется соответствующий UI/API-сценарий.

Prometheus показывает состояние сервисов и технических endpoints, но не заменяет эти API при расследовании отказа конкретной камеры или сценария.

8. Health-check механизмы

В поставке нет единого Kubernetes-стиля с обязательными livenessProbe и readinessProbe для каждого сервиса. Используются несколько механизмов: Docker healthcheck для отдельных контейнеров, HTTP readiness/health endpoints инфраструктурных сервисов, Prometheus /metrics как технический liveness сигнал и прикладные read-only API для проверки зависимостей.

В промышленной поставке Docker Health может быть задан только у части контейнеров. У большинства application-сервисов состояние в docker ps - просто Up, а готовность зависимостей проверяется через профильные команды и API.

Сервис или группа Тип Реализация Что проверяет Ограничение
log-prometheus readiness + liveness GET /-/ready, GET /-/healthy на :9090; список targets через /api/v1/targets или PromQL up. Готовность Prometheus и его HTTP API; отдельно показывает up/down scrape-targets. Успешный /-/ready не означает, что все targets доступны: устаревшие или отключённые targets могут быть down, при этом Prometheus остаётся готовым.
log-loki readiness + custom API check GET /ready, GET /loki/api/v1/status/buildinfo, GET /loki/api/v1/labels, query_range. Готовность Loki и возможность читать/искать журналы. /ready может возвращать 503 при проблемах готовности, даже если часть query API отвечает. Нужно проверять права на /loki, WAL/index/chunks и логи контейнера.
inf-pushgateway readiness + liveness GET /-/ready, GET /-/healthy, GET /metrics на :80. Живой процесс gateway и наличие агрегированных samples. Агрегаты хранятся в памяти и теряются при рестарте; endpoint не проверяет producers.
Основные Twirp/FastAPI сервисы statistics, inference, severstal, data-storage liveness/scrape GET /metrics на :3000, если endpoint реализован. Для типовых сервисов st-auth, st-camera-storage, inf-load-balancer, inf-image-storage, inf-monitoring, ds-data-temporary-storage, svr-severstal-org-sync /metrics является основным техническим endpoint; /health, /ready, /ping на том же порту обычно не предусмотрены. Процесс приложения отвечает и отдаёт Prometheus text exposition. /metrics не проверяет Kafka, PostgreSQL, Redis, MinIO, ClickHouse и бизнес-готовность метода. У части сервисов endpoint отсутствует или возвращает 500.
Redis sidecar inf-load-balancer-redis, inf-monitoring-redis, svr-asutp-redis, nr-sbx-redis Docker liveness/readiness redis-cli ping. Локальный Redis принимает команды и возвращает PONG. Не проверяет клиентов Redis и бизнес-кэш. На части Redis-контейнеров healthcheck не задан.
PostgreSQL sidecar svr-postgres-pk-kot Docker readiness pg_isready -U postgres. PostgreSQL принимает подключения. Не проверяет схему, миграции и прикладную целостность данных. У многих PostgreSQL sidecar healthcheck отсутствует.
svr-asutp-schema-registry Docker readiness curl -f http://localhost:8081/subjects. Schema Registry отвечает и может читать список subjects. Не подтверждает, что все ожидаемые схемы зарегистрированы и потребители АСУ ТП работают.
nr-sbx-node-red-vl Docker custom liveness node /healthcheck.js: HTTP/HTTPS запрос к 127.0.0.1:<settings.uiPort>, успешными считаются коды 200..499. Node-RED UI-процесс принимает HTTP-запрос. Коды 4xx считаются живым процессом; выполнение сценариев и доступность broker/worker проверяются отдельно.
nr-sbx-flower custom readiness песочницы /sandbox/flower/healthcheck через nr-sbx-nginx; /sandbox/flower/metrics. Flower и broker-backed мониторинг Celery отвечают. Покрывает только песочницу Node-RED/Celery, не промышленный inference.
ds-minio liveness + readiness GET /minio/health/live, GET /minio/health/ready на :9000. MinIO жив и готов обслуживать S3-запросы. Не проверяет наличие всех bucket/prefix и связность бизнес-сервисов с объектами в БД.
Публичный gateway custom smoke GET /api/base/ping/, GET /login, GET /config.json. UI/API-шлюз и базовый маршрут доступны через ui-nginx и ui-rest-to-gprc. Не доказывает готовность всех downstream-сервисов.
Inference business path custom functional readiness POST /api/inference/monitoring/light, GET /api/inference/load-balancer/info2/, GET /api/inference/models-storage/. Камеры, ноды балансировки и модели доступны на прикладном уровне. Требует авторизованный токен и проверяет уже более высокий уровень, чем liveness контейнера.

Для новых проверок в эксплуатационном регламенте следует явно указывать, какой уровень они покрывают:

  • liveness - процесс отвечает и контейнер не завис;
  • readiness - сервис готов принимать штатные запросы;
  • custom functional check - проверен конкретный бизнес- или интеграционный путь с зависимостями.

9. Система логирования

Основной канал логирования - stdout/stderr контейнеров. В промышленном контуре централизованная агрегация строится через Docker log driver loki: контейнеры отправляют логи в http://172.17.0.1:3100/loki/api/v1/push. Исключения возможны для сервисов, где явно выбран локальный или отключённый driver, например для отдельных gateway/observability/Redis-контейнеров.

flowchart LR app["Сервис BOX5-DIT-MGSN
stdout / stderr"] --> docker["Docker log driver"] docker -->|"loki"| loki["log-loki
/loki/api/v1/push"] docker -.->|"local / none
исключения"| local["docker logs
локальные файлы Docker"] loki --> grafana["Grafana Loki datasource
поиск по labels"] filelogs["Диагностические файловые логи
NRI/TSM, report-video-extractor"] -.-> admin["администратор
ручной сбор при инциденте"]

Исходный Mermaid-код схемы: И3-MER-006. 9. Система логирования.

Хранилища и точки поиска:

Источник Где хранится Как искать
Loki ${COMPOSE_DATA}/elk-log/loki: WAL, index и chunks Loki. Grafana datasource Loki или HTTP API log-loki:3100/loki/api/v1/query_range.
Docker logs Docker runtime на узле; для Loki stream в labels виден filename вида /var/log/docker/<container-id>/json.log. docker logs <container> --since ...; для driver loki - поиск через Loki.
Nginx local logs /var/log/nginx/access.log и /var/log/nginx/error.log внутри контейнера, выводятся в Docker logs. docker logs ui-rest-ui-nginx-1; по HTTP-коду, пути и upstream-ошибкам.
Диагностические файловые логи Отдельные mount-ы, например /logs у inf-report-video-extractor, TSM/NRI-файловые логи при ENABLE_TSM_FILE_LOGGING=true. Собирать вручную с узла или из контейнера при расследовании; не считать единой системой агрегации.

Фактические обязательные поля для поиска в Loki задаются Docker/Compose labels, а не единым JSON-форматом строки:

Поле Loki Назначение
host Узел, с которого пришёл лог.
container_name Полное имя контейнера, например statistics-st-auth-1.
compose_project Compose-домен: statistics, inference, severstal, data-storage, elk-log.
compose_service Имя сервиса внутри compose-файла, например st-auth или inf-load-balancer.
source Поток stdout или stderr.
filename Runtime-файл Docker log, полезен при сверке с локальным docker logs.

Единый обязательный trace_id или service_name в application-строках сейчас не закреплён для всех сервисов. В качестве service_name при поиске используются compose_service и container_name. Отдельные gateway-запросы могут иметь заголовки x-request-id и x-correlation-id, а ui-rest-to-gprc пишет trace-строки для некоторых GraphQL/API операций, но эти идентификаторы не являются сквозным обязательным контрактом для всего контура.

Распределение уровней логирования:

Группа сервисов Типовые уровни Что попадает в логи
statistics, severstal, data-storage, inference control-plane INFO, WARNING, ERROR; DEBUG - только как временный диагностический режим. Uvicorn/FastAPI/Twirp access-строки, время обработки методов, Kafka consumers/producers, миграции, ошибки БД/MinIO/Kafka/ClickHouse, stack trace.
inf-nri-inference и media/inference runtime INFO, WARNING, ERROR; DEBUG - только как временный диагностический режим. Запуск графов, модели, GPU/IPC/TSM, heartbeat, ошибки обработки кадров и событий. В промышленном контуре DEBUG следует включать только на время диагностики, иначе объём логов быстро растёт.
ui-nginx, nr-sbx-nginx, domain-gateway nginx Access log без явного уровня, error log с уровнями nginx. HTTP-метод, путь, код ответа, user agent, upstream 502/504, ошибки проксирования.
PostgreSQL, ClickHouse, Redis, Kafka, MinIO, Schema Registry, Superset, Flower Уровни зависят от upstream-продукта. Старт процесса, готовность принимать подключения, ошибки хранения, миграций, broker/storage warnings.
log-prometheus, log-loki, log-grafana Уровни upstream Prometheus/Loki/Grafana. Scrape errors, readiness, TSDB/WAL, Loki chunks/index, datasource/provisioning ошибки.

Интерпретация уровней:

  • INFO - штатные запросы, heartbeat, синхронизации, завершённые операции;
  • WARNING/WARN - деградация, retry, пропущенные необязательные данные, предупреждения healthcheck и нестабильные зависимости;
  • ERROR - исключения, отказ обязательной зависимости, неуспешная отправка в Kafka/БД/MinIO/внешнюю систему, stack trace;
  • DEBUG - подробная диагностика, допустимая в промышленном контуре только временно по инциденту.

При расследовании инцидента минимальный фильтр Loki:

{compose_project="statistics", compose_service="st-auth"} |= "ERROR"

Если контейнер не отправляет логи в Loki, используется docker logs:

docker logs <container> --since 30m --tail 300

Общие ограничения на публикацию диагностических данных приведены в разделе 4. При передаче фрагментов /metrics или LogQL-результатов оставляются только технически необходимые поля: имя метрики, service/job/instance, метод, код ошибки, время и значение.

10. Практические PromQL-запросы

Задача Запрос
Проверить недоступные targets up == 0
Оценить поток запросов по методам sum by (job, method) (rate(request_count_total[5m]))
Найти рост ошибок sum by (job, method, code) (increase(request_error_total[5m]))
Оценить p95 длительности методов histogram_quantile(0.95, sum by (le, job, method) (rate(request_duration_bucket[5m])))
Оценить входящий трафик sum by (job, method) (rate(request_traffic_total[5m]))
Оценить исходящий трафик sum by (job, method) (rate(response_traffic_total[5m]))
Найти перезапуск процесса по изменению uptime changes(uptime[15m]) > 0
Проверить CPU по сервисам с типовой метрикой avg by (job, instance) (cpu_usage)
Проверить память по сервисам с типовой метрикой avg by (job, instance) (memory_usage)

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