Мониторинг (опционально)¶
Опциональные компоненты
Компоненты мониторинга закомментированы в 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:
Prometheus¶
Назначение: сбор и хранение метрик со всех микросервисов.
| Параметр | Значение |
|---|---|
| Контейнер | prometheus |
| IP-адрес | 172.28.0.60 |
| Порт | 9090 |
| Web UI | http://localhost:9090 |
Включение¶
Раскомментируйте секцию prometheus в docker-compose.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:
Типичный трейс включает:
- Входящий HTTP-запрос на UI Gateway.
- Проксирование на целевой микросервис.
- Запрос к базе данных.
- Публикация сообщения в NATS.
- Обработка воркером.
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 .