Capítulo 11.3 - Alerting
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Compreender o sistema de alerting do Prometheus
- Configurar o Alertmanager
- Criar regras de alerta
- Gerenciar notificações (email, Slack, PagerDuty)
- Configurar grouping e routing
- Implementar silence e inhibition
Introdução
O alerting permite notificar as equipes quando problemas são detectados no cluster ou nas aplicações.
Arquitetura de Alerting
Prometheus
- Coleta as métricas
- Avalia as regras de alerta
- Envia os alertas para o Alertmanager
Alertmanager
- Recebe os alertas do Prometheus
- Agrupa e faz o roteamento dos alertas
- Envia as notificações
Instalação do Alertmanager
Via kube-prometheus-stack
O Alertmanager está incluído no kube-prometheus-stack.
Verificação
# Ver os Pods
kubectl get pods -n monitoring | grep alertmanager
# Acessar o Alertmanager
kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-alertmanager 9093:9093
Criação de Regras de Alerta
PrometheusRule
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubernetes-alerts
namespace: monitoring
spec:
groups:
- name: kubernetes.rules
rules:
# Pod CrashLooping
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.pod }} está em crash looping"
description: "O pod {{ $labels.pod }} no namespace {{ $labels.namespace }} reiniciou {{ $value }} vezes nos últimos 15 minutos"
# High CPU Usage
- alert: HighCPUUsage
expr: 100 - (avg(rate(container_cpu_usage_seconds_total[5m])) * 100) < 10
for: 5m
labels:
severity: critical
annotations:
summary: "Alto uso de CPU em {{ $labels.instance }}"
description: "O uso de CPU está acima de 90% em {{ $labels.instance }}"
# High Memory Usage
- alert: HighMemoryUsage
expr: (container_memory_usage_bytes / container_spec_memory_limit_bytes) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Alto uso de memória em {{ $labels.pod }}"
description: "O uso de memória está acima de 90% no pod {{ $labels.pod }}"
Configuração do Alertmanager
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: monitoring
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'critical-alerts'
- match:
severity: warning
receiver: 'warning-alerts'
receivers:
- name: 'default'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alertmanager@example.com'
auth_password: 'password'
- name: 'critical-alerts'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
channel: '#alerts-critical'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
- name: 'warning-alerts'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
Notificações
Email
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'user'
auth_password: 'password'
headers:
Subject: 'Alerta: {{ .GroupLabels.alertname }}'
Slack
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL'
channel: '#alerts'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
PagerDuty
receivers:
- name: 'pagerduty'
pagerduty_configs:
- service_key: 'YOUR_SERVICE_KEY'
description: '{{ .GroupLabels.alertname }}'
Grouping e Routing
Grouping
Alertas similares são agrupados juntos:
route:
group_by: ['alertname', 'cluster']
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
Routing
Roteia os alertas de acordo com os labels:
route:
routes:
- match:
severity: critical
receiver: 'critical-team'
- match:
severity: warning
receiver: 'warning-team'
Silence e Inhibition
Silence
Remover alertas temporariamente:
# Via interface do Alertmanager
# Ou via amtool
amtool silence add alertname=HighCPUUsage --duration=1h
Inhibition
Remover alertas menos importantes quando um alerta crítico está ativo:
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
Boas Práticas
1. Regras Apropriadas
Crie regras para problemas reais e acionáveis.
2. Limiares Realistas
Defina limiares que disparem alertas significativos.
3. Grouping
Agrupe alertas para evitar spam.
4. Escalonamento
Configure o escalonamento para alertas críticos.
5. Documentação
Documente cada regra de alerta.
Resumo
Neste capítulo, você aprendeu:
Alerting: Sistema de notificação para problemas
PrometheusRule: Define as regras de alerta
Alertmanager: Gerencia o roteamento e as notificações
Notificações: Email, Slack, PagerDuty
Grouping: Agrupa alertas similares
Routing: Roteia de acordo com os labels
Silence/Inhibition: Gerencia alertas temporariamente
Boas práticas: Regras apropriadas, limiares realistas, grouping
Próximos Passos
Módulo 12: Deploy em Produção
Lab 11.4: Alerting e Notificações
Capítulo criado em: Dezembro de 2024