Мониторинг
SLOzy использует VictoriaMetrics для хранения метрик, Loki для сбора логов, Tempo для распределённой трассировки и Alertmanager для алертов.
Docker Compose
| Сервис | Порт | Описание |
|---|---|---|
victoria-metrics | 8428 | Хранилище метрик (совместимо с Prometheus API) |
loki | 3100 | Агрегация логов |
alloy | — | Сборщик логов Docker (замена Promtail) |
tempo | 3200 / 4317 / 4318 | Трассировка (OTLP) |
alertmanager | 9093 | Маршрутизация алертов |
grafana | 3001 | Дашборды и визуализация |
node-exporter | 9100 | Метрики хоста (CPU, RAM, диск, сеть) |
cadvisor | 8083 | Метрики контейнеров |
VictoriaMetrics
Конфигурация сбора: victoria-metrics/scrape.yml
scrape_configs:
- job_name: 'slozy-web' → slozy-web:8080
- job_name: 'node-exporter' → node-exporter:9100
- job_name: 'cadvisor' → cadvisor:8080
- job_name: 'alertmanager' → alertmanager:9093/metrics (via /alertmanager/metrics)
- job_name: 'loki' → loki:3100
- job_name: 'tempo' → tempo:3200
- job_name: 'victoria-metrics' → selfПравила алертов
Файл alertmanager/rules/alerts.yml, выполняются VictoriaMetrics:
| Правило | Уровень | Условие |
|---|---|---|
HostHighCpu | warning | CPU > 80% за 5м |
HostDiskFull | warning | Диск > 85% |
HostMemoryLow | warning | RAM > 85% |
SlozyWebDown | critical | Сервис недоступен > 1м |
SloBudgetBurnRate | critical | Burn rate > 1x |
Хранение
- Retention: 30 дней
- Путь:
/victoria-metrics-data(volumevictoria_metrics_data)
HTTP RED-метрики
SLOzy экспортирует стандартные RED-метрики (Rate/Errors/Duration) через эндпоинт /metrics:
| Метрика | Тип | Метки | Описание |
|---|---|---|---|
http_requests_total | Counter | method, path, status | Количество HTTP-запросов по методу, роуту и коду ответа |
http_request_duration_seconds | Histogram | method, path | Задержка запросов в секундах (стандартные корзины Prometheus) |
Метрики собираются middleware (internal/middleware/metrics.go) и регистрируются в реестре Prometheus по умолчанию. VictoriaMetrics забирает их автоматически через job slozy-web.
Примеры PromQL-запросов:
-- Интенсивность запросов по роуту
rate(http_requests_total{job="slozy-web"}[5m])
-- Доля ошибок (5xx / всего)
sum(rate(http_requests_total{job="slozy-web",status=~"5.."}[5m])) / sum(rate(http_requests_total{job="slozy-web"}[5m]))
-- 95-й перцентиль задержки
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket{job="slozy-web"}[5m])) by (le, path))Публичный статус (лендинг)
Эндпоинт GET /api/v1/status/public используется виджетом на лендинге. Не требует аутентификации.
healthy— у SLO есть хотя бы одна метрика, достигшая целиviolated— у SLO есть метрики, но ни одна не достигла целиno_data— у SLO нет метрик (ещё не собираются)
{
"status": "ok",
"uptime": "3d 2h 15m",
"timestamp": "2026-06-22T08:17:39Z",
"services": {
"api": true,
"database": true,
"cache": true
},
"slos": {
"total": 5,
"healthy": 0,
"violated": 0,
"no_data": 5
}
}Loki (логи)
Конфиг: loki/loki-config.yml
- Хранилище на файловой системе, путь
/loki(volumeloki_data) - Alloy читает
/var/lib/docker/containers/*/*.logи отправляет в Loki
Tempo (трейсы)
Конфиг: tempo/tempo.yml
- OTLP gRPC (4317), OTLP HTTP (4318)
- Хранение:
/var/tempo(volumetempo_data), 72 часа - Metrics generator: service graphs и span metrics → VictoriaMetrics
Приложение использует OpenTelemetry SDK. Трейсы экспортируются через OTLP HTTP в Tempo (10% семплинг): OTEL_EXPORTER_OTLP_ENDPOINT=http://tempo:4318
Alertmanager
Конфиг: alertmanager/alertmanager.yml
- Алерты отправляются в Telegram через slozybot
- Токен хранится в файле
alertmanager/telegram_bot_token(не в git) - Маршрутизация: все алерты → receiver
telegramсsend_resolved: true - Health check:
/alertmanager/-/healthy
Две системы уведомлений
SLOzy использует две независимые системы уведомлений — они не делят конфигурацию и решают разные задачи.
SLO-уведомления (встроенные)
Настраиваются через веб-интерфейс (Settings → Notification Channels). Используются для оповещений о нарушениях SLO, доставляются через бэкенд SLOzy.
Поддерживаемые каналы: Email, Slack, Telegram, Mattermost, Webhook.
Инфраструктурные алерты (Alertmanager)
Отдельная система для алертов хоста и контейнеров (CPU, диск, RAM, недоступность сервиса). Работает через Alertmanager + vmalert → Telegram.
Конфигурация: alertmanager/alertmanager.yml. Токен Telegram-бота хранится в файле alertmanager/telegram_bot_token (не в git). После первого деплоя создайте этот файл вручную:
echo -n "YOUR_BOT_TOKEN" > alertmanager/telegram_bot_token
chmod 644 alertmanager/telegram_bot_token
docker compose up -d --force-recreate alertmanager⚠️ Эти системы независимы — добавление канала в веб-интерфейсе не настраивает Alertmanager, а настройка Alertmanager не влияет на SLO-уведомления.
Grafana
Доступна по https://slozy.net/grafana (admin / из .env).
Datasources (авто-провижининг)
| Название | Тип | URL |
|---|---|---|
| VictoriaMetrics | prometheus | http://victoria-metrics:8428 |
| Loki | loki | http://loki:3100 |
| Tempo | tempo | http://tempo:3200 |
Дашборды
| Название | Файл | Описание |
|---|---|---|
| Host & Containers | grafana/dashboards/host-overview.json | 13 панелей — хост (CPU/RAM/диск/сеть/IO) + контейнеры (CPU/память/сеть) |
Экспортеры инфраструктуры
| Экспортер | Контейнер | Метрики |
|---|---|---|
| node_exporter | slozy-node-exporter | CPU хоста, память, диск, сеть, нагрузка |
| cAdvisor | slozy-cadvisor | CPU, память, сеть по контейнерам |
Автоматически обнаруживаются VictoriaMetrics.
Dashboard: Availability Trend
График «Availability Trend» на главной странице показывает средний SLI (Service Level Indicator) по всем SLO за выбранный период.
Как работает
- Фронтенд вызывает
GET /api/v1/slos/availability-trend?period=24h&step=1h - Для каждого SLO с Prometheus-источником бэкенд запрашивает VictoriaMetrics — выполняется
metric_querySLO - Значения агрегируются:
avg_sli= среднее арифметическое SLI всех SLO в каждый момент времени - Фронтенд отрисовывает area chart с усреднённой линией SLI
Что означают цифры
| Показатель | Значение |
|---|---|
| Average across all SLOs: 74.95% | Средневзвешенное значение target по всем SLO. Показывает ожидаемый уровень, а не реально измеренный SLI. |
| SLOs with data | Сколько SLO вернули данные из VictoriaMetrics за период. Если 0 — проверьте доступность источника Prometheus. |
| Ось Y графика | Соотношение SLI (0.0–1.0), где 1.0 = 100% соответствия цели. |
Почему «No metric data yet»
Сообщение появляется когда:
- Ни у одного SLO не настроен Prometheus-источник данных
- PromQL-запросы не возвращают временных рядов (метрики не существуют или источник недоступен)
- VictoriaMetrics ещё стартует и не накопила данных
После создания SLO с валидным metric_query, ссылающимся на реальные метрики Prometheus, график заполнится автоматически.