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

Мониторинг (опционально)

Опциональные компоненты

Компоненты мониторинга закомментированы в docker-compose.yml по умолчанию. Для их включения раскомментируйте соответствующие секции в файле compose/docker-compose.yml и перезапустите платформу.

Обзор стека мониторинга

graph LR
    subgraph M["Сбор метрик"]
        PR[Prometheus<br/>:9090]
    end

    subgraph V["Визуализация"]
        GR[Grafana<br/>:3000*]
    end

    subgraph T["Трейсинг"]
        JG[Jaeger<br/>:16686]
    end

    subgraph L["Логирование"]
        ES[Elasticsearch<br/>:9200]
        KB[Kibana<br/>:5601]
    end

    subgraph MS_["Микросервисы"]
        MS[Все сервисы]
    end

    MS -->|/metrics| PR
    MS -->|OTLP gRPC| JG
    MS -->|structlog JSON| ES
    PR --> GR
    ES --> KB

    classDef cluster fill:transparent,stroke:#888,stroke-width:1px
    class M,V,T,L,MS_ cluster

Конфликт портов

Стандартный порт Grafana (3000) совпадает с портом UI Gateway. При одновременном использовании измените порт Grafana в docker-compose.yml, например на 3001:

grafana:
  ports:
    - "3001:3000"  # Изменён с 3000 на 3001

Prometheus

Назначение: сбор и хранение метрик со всех микросервисов.

Параметр Значение
Контейнер prometheus
IP-адрес 172.28.0.60
Порт 9090
Web UI http://localhost:9090

Включение

Раскомментируйте секцию prometheus в docker-compose.yml и убедитесь, что файлы конфигурации существуют:

ls compose/prometheus/prometheus.yml
ls compose/prometheus/alerts.yml

Конфигурация

Файл compose/prometheus/prometheus.yml определяет цели сбора метрик (scrape targets):

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'model-management'
    static_configs:
      - targets: ['model-management:8000']

  - job_name: 'scan-profile'
    static_configs:
      - targets: ['scan-profile:8000']

  - job_name: 'results'
    static_configs:
      - targets: ['results:8002']

  - job_name: 'scan-orchestrator'
    static_configs:
      - targets: ['scan-orchestrator:8000']

Доступные метрики

Каждый микросервис экспортирует стандартные метрики на endpoint /metrics:

Метрика Тип Описание
http_requests_total Counter Общее количество HTTP-запросов
http_request_duration_seconds Histogram Время обработки запросов
db_pool_size Gauge Размер пула подключений к БД
db_pool_checked_out Gauge Количество активных подключений
nats_messages_published_total Counter Опубликованные NATS-сообщения
nats_messages_consumed_total Counter Полученные NATS-сообщения

Grafana

Назначение: визуализация метрик из Prometheus, создание дашбордов и алертов.

Параметр Значение
Контейнер grafana
IP-адрес 172.28.0.61
Порт 3000 (измените на 3001 при конфликте с UI Gateway)
Web UI http://localhost:3000 (или 3001)
Логин ${GRAFANA_ADMIN_USER:-admin}
Пароль ${GRAFANA_ADMIN_PASSWORD:-admin}

Включение

Раскомментируйте секцию grafana в docker-compose.yml. Grafana зависит от Prometheus.

Предустановленные дашборды

При включении Grafana автоматически настраивается через provisioning (compose/grafana/provisioning/):

  • Datasource: Prometheus (http://prometheus:9090)
  • Dashboards: располагаются в compose/grafana/provisioning/dashboards/

Jaeger (трейсинг)

Назначение: распределённый трейсинг — визуализация цепочек вызовов между микросервисами.

Параметр Значение
Контейнер jaeger
IP-адрес 172.28.0.70
Web UI http://localhost:16686
OTLP gRPC endpoint jaeger:4317 (используется микросервисами)

Порты Jaeger

Порт Протокол Описание
16686 HTTP Web UI для просмотра трейсов
14268 HTTP Collector (HTTP)
14250 gRPC Collector (gRPC)
4317 gRPC OTLP gRPC (OpenTelemetry)
6831 UDP Compact thrift
6832 UDP Binary thrift
5775 UDP Zipkin compact thrift
9411 HTTP Zipkin

Включение

Раскомментируйте секцию jaeger в docker-compose.yml.

Подключение микросервисов

Каждый микросервис отправляет трейсы через OpenTelemetry:

OTEL_ENABLED=true
OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317
OTEL_SERVICE_NAME=<имя-сервиса>

Типичный трейс включает:

  1. Входящий HTTP-запрос на UI Gateway.
  2. Проксирование на целевой микросервис.
  3. Запрос к базе данных.
  4. Публикация сообщения в NATS.
  5. Обработка воркером.

Elasticsearch + Kibana (логирование)

Назначение: централизованное хранение и поиск по логам всех микросервисов.

Elasticsearch

Параметр Значение
Контейнер elasticsearch
IP-адрес 172.28.0.80
Порт 9200 (HTTP), 9300 (Transport)
Режим Single-node
Java heap 512 МБ (-Xms512m -Xmx512m)

Kibana

Параметр Значение
Контейнер kibana
IP-адрес 172.28.0.81
Порт 5601
Web UI http://localhost:5601

Включение

Раскомментируйте секции elasticsearch и kibana в docker-compose.yml. Также раскомментируйте volume elasticsearch_data.

Системные требования

Elasticsearch требует vm.max_map_count=262144. Убедитесь, что этот параметр настроен (см. Подготовка сервера).

Формат логов

Все микросервисы используют библиотеку structlog и выводят логи в формате JSON:

{
  "timestamp": "2026-04-15T10:30:00.000Z",
  "level": "info",
  "service": "scan-orchestrator",
  "event": "Scan started",
  "scan_id": "550e8400-e29b-41d4-a716-446655440000",
  "trace_id": "abc123def456"
}

Мониторинг без дополнительных компонентов

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

Docker-команды

# Состояние всех контейнеров
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# Использование ресурсов
docker stats --no-stream

# Логи конкретного сервиса
docker logs -f --tail 100 scan-orchestrator

# Логи с временными метками
docker logs -f --timestamps model-management

Healthcheck-эндпоинты

# Скрипт проверки всех сервисов
./scripts/health-check.sh

# Или вручную
curl -s http://localhost:8001/healthz | jq .
curl -s http://localhost:8002/healthz | jq .
curl -s http://localhost:8003/healthz | jq .
curl -s http://localhost:8004/healthz | jq .
curl -s http://localhost:8005/healthz | jq .

NATS мониторинг

# Состояние кластера
curl -s http://localhost:8222/varz | jq '{server_name, version, connections, mem}'

# Информация о JetStream
curl -s http://localhost:8222/jsz | jq '{streams, consumers, messages, bytes}'