Зачем это нужно
Метрики USE/RED бесполезны, если их никто не собирает и не показывает. Стек курса: Prometheus (или совместимый VictoriaMetrics) для хранения time series, Grafana для dashboards и alert visualization. Этот урок — как pieces fit together в Kubernetes для ML-сервисов.
Основные идеи
Pull vs push.
Prometheus по умолчанию scrapes targets (HTTP GET
/metrics) по interval.Pushgateway — исключение для batch jobs (краткоживущие pods); не замена для сервисов.
Компоненты в K8s.
| Component | Role |
|---|---|
| exporter / app | Exposes /metrics in Prometheus text format |
| ServiceMonitor (Prometheus Operator) | Declares scrape config for Service |
| Prometheus / VM | TSDB storage, PromQL queries |
| Grafana | Dashboards, alerts UI |
| Alertmanager | Routing notifications (урок 5.3.2) |
Prometheus text format example.
`
HELP http_requests_total Total HTTP requests
TYPE http_requests_total counter
http_requests_total{method="POST",handler="/predict",code="200"} 1024 `
VictoriaMetrics (VM). Prometheus-compatible API и PromQL; часто дешевле по RAM/ disk at scale. Remote write из Prometheus → VM — типовой hybrid. Для курса: те же queries, другой backend.
ServiceMonitor pattern.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: churn-serving spec: selector: matchLabels: app: churn-serving endpoints: - port: metrics interval: 15s
Pod Service must expose port metrics; app or sidecar implements exporter.
PromQL essentials.
rate(counter[5m])— per-second rate for counters.histogram_quantile(0.95, ...)— percentiles from histograms.sum by (pod) (...)— aggregation.
Percentile и SLO — не одно и то же. p95 < 200ms означает, что 95-й перцентиль latency ниже порога; request-based SLI requests < 200ms / all requests прямо считает долю good events. Они могут быть связаны, но SLO «99.5% запросов быстрее 200ms» нельзя называть «p95 < 200ms»: для него нужен порог 99.5% и явная формула good-event ratio.
Grafana.
Data source → Prometheus or VM URL.
Dashboard as code — JSON in Git (optional mature practice).
Variables:
$namespace,$model_versionдля drill-down.
Istio metrics. Sidecar exposes request metrics; standard RED without app instrumentation. Labels: destination_service, response_code.
Retention and cardinality. Prometheus local storage ~15d common; long-term → VM or object storage. Drop high-cardinality labels at scrape or recording rules.
ML platform dashboards layers.
Cluster/node (USE).
Namespace workloads (pods, HPA).
Per-model inference (RED + version label).
Business KPI (often from other DB, not always Prometheus).
Как это выглядит на практике
Namespace ml-prod:
Inference deployment with annotations for Prometheus or dedicated
prometheus-fastapi-instrumentatoron port 8080/metrics.ServiceMonitor in
monitoringnamespace selects podsapp=churn-serving.Prometheus Operator configures scrape.
Grafana dashboard imported: «Kubernetes / Istio / Custom ML».
Recording rule:
job:churn:request_latency_p95:5mfor faster alerts.
Query for error rate (Istio):
sum(rate(istio_requests_total{destination_service="churn-serving",response_code=~"5.."}[5m])) / sum(rate(istio_requests_total{destination_service="churn-serving"}[5m]))
Upgrade path: Prometheus scrapes → remote_write VictoriaMetrics → Grafana queries VM for heavy dashboards.
Что сделать после занятия
Найдите в кластере или docs, где живёт Prometheus/Grafana; откройте один dashboard.
Напишите PromQL для RPS и p95 latency вашего сервиса (conceptual labels).
Сравните: что даёт Istio metrics vs app-native
/metrics.