Настройка Predictive Monitoring (предсказание деградации) для сайта
Predictive Monitoring — это обнаружение признаков надвигающегося сбоя до того, как он произошёл. Классический мониторинг реагирует: CPU 90% → алерт. Предиктивный мониторинг предупреждает: CPU растёт со скоростью +2% в час, через 6 часов достигнет 90%. Разница — время на упреждающее действие.
Методы предсказания
Trend Analysis (линейная регрессия). Анализ тренда метрики за последние N часов для экстраполяции. Прост в реализации, работает для монотонных трендов (утечки памяти, накопление данных в очереди).
Seasonality-aware forecasting. Учитывает дневные и недельные паттерны. Prophet (Facebook/Meta) или Holt-Winters ETS. Подходит для метрик с регулярными циклами.
Anomaly Detection. ML-модели выявляют аномальное поведение без заранее заданных порогов. Isolation Forest, LSTM для временных рядов.
SLO Burn Rate. Не предсказание будущего, а опережающий индикатор: если error budget сгорает в 14x быстрее нормы, через 2 часа исчерпается месячный бюджет.
Prometheus: trend-based alerting
Простое предсказание на основе predict_linear():
# Предсказать, когда диск заполнится
- alert: DiskWillFillSoon
expr: |
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24 * 3600) < 0
for: 30m
labels:
severity: warning
annotations:
summary: "Disk on {{ $labels.instance }} will be full in < 24 hours"
current_free: "{{ $value | humanize1024 }}B"
# Предсказать рост memory
- alert: MemoryLeakDetected
expr: |
predict_linear(node_memory_MemAvailable_bytes[2h], 4 * 3600) <
0.1 * node_memory_MemTotal_bytes
for: 15m
labels:
severity: warning
annotations:
summary: "Memory may be exhausted in ~4 hours on {{ $labels.instance }}"
Burn Rate Alert (SLO-based):
- alert: FastBurnRate
expr: |
(
rate(http_requests_total{status=~"5.."}[1h])
/ rate(http_requests_total[1h])
) > 14.4 * (1 - 0.999)
for: 5m
labels:
severity: critical
annotations:
summary: "Error budget burning 14.4x faster than target — will exhaust in ~2 hours"
AWS CloudWatch Anomaly Detection
AWS Anomaly Detection — встроенный ML без настройки модели:
resource "aws_cloudwatch_metric_alarm" "cpu_anomaly" {
alarm_name = "cpu-anomaly-detection"
comparison_operator = "GreaterThanUpperThreshold"
evaluation_periods = 2
threshold_metric_id = "e1"
alarm_description = "CPU anomaly detected"
metric_query {
id = "e1"
expression = "ANOMALY_DETECTION_BAND(m1, 2)"
label = "CPUUtilization (Expected)"
return_data = true
}
metric_query {
id = "m1"
return_data = false
metric {
metric_name = "CPUUtilization"
namespace = "AWS/EC2"
period = 300
stat = "Average"
dimensions = {
InstanceId = aws_instance.app.id
}
}
}
}
ANOMALY_DETECTION_BAND(m1, 2) — предсказывает ожидаемый диапазон метрики (с учётом сезонности) и алертит при выходе за пределы 2σ.
Facebook Prophet для сложных паттернов
Для метрик с выраженными недельными/дневными паттернами:
from prophet import Prophet
import pandas as pd
import boto3
def fetch_metric_history(metric_name: str, days: int = 90) -> pd.DataFrame:
cw = boto3.client('cloudwatch')
# ... fetch from CloudWatch или Prometheus
return df # columns: ds (datetime), y (value)
def predict_metric(metric_name: str, hours_ahead: int = 24) -> dict:
df = fetch_metric_history(metric_name)
model = Prophet(
seasonality_mode='multiplicative',
daily_seasonality=True,
weekly_seasonality=True,
changepoint_prior_scale=0.05
)
model.fit(df)
future = model.make_future_dataframe(periods=hours_ahead, freq='h')
forecast = model.predict(future)
# Последние hours_ahead строк — предсказание
predictions = forecast.tail(hours_ahead)[['ds', 'yhat', 'yhat_lower', 'yhat_upper']]
# Найти когда предсказание превысит порог
threshold = get_threshold(metric_name)
breach_time = predictions[predictions['yhat'] > threshold]['ds'].min()
return {
'metric': metric_name,
'predicted_breach': breach_time.isoformat() if pd.notna(breach_time) else None,
'hours_until_breach': (breach_time - pd.Timestamp.now()).total_seconds() / 3600
}
Практические сценарии
Предсказание заполнения диска. predict_linear() в Prometheus — стандартный подход. Алерт за 24-48 часов до заполнения.
Детектирование утечек памяти. Монотонный рост memory при стабильной нагрузке — признак утечки. Алерт когда скорость роста превышает threshold.
Заблаговременное масштабирование. AWS Predictive Scaling анализирует исторический трафик и масштабирует ASG заранее, до пикового периода.
Деградация производительности БД. Рост P95 query time при стабильном RPS — признак деградации индексов или bloat. predict_linear(pg_query_duration_p95[2h], 6h) > SLO_threshold.
Интеграция предсказаний в алерты
Предиктивные алерты должны приводить к действиям, а не к панике:
- Алерт «диск заполнится через 24 часа» → создать тикет с низким приоритетом, не будить ночью
- Алерт «error budget сгорит через 2 часа» → будить oncall немедленно
Настройка через Alertmanager routes:
routes:
- match:
alertname: DiskWillFillSoon
receiver: ticket-only # Создать тикет, не звонить
- match:
alertname: FastBurnRate
receiver: pagerduty-critical
Сроки реализации
- predict_linear алерты в Prometheus — 1-2 дня
- CloudWatch Anomaly Detection — 1 день
- SLO burn rate alerts — 1-2 дня
- Prophet-based forecasting service — 5-10 дней
- Интеграция с алертингом + тонкая настройка — 2-3 дня







