RetroDash // ERROS

GUIAMonitoramento de erros: falhas HTTP, crashes de pods e OOM kills

Tema

Requisitos

Para monitoramento de erros você precisa:

Notas de Compatibilidade

Variável $job_node

Os painéis que referenciam dados a nível de nó (CPU, memória usada em queries de correlação) dependem da variável de dashboard $job_node. O valor padrão é node-exporter, que corresponde ao kube-prometheus-stack. Se o seu Prometheus utiliza um label de job diferente para node_exporter, atualize-o em Configurações do Dashboard → Variables.

A seção de Requisitos lista node_exporter como provedor de métricas do host/sistema. Isso foi atualizado intencionalmente de "system logs" em uma revisão anterior — se você encontrar documentação antiga referindo-se a "system logs", trate como métricas do host/sistema.

Mapa de Painéis

┌────────────────────────────────────────┐
│    ERROS — FALHAS & INCIDENTES         │
├────────────────────────────────────────┤
│  Taxa Erro │  Pods Falhos │ CrashLoop │
│  (%)       │  Contagem    │ Contagem  │
├────────────────────────────────────────┤
│  Linha Temporal de Erro [12 cols]      │
│  (evolução da taxa de erro)            │
├────────────────────────────────────────┤
│  Contagem OOMKilled │ Tendência Restart│
│  (gauge)            │ (série tempo)     │
├────────────────────────────────────────┤
│  Distribuição Tipos de Erro [6 cols]  │
│  Tabela Status Pods [6 cols]          │
├────────────────────────────────────────┤
│  Log de Eventos [12 cols]              │
│  (erros recentes por pod/container)     │
└────────────────────────────────────────┘

Personalização por Painel

Taxa Erro %

Porcentagem de requisições com erro (status 5xx).

100 * sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

Para incluir 4xx (erros de cliente):

100 * sum(rate(http_requests_total{status=~"[45].."}[5m]))
/ sum(rate(http_requests_total[5m]))

Apenas erros de timeout (504):

100 * sum(rate(http_requests_total{status="504"}[5m]))
/ sum(rate(http_requests_total[5m]))

Contagem de Pods Falhos

Número de pods em estado Failed ou 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 (desglose):

sum by (namespace) (kube_pod_status_phase{phase="Failed"})

Contagem CrashLoop

Pods presos em loops de reinício (CrashLoopBackOff).

sum(kube_pod_container_status_last_terminated_reason{reason="Error"})

Ou por estado de container:

count(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"})

Por pod específico:

count by (pod) (kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"})

Alerta limiar: Configure alerta em > 0 pods

Contagem OOMKilled

Containers encerrados por Out Of Memory.

sum(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"})

Correlacionar com limites de memória:

sum(kube_pod_container_resource_limits_memory_bytes) / 1024 / 1024 / 1024

Containers mais afetados por OOM:

topk(5, sum by (pod, container) (increase(kube_pod_container_status_last_terminated_reason{reason="OOMKilled"}[1h])))

Linha Temporal de Erro

Evolução temporal da taxa de erro (janela 5m).

Multi-série por código de status:

sum by (status) (rate(http_requests_total{status=~"5.."}[5m])) * 100

Mudar janela de tempo: [5m][1m] (responsivo) ou [15m] (suavizado)

Por serviço:

sum by (job, status) (rate(http_requests_total{status=~"5.."}[5m]))

Tendência de Reinício

Tendência de reinicialização 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 reinícios em 1h):

sum by (pod) (increase(kube_pod_container_status_restarts_total[1h])) > 10

Distribuição de Tipos de Erro (Pizza)

Desglose de erros por tipo (5xx, 4xx, timeout, etc).

Query para gráfico pizza:

sum by (status) (rate(http_requests_total{status=~"[45].."}[5m])) * 100

Categorias customizadas: Crie labels na sua aplicação:

Tabela Status Pods

Tabela dinâmica de pods com estado e razões de erro.

kube_pod_status_phase{phase!="Running"}

Adicione colunas no painel:

Log de Eventos

Tabela com eventos recentes (últimas 2 horas).

kube_events{type="Warning"} or kube_events{type="Error"}

Apenas eventos de erro nos últimos 30m:

increase(kube_events{type="Error"}[30m])

Ordenar por timestamp: No painel → Sort by → timestamp desc

Formato de colunas: Timestamp | Pod | Namespace | Razão | Mensagem

Mudar Tema de Cor

Tema Cor OK Aviso Crítico
GREEN #33FF00 #FFCC00 #FF4444
AMBER #FFB000 #FF8C00 #FF4500
BLUE #00BFFF #FFD700 #FF1493

Adaptar à sua Resolução

Tipo Largura Altura (Stat Cards) Altura (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 no Grafana

  1. Baixe ou copie JSON do painel ERROS
  2. Dashboards → Import
  3. Selecione datasource Prometheus
  4. Importe e verifique todas as métricas
  5. Se faltar kube_events, certifique-se que kube-state-metrics está disponível
  6. Salve e fixe na homepage

Dicas Avançadas

Alerta de degradação da taxa de erro

rate(http_requests_total{status=~"5.."}[5m]) >
  avg_over_time(rate(http_requests_total{status=~"5.."}[5m])[1h:5m]) * 2

Alerta se taxa de erro dobra em relação ao promédio de 1h.

Correlacionar erros com latência

histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{status=~"5.."}[5m])) * 1000

Mostra latência de APENAS as requisições que erraram (útil para detectar timeouts).

Pods com múltiplos reinícios recentes

sum by (pod) (increase(kube_pod_container_status_restarts_total[30m])) > 5

Identifica pods que estão se reiniciando mais de 5 vezes em 30min (sintoma de problema grave).