Репозиторий: mlopshw (https://github.com/PrincessSats/mlopshw.git)
Цель: развернуть наблюдаемость для ML-сервиса, определить SLO и настроить алерт при его нарушении.
- ML-сервис на FastAPI с
/predict,/metrics,/healthи метриками Prometheus (histogram + counters) для SLO. - Prometheus собирает метрики сервиса, Grafana подключена к Prometheus и содержит дашборд по p95 latency.
- Alert Rule в Grafana срабатывает (Firing) при нарушении SLO.
- Скриншоты панели и алерта:
screenshots/*.png.
- ML service (FastAPI + prometheus_client): http://localhost:8000
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (логин/пароль: admin/admin)
- Установите Docker и Docker Compose.
- Поднимите стек:
docker-compose up --build- Проверьте доступность:
- /health: http://localhost:8000/health
- /metrics: http://localhost:8000/metrics
- Prometheus targets: http://localhost:9090/targets
- Grafana UI: http://localhost:3000 (дашборд подхватится из
grafana/dashboards/ml_service_dashboard.json).
p95 latency для /predict < 1.0 секунды (окно 5 минут).
Почему так:
- p95 отражает хвост задержек и влияет на UX.
- Histogram в Prometheus позволяет корректно считать квантили через
histogram_quantile().
PromQL для панели/алерта:
histogram_quantile(0.95, sum(rate(request_latency_seconds_bucket{endpoint="/predict"}[5m])) by (le))
- Latency Histogram:
request_latency_seconds_bucket/count/sum{endpoint="..."} - Requests Counter:
requests_total{endpoint="...", status="..."} - Errors Counter:
errors_total{endpoint="..."}
Файл: prometheus.yml
global:
scrape_interval: 5s
scrape_configs:
- job_name: "ml_service"
static_configs:
- targets: ["ml_service:8000"]- Datasource provisioning:
grafana/provisioning/datasources/datasource.yml(Prometheushttp://prometheus:9090). - Дашборд:
grafana/dashboards/ml_service_dashboard.json(панель p95 latency, обновление 5s). - Дашборд подхватывается через
grafana/provisioning/dashboards/dashboard.yml.
- Условие: p95 latency > 1s.
- Expr:
histogram_quantile(0.95, sum(rate(request_latency_seconds_bucket{endpoint="/predict"}[5m])) by (le)) > 1 - For: 2m, evaluate every 1m. При превышении правило переходит в состояние Firing (см. скриншоты).
- Запустите сервисы (
docker-compose up). - Искусственно увеличьте задержку, чтобы выбить SLO:
for i in {1..50}; do curl -s "http://localhost:8000/predict?sleep=2" > /dev/null; done- На дашборде p95 уйдет выше 1s; через ~2 минуты правило станет Firing. Скриншоты лежат в
screenshots/.
docker-compose.yml— поднимает ml_service + Prometheus + Grafana.prometheus.yml— конфигурация сбора метрик.grafana/provisioning/datasources/datasource.yml— datasource Prometheus.grafana/provisioning/dashboards/dashboard.yml— авто-подхват дашбордов.grafana/dashboards/ml_service_dashboard.json— экспорт дашборда SLO.ml_service/main.py— FastAPI сервис с метриками и эндпоинтами.screenshots/*.png— график и алерт в состоянии Firing.
- Собрать и визуализировать метрики из Python-сервиса.
- Определить SLO (latency p95 < 1 c) и реализовать метрику Histogram для его расчета.
- Создать панель в Grafana с правильным PromQL-запросом.
- Настроить алерт, который срабатывает при нарушении SLO, и проверить его вручную.