Skip to content

Мониторинг

SLOzy экспортирует метрики в формате Prometheus и поддерживает интеграцию с Grafana для визуализации SLO, error budget и состояния системы.

Prometheus

Эндпоинт метрик

Метрики приложения доступны по пути /metrics (настраивается через METRICS_PATH):

METRICS_PATH=/metrics
PROMETHEUS_ENABLED=true

Экспортируемые метрики

SLOzy экспортирует следующие метрики:

МетрикаТипМеткиОписание
slozy_requests_totalCountermethod, path, statusКоличество HTTP-запросов
slozy_request_duration_secondsHistogrammethod, pathГистограмма времени ответа
slozy_slo_valueGaugeslo_id, slo_nameТекущее значение SLO
slozy_error_budget_remainingGaugeslo_id, slo_nameОстаток error budget
slozy_error_budget_usedGaugeslo_id, slo_nameИспользованный error budget
slozy_active_slos_totalGaugeКоличество активных SLO
slozy_slo_statusGaugeslo_id, statusСтатус SLO (1=healthy, 2=warning, 3=critical)
slozy_db_connections_openGaugeОткрытые соединения к БД
slozy_db_connections_idleGaugeIdle-соединения к БД
slozy_cache_hits_totalCounterКоличество попаданий в кэш
slozy_cache_misses_totalCounterПромахи кэша
slozy_cache_entries_totalGaugeЗаписей в кэше
slozy_rate_limit_exceeded_totalCounteripПревышения rate limit
slozy_websocket_connectionsGaugeАктивные WebSocket-соединения

Пример конфигурации Prometheus (prometheus.yml)

yaml
scrape_configs:
  - job_name: 'slozy'
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: /metrics
    static_configs:
      - targets:
        - 'slozy-web:8080'
        - 'slozy-ingestor:8081'
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance
        regex: '(.*):.*'
        replacement: '${1}'

  - job_name: 'postgres'
    static_configs:
      - targets:
        - 'postgres-exporter:9187'

  - job_name: 'redis'
    static_configs:
      - targets:
        - 'redis-exporter:9121'

Grafana

Дашборды

Поставляется набор дашбордов для Grafana:

  1. SLO Overview — общая панель со всеми SLO, их статусами, error budget
  2. SLO Detail — детальный дашборд для конкретного SLO: временной ряд значения, скорость сжигания error budget, события оповещений
  3. System Health — состояние инфраструктуры: БД, Redis, WebSocket-соединения, latency запросов
  4. Cache Performance — hit ratio, размер кэша, время ответа

Источники данных

Для каждого дашборда требуется настроить Prometheus как Data Source в Grafana:

yaml
apiVersion: 1
datasources:
  - name: SLOzy
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true

Импорт дашбордов

Дашборды импортируются через Grafana API или UI. ID дашбордов:

НазваниеIDВерсия
SLO Overviewslozy-overview1.0
SLO Detailslozy-detail1.0
System Healthslozy-system1.0
Cache Performanceslozy-cache1.0

Health Checks

Приложение предоставляет несколько эндпоинтов для проверки состояния:

ПутьОписание
/healthБазовая проверка приложения
/api/v1/prometheus/healthПроверка подключения к Prometheus
/api/v1/health/readyГотовность к приёму трафика (проверка БД + Redis)

Параметры health check:

HEALTH_CHECK_INTERVAL=30s
HEALTH_CHECK_TIMEOUT=10s

Оповещения

Конфигурация оповещений в Prometheus Alertmanager:

yaml
groups:
  - name: slozy_alerts
    rules:
      - alert: SLOBudgetExhausted
        expr: slozy_error_budget_remaining <= 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: 'Error budget исчерпан для SLO {{ $labels.slo_name }}'

      - alert: SLOBurnRateTooFast
        expr: slozy_error_budget_used > 0.5
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: 'Error budget SLO {{ $labels.slo_name }} сжигается слишком быстро'

      - alert: HighRateLimitExceeded
        expr: rate(slozy_rate_limit_exceeded_total[5m]) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: 'Более 10 превышений rate limit в минуту'

      - alert: DatabaseDown
        expr: slozy_db_connections_open == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: 'База данных недоступна'