Skip to content

Мониторинг

SLOzy использует VictoriaMetrics для хранения метрик, Loki для сбора логов, Tempo для распределённой трассировки и Alertmanager для алертов.

Docker Compose

СервисПортОписание
victoria-metrics8428Хранилище метрик (совместимо с Prometheus API)
loki3100Агрегация логов
alloyСборщик логов Docker (замена Promtail)
tempo3200 / 4317 / 4318Трассировка (OTLP)
alertmanager9093Маршрутизация алертов
grafana3001Дашборды и визуализация
node-exporter9100Метрики хоста (CPU, RAM, диск, сеть)
cadvisor8083Метрики контейнеров

VictoriaMetrics

Конфигурация сбора: victoria-metrics/scrape.yml

yaml
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:

ПравилоУровеньУсловие
HostHighCpuwarningCPU > 80% за 5м
HostDiskFullwarningДиск > 85%
HostMemoryLowwarningRAM > 85%
SlozyWebDowncriticalСервис недоступен > 1м
SloBudgetBurnRatecriticalBurn rate > 1x

Хранение

  • Retention: 30 дней
  • Путь: /victoria-metrics-data (volume victoria_metrics_data)

HTTP RED-метрики

SLOzy экспортирует стандартные RED-метрики (Rate/Errors/Duration) через эндпоинт /metrics:

МетрикаТипМеткиОписание
http_requests_totalCountermethod, path, statusКоличество HTTP-запросов по методу, роуту и коду ответа
http_request_duration_secondsHistogrammethod, pathЗадержка запросов в секундах (стандартные корзины Prometheus)

Метрики собираются middleware (internal/middleware/metrics.go) и регистрируются в реестре Prometheus по умолчанию. VictoriaMetrics забирает их автоматически через job slozy-web.

Примеры PromQL-запросов:

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 нет метрик (ещё не собираются)
json
{
  "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 (volume loki_data)
  • Alloy читает /var/lib/docker/containers/*/*.log и отправляет в Loki

Tempo (трейсы)

Конфиг: tempo/tempo.yml

  • OTLP gRPC (4317), OTLP HTTP (4318)
  • Хранение: /var/tempo (volume tempo_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). После первого деплоя создайте этот файл вручную:

bash
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
VictoriaMetricsprometheushttp://victoria-metrics:8428
Lokilokihttp://loki:3100
Tempotempohttp://tempo:3200

Дашборды

НазваниеФайлОписание
Host & Containersgrafana/dashboards/host-overview.json13 панелей — хост (CPU/RAM/диск/сеть/IO) + контейнеры (CPU/память/сеть)

Экспортеры инфраструктуры

ЭкспортерКонтейнерМетрики
node_exporterslozy-node-exporterCPU хоста, память, диск, сеть, нагрузка
cAdvisorslozy-cadvisorCPU, память, сеть по контейнерам

Автоматически обнаруживаются VictoriaMetrics.

Dashboard: Availability Trend

График «Availability Trend» на главной странице показывает средний SLI (Service Level Indicator) по всем SLO за выбранный период.

Как работает

  1. Фронтенд вызывает GET /api/v1/slos/availability-trend?period=24h&step=1h
  2. Для каждого SLO с Prometheus-источником бэкенд запрашивает VictoriaMetrics — выполняется metric_query SLO
  3. Значения агрегируются: avg_sli = среднее арифметическое SLI всех SLO в каждый момент времени
  4. Фронтенд отрисовывает 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, график заполнится автоматически.