GUIDEDetalle de latencia: percentiles, distribución y SLOs
Para métricas de latencia necesitas histogramas Prometheus:
http_request_duration_seconds (estándar OpenMetrics)api_latency_milliseconds)method, endpoint, statusLa variable $rate_interval controla la ventana de tiempo utilizada en las queries de rate() e histogram_quantile(). El valor por defecto es 5m.
15m o 30m para obtener resultados estables en lugar de vacíos con picos.rate_interval → edite el valor por defecto."No data" en los paneles de latencia es comportamiento esperado cuando no hay tráfico HTTP activo llegando a sus servicios — no es un error de configuración. Los paneles se poblarán en cuanto comiencen a llegar requests.
┌────────────────────────────────────────┐ │ LATENCY — PERCENTILES & SLOs │ ├────────────────────────────────────────┤ │ P50 │ P95 │ P99 │ │ (stat) │ (stat) │ (stat) │ ├────────────────────────────────────────┤ │ Distribution Time Series [12 cols] │ │ (líneas: P50, P95, P99) │ ├────────────────────────────────────────┤ │ Heatmap [6 cols] │ Table by Endpoint │ │ (buckets time) │ (top handlers) │ ├────────────────────────────────────────┤ │ SLO Alert — P99 < 500ms [12 cols] │ └────────────────────────────────────────┘
Tres paneles stat que muestran percentiles en milisegundos.
Query P50:histogram_quantile(0.50, rate(http_request_duration_seconds_bucket[5m])) * 1000Query P95:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) * 1000Query P99:
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) * 1000
Para metric custom (ej: ms ya):
histogram_quantile(0.95, rate(my_api_latency_ms_bucket[5m]))
Cambiar thresholds: Panel → Thresholds → Ajusta límites (ej: 100 yellow, 200 red)
Gráfico de líneas con evolución de P50, P95, P99 en el tiempo.
Agregar percentiles: En Legend/Aliases, personaliza labels:
| Percentil | Query | Label |
|---|---|---|
| P25 | histogram_quantile(0.25, ...) |
P25 |
| P50 | histogram_quantile(0.50, ...) |
P50 (Median) |
| P90 | histogram_quantile(0.90, ...) |
P90 |
| P95 | histogram_quantile(0.95, ...) |
P95 |
| P99 | histogram_quantile(0.99, ...) |
P99 |
Cambiar ventana de rate: Edita [5m] → [1m] para más sensibilidad o [15m] para suavizar
Visualización de distribución de latencia por buckets en el tiempo.
Default query (all buckets):rate(http_request_duration_seconds_bucket[5m])
Para resolver buckets específicos: Filtra por le valores de bucket:
rate(http_request_duration_seconds_bucket{le=~"0.01|0.05|0.1|0.5|1"}[5m])
Ajustar resolución: Panel → Heatmap options → Cell size, cambiar Bucket a discreto vs. continuo
Tabla dinámica con latencia por endpoint/handler.
Query base:topk(10, sum by (endpoint) (rate(http_request_duration_seconds_sum[5m]))) / topk(10, sum by (endpoint) (rate(http_request_duration_seconds_count[5m]))) * 1000
Cambiar top N endpoints: Reemplaza topk(10 con topk(20 o topk(5
Filtrar por método:
topk(10, sum by (endpoint, method) (rate(http_request_duration_seconds_sum{method="GET"}[5m])))
/ topk(10, sum by (endpoint, method) (rate(http_request_duration_seconds_count{method="GET"}[5m]))) * 1000
Stat o gauge que alerta si P99 supera el SLO.
Default SLO (500ms):histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) * 1000 < 500
Cambiar SLO a 300ms:
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) * 1000 < 300
Para alerta by endpoint:
histogram_quantile(0.99, sum by (endpoint) (rate(http_request_duration_seconds_bucket[5m]))) * 1000 < 250
Alert color: En Thresholds, configura:
| Tema | Primary | Secondary | OK Color |
|---|---|---|---|
| GREEN | #33FF00 |
#22BB00 |
#33FF00 |
| AMBER | #FFB000 |
#CC8C00 |
#FFB000 |
| BLUE | #00BFFF |
#0099CC |
#00BFFF |
| Tipo | Ancho (cols) | Alto (rows) |
|---|---|---|
| Mobile (< 768px) | 6 (stack vertical) | 8 |
| Tablet 10" | 12 (full width) | 10 |
| Tablet 12.9" | 12 (full width) | 12 |
| Desktop 1920×1080 | 24 (2 columnas) | 8 |
$GRAFANA_URL/api/dashboards/db/latencyhistogram_quantile(0.95,
rate(http_request_duration_seconds_bucket{status!~"5.."}[5m])) * 1000
Esto muestra P95 solo de requests exitosas (excluyendo 5xx).
histogram_quantile(0.95, sum by (instance) (rate(http_request_duration_seconds_bucket[5m]))) * 1000
Útil si tienes múltiples servidores y quieres detectar anomalías en instancias.
rate(increase(http_request_duration_seconds_bucket{le="1"}[5m]))[10m:1m]
Muestra tendencia de latencia en los últimos 10 minutos con resolución 1m.