Conceitos de Observabilidade AWS
Os 3 Pilares da Observabilidade
┌─────────────────────────────────────────────────────────────┐
│ OS 3 PILARES │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ MÉTRICAS LOGS TRACES │ │
│ │ ───────── ──── ────── │ │
│ │ │ │
│ │ O quê? Por quê? Como? │ │
│ │ │ │
│ │ CPU: 80% ERROR: Request A │ │
│ │ Requests: 1000 Connection → Service 1 │ │
│ │ Errors: 5% failed to DB → Service 2 │ │
│ │ → Database │ │
│ │ │ │
│ │ CloudWatch CloudWatch X-Ray │ │
│ │ Metrics Logs │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Juntos, eles respondem: │
│ • O que está acontecendo? (Métricas) │
│ • Por que está acontecendo? (Logs) │
│ • Onde está acontecendo? (Traces) │
│ │
└─────────────────────────────────────────────────────────────┘
CloudWatch Metrics
Métricas Nativas do EC2
┌─────────────────────────────────────────────────────────────┐
│ MÉTRICAS NATIVAS DO EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ MÉTRICA DESCRIÇÃO UNIDADE │
│ ──────── ─────────── ────── │
│ │
│ CPUUtilization Uso de CPU % │
│ NetworkIn Tráfego de entrada Bytes │
│ NetworkOut Tráfego de saída Bytes │
│ DiskReadBytes Leitura de disco Bytes │
│ DiskWriteBytes Escrita de disco Bytes │
│ DiskReadOps Ops de leitura Count │
│ DiskWriteOps Ops de escrita Count │
│ StatusCheckFailed Falha no health check Count │
│ │
│ ⚠️ ATENÇÃO: │
│ A memória (RAM) NÃO está incluída por padrão! │
│ → Requer CloudWatch Agent │
│ │
└─────────────────────────────────────────────────────────────┘
CloudWatch Agent (Métricas Avançadas)
┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH AGENT │
├─────────────────────────────────────────────────────────────┤
│ │
│ O CloudWatch Agent coleta métricas adicionais │
│ de dentro da instância: │
│ │
│ MÉTRICAS ADICIONAIS: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • mem_used_percent : Uso de RAM (%) │ │
│ │ • disk_used_percent : Uso de disco (%) │ │
│ │ • processes_total : Número de processos │ │
│ │ • cpu_usage_user : CPU usuário │ │
│ │ • cpu_usage_system : CPU sistema │ │
│ │ • netstat_tcp_established : Conexões TCP │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ INSTALAÇÃO: │
│ 1. Instalar o agente na instância │
│ 2. Configurar as métricas a serem coletadas │
│ 3. Anexar uma role IAM com as permissões │
│ │
│ # Instalação no Amazon Linux 2 │
│ sudo yum install amazon-cloudwatch-agent │
│ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon- │
│ cloudwatch-agent-config-wizard │
│ sudo systemctl start amazon-cloudwatch-agent │
│ │
└─────────────────────────────────────────────────────────────┘
CloudWatch Alarms
Tipos de Alarmes
┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH ALARMS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ESTADOS DE UM ALARME: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ OK → A métrica está dentro dos limites │ │
│ │ ALARM → A métrica ultrapassou o limite │ │
│ │ INSUFFICIENT_DATA → Dados insuficientes │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ COMPONENTES DE UM ALARME: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. Métrica: CPUUtilization │ │
│ │ 2. Estatística: Average │ │
│ │ 3. Período: 300 segundos (5 min) │ │
│ │ 4. Avaliação: 2 períodos │ │
│ │ 5. Limite: > 80% │ │
│ │ 6. Ação: Notificar SNS │ │
│ │ │ │
│ │ Tradução: │ │
│ │ "Se CPU média > 80% por 2 períodos de 5 min, │ │
│ │ então acionar o alarme e notificar SNS" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Configuração CLI
# Criar um alarme de CPU alta
aws cloudwatch put-metric-alarm \
--alarm-name cpu-high-alarm \
--metric-name CPUUtilization \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 80 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789:alerts \
--alarm-description "CPU acima de 80% por 10 minutos"
# Criar um alarme de memória (requer CloudWatch Agent)
aws cloudwatch put-metric-alarm \
--alarm-name mem-high-alarm \
--metric-name mem_used_percent \
--namespace CWAgent \
--statistic Average \
--period 300 \
--threshold 90 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-xxx \
--alarm-actions arn:aws:sns:us-east-1:123456789:alerts
CloudWatch Logs
Estrutura dos Logs
┌─────────────────────────────────────────────────────────────┐
│ ESTRUTURA CLOUDWATCH LOGS │
├─────────────────────────────────────────────────────────────┤
│ │
│ LOG GROUP (container) │
│ └── /aws/ec2/my-app │
│ │ │
│ ├── LOG STREAM (fluxo por fonte) │
│ │ └── i-xxx/application.log │
│ │ │ │
│ │ ├── LOG EVENT (entrada individual) │
│ │ │ └── 2024-01-15 10:30:00 INFO User login │
│ │ │ │
│ │ └── LOG EVENT │
│ │ └── 2024-01-15 10:30:01 ERROR DB timeout │
│ │ │
│ └── LOG STREAM │
│ └── i-yyy/application.log │
│ │
│ RETENÇÃO: │
│ • Configurável: 1 dia a 10 anos (ou nunca) │
│ • Padrão: nunca (atenção aos custos!) │
│ │
└─────────────────────────────────────────────────────────────┘
Log Insights (Consultas)
┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH LOG INSIGHTS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Linguagem de consulta para analisar os logs: │
│ │
│ # Buscar erros │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | sort @timestamp desc │
│ | limit 100 │
│ │
│ # Contar erros por hora │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | stats count() by bin(1h) │
│ │
│ # Top 10 IPs com erros │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | parse @message /IP: (?<ip>\d+\.\d+\.\d+\.\d+)/ │
│ | stats count() by ip │
│ | sort count desc │
│ | limit 10 │
│ │
│ # Latência P99 │
│ fields @timestamp, latency │
│ | stats percentile(latency, 99) as p99 │
│ │
└─────────────────────────────────────────────────────────────┘
CloudWatch Dashboards
┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH DASHBOARD │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ DASHBOARD DE PRODUÇÃO 🔄 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ CPU Usage │ │ Memory Usage │ │ │
│ │ │ ████████░░ 80% │ │ ██████░░░░ 60% │ │ │
│ │ │ [gráfico] │ │ [gráfico] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ Request Count │ │ Error Rate │ │ │
│ │ │ 1,234 req/min │ │ 0.5% │ │ │
│ │ │ [gráfico] │ │ [gráfico] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────┐ │ │
│ │ │ Latency P50/P95/P99 │ │ │
│ │ │ [linha do tempo] │ │ │
│ │ └───────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ TIPOS DE WIDGETS: │
│ • Line: Tendências ao longo do tempo │
│ • Stacked: Comparação de componentes │
│ • Number: Valor único (KPI) │
│ • Text: Documentação, links │
│ • Alarm Status: Estado dos alarmes │
│ • Logs: Últimos eventos │
│ │
└─────────────────────────────────────────────────────────────┘
Runbook de Incidente
┌─────────────────────────────────────────────────────────────┐
│ RUNBOOK TIPO │
├─────────────────────────────────────────────────────────────┤
│ │
│ INCIDENTE: CPU Alta (> 90%) │
│ ───────────────────────── │
│ │
│ 1. AVALIAR A GRAVIDADE │
│ □ Uma instância ou várias? │
│ □ Impacto visível para o usuário? │
│ □ Erros nos logs? │
│ │
│ 2. DIAGNÓSTICO RÁPIDO │
│ □ top -c na instância │
│ □ Identificar o processo consumidor │
│ □ Verificar os logs da aplicação │
│ │
│ 3. AÇÕES IMEDIATAS │
│ □ Se carga legítima → Scale out (adicionar instâncias) │
│ □ Se processo descontrolado → Reiniciar o serviço │
│ □ Se ataque → Bloquear o IP de origem │
│ │
│ 4. RESOLUÇÃO │
│ □ CPU voltou < 70%? │
│ □ Serviço funcional? │
│ □ Usuários impactados informados? │
│ │
│ 5. PÓS-MORTEM │
│ □ Documentar a causa │
│ □ Ações preventivas │
│ □ Melhorar os alertas │
│ │
└─────────────────────────────────────────────────────────────┘
Resumo
| Serviço | Uso | Dados |
|---|---|---|
| Metrics | Monitoramento em tempo real | CPU, RAM, Network |
| Alarms | Alertas automáticos | Limites excedidos |
| Logs | Debug, auditoria | Texto da aplicação |
| Dashboards | Visualização | Gráficos, KPIs |
| Log Insights | Análise | Consultas em logs |
Próxima seção: Lab Monitoring