GUIDEMonitoreo de errores: HTTP failures, pod crashes y OOM kills
Para monitoreo de errores necesitas:
http_requests_total — contador HTTP (con label status)kube-state-metrics — pod/container status (para K8s)kubelet cAdvisor metrics — container lifecycle eventsnode_exporter — métricas del host/sistema (opcional)Los paneles que referencian datos a nivel de nodo (CPU, memoria utilizada en queries de correlación) dependen de la variable de dashboard $job_node. El valor por defecto es node-exporter, que coincide con kube-prometheus-stack. Si su Prometheus utiliza un label de job diferente para node_exporter, actualícelo en Configuración del Dashboard → Variables.
La sección de Requisitos lista node_exporter como proveedor de métricas del host/sistema. Esto fue actualizado intencionalmente desde "system logs" en una revisión anterior — si usted ve documentación antigua que hace referencia a "system logs", trátelo como métricas del host/sistema.
┌────────────────────────────────────────┐ │ ERRORS — FAILURES & INCIDENTS │ ├────────────────────────────────────────┤ │ Error Rate │ Failed Pods │ CrashLoop│ │ (%) │ Count │ Count │ ├────────────────────────────────────────┤ │ Error Timeline [12 cols] │ │ (evolución de tasa de error) │ ├────────────────────────────────────────┤ │ OOMKilled Count │ Restart Trend │ │ (gauge) │ (time series) │ ├────────────────────────────────────────┤ │ Error Types Distribution [6 cols] │ │ Pod Status Table [6 cols] │ ├────────────────────────────────────────┤ │ Event Log [12 cols] │ │ (recent errors by pod/container) │ └────────────────────────────────────────┘
Porcentaje de requests con error (status 5xx).
Query default (solo 5xx):100 * sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
Para incluir 4xx (client errors):
100 * sum(rate(http_requests_total{status=~"[45].."}[5m]))
/ sum(rate(http_requests_total[5m]))
Solo errores de timeout (504):
100 * sum(rate(http_requests_total{status="504"}[5m]))
/ sum(rate(http_requests_total[5m]))
Número de pods en estado Failed o Unknown.
Query base:sum(kube_pod_status_phase{phase=~"Failed|Unknown"})
Filtrar por namespace (ignorar jobs):
sum(kube_pod_status_phase{phase="Failed", namespace!~"default|kube-.*"})
Por namespace (breakdown):
sum by (namespace) (kube_pod_status_phase{phase="Failed"})
Pods atrapados en bucles de reinicio (CrashLoopBackOff).
Query:sum(kube_pod_container_status_last_terminated_reason{reason="Error"})
O por container state:
count(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"})
Por pod específico:
count by (pod) (kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"})
Alert threshold: Configura alerta en > 0 pods
Containers terminados por Out Of Memory.
Query:sum(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"})
Correlacionar con memory limits:
sum(kube_pod_container_resource_limits_memory_bytes) / 1024 / 1024 / 1024
Containers más afectados por OOM:
topk(5, sum by (pod, container) (increase(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}[1h])))
Evolución temporal de error rate (5m window).
Multi-serie por status code:
sum by (status) (rate(http_requests_total{status=~"5.."}[5m])) * 100
Cambiar ventana de time: [5m] → [1m] (responsivo) o [15m] (suavizado)
Por servicio:
sum by (job, status) (rate(http_requests_total{status=~"5.."}[5m]))
Tendencia de reiniciación de containers.
Query:sum(increase(kube_pod_container_status_restarts_total[5m]))
Por pod:
topk(10, sum by (pod) (increase(kube_pod_container_status_restarts_total[5m])))
Detectar pods críticos (> 10 reiniciios en 1h):
sum by (pod) (increase(kube_pod_container_status_restarts_total[1h])) > 10
Desglose de errores por tipo (5xx, 4xx, timeout, etc).
Query para pie chart:
sum by (status) (rate(http_requests_total{status=~"[45].."}[5m])) * 100
Categorías custom: Crea labels en tu app:
status="500" → Server Errorstatus="503" → Service Unavailablestatus="504" → Gateway Timeoutstatus="429" → Rate LimitedTabla dinámica de pods con estado y razones de error.
Query base:kube_pod_status_phase{phase!="Running"}
Añade columnas en panel:
kube_pod_status_conditions_ready → Ready statuskube_pod_container_status_last_terminated_reason → Reasonkube_pod_container_status_restarts_total → Restart countTabla con eventos recientes (últimas 2 horas).
Query:kube_events{type="Warning"} or kube_events{type="Error"}
Solo eventos de error en últimas 30m:
increase(kube_events{type="Error"}[30m])
Ordenar por timestamp: En panel → Sort by → timestamp desc
Formato de columnas: Timestamp | Pod | Namespace | Reason | Message
| Tema | OK Color | Warning | Critical |
|---|---|---|---|
| GREEN | #33FF00 |
#FFCC00 | #FF4444 |
| AMBER | #FFB000 |
#FF8C00 | #FF4500 |
| BLUE | #00BFFF |
#FFD700 | #FF1493 |
| Tipo | Ancho | Alto (Stat Cards) | Alto (Gráficos) |
|---|---|---|---|
| Mobile | 6 (stack) | 6 | 10 |
| Tablet 10" | 12 | 8 | 12 |
| Tablet 12.9" | 12 | 8 | 14 |
| Desktop 1920×1080 | 24 | 6 | 10 |
kube_events, asegúrate que kube-state-metrics está disponiblerate(http_requests_total{status=~"5.."}[5m]) >
avg_over_time(rate(http_requests_total{status=~"5.."}[5m])[1h:5m]) * 2
Alerta si error rate se duplica respecto al promedio de 1h.
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{status=~"5.."}[5m])) * 1000
Muestra latencia de SOLO los requests que erraron (útil para detectar timeouts).
sum by (pod) (increase(kube_pod_container_status_restarts_total[30m])) > 5
Identifica pods que se están reiniciando más de 5 veces en 30min (síntoma de problema grave).