RetroDash // ERRORS

GUIDEMonitoreo de errores: HTTP failures, pod crashes y OOM kills

Tema

Requisitos

Para monitoreo de errores necesitas:

Notas de Compatibilidad

Variable $job_node

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.

Mapa de Paneles

┌────────────────────────────────────────┐
│    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)      │
└────────────────────────────────────────┘

Personalización por Panel

Error Rate %

Porcentaje de requests con error (status 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]))

Failed Pods Count

Número de pods en estado Failed o Unknown.

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"})

CrashLoop Count

Pods atrapados en bucles de reinicio (CrashLoopBackOff).

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

OOMKilled Count

Containers terminados por Out Of Memory.

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])))

Error Timeline

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]))

Restart Trend

Tendencia de reiniciación de containers.

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

Error Types Distribution (Pie)

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:

Pod Status Table

Tabla dinámica de pods con estado y razones de error.

kube_pod_status_phase{phase!="Running"}

Añade columnas en panel:

Event Log

Tabla con eventos recientes (últimas 2 horas).

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

Cambiar Tema de Color

Tema OK Color Warning Critical
GREEN #33FF00 #FFCC00 #FF4444
AMBER #FFB000 #FF8C00 #FF4500
BLUE #00BFFF #FFD700 #FF1493

Adaptar a tu Resolución

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

Importar en Grafana

  1. Descarga o copia JSON del dashboard ERRORS
  2. Dashboards → Import
  3. Selecciona datasource Prometheus
  4. Importa y verifica todas las métricas
  5. Si falta kube_events, asegúrate que kube-state-metrics está disponible
  6. Guarda y fija en homepage

Tips Avanzados

Alerta de degradación de error rate

rate(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.

Correlacionar errors con latencia

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).

Pods con múltiples reiniciios recientes

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).