Skip to content

Аналитика

SLOzy предоставляет автоматическое обнаружение аномалий и рекомендации по настройке SLO на основе анализа исторических метрик.

Обнаружение аномалий

Аномалии выявляются с помощью функций в internal/analytics/detector.go и сохраняются в таблице anomaly_detections (миграция 000011):

sql
CREATE TABLE anomaly_detections (
    id SERIAL PRIMARY KEY,
    slo_id INT NOT NULL REFERENCES slos(id),
    detection_time TIMESTAMPTZ NOT NULL,
    anomaly_type VARCHAR(50) NOT NULL CHECK (anomaly_type IN (
        'burn_rate_spike', 'latency_degradation',
        'error_budget_critical', 'metrics_unavailable',
        'unexpected_pattern'
    )),
    severity VARCHAR(20) CHECK (severity IN ('low', 'medium', 'high', 'critical')),
    confidence_score NUMERIC(5,4),
    current_value NUMERIC(20,6),
    baseline_value NUMERIC(20,6),
    anomaly_reason TEXT,
    is_resolved BOOLEAN DEFAULT FALSE
);

Типы аномалий

ТипОписаниеПример
burn_rate_spikeРезкий рост скорости сгорания error budgetBurn rate > 2× за 5 минут
latency_degradationДеградация задержекP95 latency > 2× baseline
error_budget_criticalError budget на исходеОсталось < 10% бюджета
metrics_unavailableМетрики перестали поступатьОтсутствие данных > 5 минут
unexpected_patternНехарактерный паттерн метрикСуточная аномалия в трафике

Система сравнивает текущие значения с baseline — скользящим средним за 7 дней. Коэффициент уверенности (confidence_score) от 0 до 1 показывает, насколько отклонение статистически значимо.

Рекомендации SLO

На основе анализа аномалий и общей производительности система генерирует рекомендации в таблице slo_recommendations (миграция 000012):

sql
CREATE TABLE slo_recommendations (
    id SERIAL PRIMARY KEY,
    slo_id INT NOT NULL REFERENCES slos(id),
    recommendation_type VARCHAR(50) CHECK (recommendation_type IN (
        'target_adjustment', 'threshold_adjustment',
        'metric_query_optimization', 'alert_threshold_change',
        'monitoring_frequency_change'
    )),
    severity VARCHAR(20) DEFAULT 'info',
    message TEXT NOT NULL,
    recommended_value VARCHAR(255),
    rationale TEXT,
    expires_at TIMESTAMPTZ DEFAULT NOW() + INTERVAL '30 days'
);

Типы рекомендаций

ТипОписание
target_adjustmentКорректировка целевого значения SLO
threshold_adjustmentИзменение порогов healthy/warning/critical
metric_query_optimizationОптимизация PromQL запроса
alert_threshold_changeИзменение порогов срабатывания алертов
monitoring_frequency_changeИзменение частоты опроса метрик

Пример генерации рекомендации

sql
INSERT INTO slo_recommendations (
    slo_id, recommendation_type, severity,
    message, recommended_value, rationale
) VALUES (
    1, 'target_adjustment', 'medium',
    'Цель 99.9% не достигалась последние 30 дней. Рассмотрите снижение до 99.5%.',
    '99.5',
    'Текущая доступность за 30 дней: 99.3% при цели 99.9%. Цель превышает возможности сервиса.'
);

Рекомендации автоматически истекают через 30 дней. Функция cleanup_expired_recommendations() удаляет устаревшие записи. Пользователь может отклонить или принять рекомендацию — в случае принятия изменения применяются к SLO автоматически.

Получение аналитики через API

bash
# Аномалии для SLO
curl /api/v1/analytics/anomalies?slo_id=1&severity=high

# Рекомендации
curl /api/v1/analytics/recommendations?slo_id=1

# Принять рекомендацию
curl -X POST /api/v1/analytics/recommendations/5/apply