Saltar al contenido principal

Conceptos de Observabilidad en AWS

Los 3 Pilares de la Observabilidad​

┌─────────────────────────────────────────────────────────────┐
│ LOS 3 PILARES │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ MÉTRICAS LOGS TRACES │ │
│ │ ───────── ──── ────── │ │
│ │ │ │
│ │ ¿Qué? ¿Por qué? ¿Cómo? │ │
│ │ │ │
│ │ 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, responden a: │
│ • ¿Qué está pasando? (Métricas) │
│ • ¿Por qué está pasando? (Logs) │
│ • ¿Dónde está pasando? (Traces) │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Metrics​

Métricas Nativas de EC2​

┌─────────────────────────────────────────────────────────────┐
│ MÉTRICAS NATIVAS DE EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ MÉTRICA DESCRIPCIÓN UNIDAD │
│ ──────── ─────────── ────── │
│ │
│ CPUUtilization Uso de CPU % │
│ NetworkIn Tráfico entrante Bytes │
│ NetworkOut Tráfico saliente Bytes │
│ DiskReadBytes Lectura disco Bytes │
│ DiskWriteBytes Escritura disco Bytes │
│ DiskReadOps Operaciones lectura Count │
│ DiskWriteOps Operaciones escritura Count │
│ StatusCheckFailed Falla health check Count │
│ │
│ ⚠️ ATENCIÓN: │
│ ¡La memoria (RAM) NO está incluida por defecto! │
│ → Requiere CloudWatch Agent │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Agent (Métricas Avanzadas)​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH AGENT │
├─────────────────────────────────────────────────────────────┤
│ │
│ El agente CloudWatch recopila métricas adicionales │
│ desde dentro de la instancia: │
│ │
│ MÉTRICAS ADICIONALES: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ • mem_used_percent : Uso de RAM (%) │ │
│ │ • disk_used_percent : Uso de disco (%) │ │
│ │ • processes_total : Número de procesos │ │
│ │ • cpu_usage_user : CPU usuario │ │
│ │ • cpu_usage_system : CPU sistema │ │
│ │ • netstat_tcp_established : Conexiones TCP │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ INSTALACIÓN: │
│ 1. Instalar el agente en la instancia │
│ 2. Configurar las métricas a recopilar │
│ 3. Adjuntar un rol IAM con los permisos │
│ │
│ # Instalación en 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 Alarmas​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH ALARMS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ESTADOS DE UNA ALARMA: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ OK → La métrica está dentro de los límites│ │
│ │ ALARM → La métrica superó el umbral │ │
│ │ INSUFFICIENT_DATA → No hay suficientes datos │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ COMPONENTES DE UNA ALARMA: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. Métrica : CPUUtilization │ │
│ │ 2. Estadística : Average │ │
│ │ 3. Período : 300 segundos (5 min) │ │
│ │ 4. Evaluación : 2 períodos │ │
│ │ 5. Umbral : > 80% │ │
│ │ 6. Acción : Notificar SNS │ │
│ │ │ │
│ │ Traducción: │ │
│ │ "Si CPU promedio > 80% durante 2 períodos de 5 min,│ │
│ │ entonces activar la alarma y notificar SNS" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Configuración CLI​

# Créer une alarme CPU haute
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 above 80% for 10 minutes"

# Créer une alarme mémoire (nécessite 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​

Estructura de los Logs​

┌─────────────────────────────────────────────────────────────┐
│ ESTRUCTURA CLOUDWATCH LOGS │
├─────────────────────────────────────────────────────────────┤
│ │
│ LOG GROUP (contenedor) │
│ └── /aws/ec2/my-app │
│ │ │
│ ├── LOG STREAM (flujo por fuente) │
│ │ └── 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 │
│ │
│ RETENCIÓN: │
│ • Configurable: 1 día a 10 años (o nunca) │
│ • Por defecto: nunca (¡cuidado con los costos!) │
│ │
└─────────────────────────────────────────────────────────────┘

Log Insights (Consultas)​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH LOG INSIGHTS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Lenguaje de consulta para analizar los logs: │
│ │
│ # Buscar errores │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | sort @timestamp desc │
│ | limit 100 │
│ │
│ # Contar errores por hora │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | stats count() by bin(1h) │
│ │
│ # Top 10 de IPs con errores │
│ fields @timestamp, @message │
│ | filter @message like /ERROR/ │
│ | parse @message /IP: (?<ip>\d+\.\d+\.\d+\.\d+)/ │
│ | stats count() by ip │
│ | sort count desc │
│ | limit 10 │
│ │
│ # Latencia P99 │
│ fields @timestamp, latency │
│ | stats percentile(latency, 99) as p99 │
│ │
└─────────────────────────────────────────────────────────────┘

CloudWatch Dashboards​

┌─────────────────────────────────────────────────────────────┐
│ CLOUDWATCH DASHBOARD │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PRODUCTION DASHBOARD 🔄 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ CPU Usage │ │ Memory Usage │ │ │
│ │ │ ████████░░ 80% │ │ ██████░░░░ 60% │ │ │
│ │ │ [graph] │ │ [graph] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ Request Count │ │ Error Rate │ │ │
│ │ │ 1,234 req/min │ │ 0.5% │ │ │
│ │ │ [graph] │ │ [graph] │ │ │
│ │ └─────────────────┘ └─────────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────┐ │ │
│ │ │ Latency P50/P95/P99 │ │ │
│ │ │ [line chart over time] │ │ │
│ │ └───────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ TIPOS DE WIDGETS: │
│ • Line : Tendencias en el tiempo │
│ • Stacked : Comparación de componentes │
│ • Number : Valor único (KPI) │
│ • Text : Documentación, enlaces │
│ • Alarm Status : Estado de las alarmas │
│ • Logs : Últimos eventos │
│ │
└─────────────────────────────────────────────────────────────┘

Runbook de Incidente​

┌─────────────────────────────────────────────────────────────┐
│ RUNBOOK TIPO │
├─────────────────────────────────────────────────────────────┤
│ │
│ INCIDENTE: CPU Alta (> 90%) │
│ ───────────────────────── │
│ │
│ 1. EVALUAR LA GRAVEDAD │
│ □ ¿Una instancia o varias? │
│ □ ¿Impacto visible para el usuario? │
│ □ ¿Errores en los logs? │
│ │
│ 2. DIAGNÓSTICO RÁPIDO │
│ □ top -c en la instancia │
│ □ Identificar el proceso consumidor │
│ □ Verificar los logs de la aplicación │
│ │
│ 3. ACCIONES INMEDIATAS │
│ □ Si la carga es legítima → Scale out (agregar instancias) │
│ □ Si proceso descontrolado → Reiniciar el servicio │
│ □ Si ataque → Bloquear la IP fuente │
│ │
│ 4. RESOLUCIÓN │
│ □ ¿CPU volvió a < 70%? │
│ □ ¿Servicio funcional? │
│ □ ¿Usuarios afectados informados? │
│ │
│ 5. POST-MORTEM │
│ □ Documentar la causa │
│ □ Acciones preventivas │
│ □ Mejorar las alertas │
│ │
└─────────────────────────────────────────────────────────────┘

Resumen​

ServicioUsoDatos
MetricsMonitoreo en tiempo realCPU, RAM, Network
AlarmsAlertas automáticasUmbrales superados
LogsDepuración, auditoríaTexto de aplicación
DashboardsVisualizaciónGráficos, KPIs
Log InsightsAnálisisConsultas sobre logs

Próxima sección : Lab Monitoring