1. Observabilidad y Telemetría
Capacidad de entender el estado interno de un sistema mediante sus outputs: logs, métricas y traces.
1.1 🎯 Los Tres Pilares
Qué: Logging, Metrics, Tracing - información complementaria para diagnosticar sistemas.
Por qué: En producción, no puedes hacer debugging con breakpoints. La observabilidad es tu única ventana.
Quién: Developers, SREs, DevOps, Support.
Costo: 5-10% overhead en performance, invaluable para incident response.
1.2 📝 Logging (Registros)
Qué: Eventos discretos con timestamp, nivel y contexto.
| Aspecto | Qué | Por qué | Cómo | Herramientas |
|---|---|---|---|---|
| Structured Logs | JSON con campos consistentes | Queryable, parseable | {"timestamp": "...", "level": "error", "trace_id": "..."} |
Winston, Loguru, Log4j2 |
| Niveles | DEBUG, INFO, WARN, ERROR, FATAL | Filtrar por severidad | INFO en prod, DEBUG en dev | Configuración por entorno |
| Correlation IDs | trace_id único por request |
Rastrear request completo | Generar UUID en gateway, propagar headers | X-Trace-Id, OpenTelemetry |
| Contexto | user_id, endpoint, duration |
Debugging efectivo | Incluir metadatos relevantes | MDC (Mapped Diagnostic Context) |
| Rotación | Archivar logs antiguos | No llenar disco | Rotar diario, retener 30 días | Logrotate, S3 lifecycle |
| Agregación | Centralizar logs de múltiples fuentes | Vista unificada | Enviar a Elasticsearch/Loki | Fluentd, Filebeat |
Stack ELK:
- Elasticsearch: Storage + search
- Logstash: Procesamiento
- Kibana: Visualización
Alternativas:
- Loki + Grafana (más liviano)
- Splunk (enterprise)
- Datadog Logs
1.3 📊 Metrics (Métricas)
Qué: Valores numéricos agregados en el tiempo.
| Framework | Qué | Cuándo | Ejemplo |
|---|---|---|---|
| RED | Rate, Errors, Duration | User-facing services | requests/sec, error rate %, p95 latency |
| USE | Utilization, Saturation, Errors | Resources (CPU, disk) | CPU %, queue depth, disk errors |
| Golden Signals | Latency, Traffic, Errors, Saturation | Google SRE approach | p99 latency, QPS, 5xx rate, memory % |
1.3.1 Tipos de Métricas
| Tipo | Qué | Cuándo | Ejemplo |
|---|---|---|---|
| Counter | Solo aumenta (nunca decrece) | Total requests, errores | http_requests_total |
| Gauge | Valor que sube y baja | Memoria, CPU, connections activas | active_connections |
| Histogram | Distribución de valores | Latencias, tamaños de response | http_request_duration_seconds |
| Summary | Percentiles precalculados | Latencias (client-side) | p50, p95, p99 |
1.3.2 Herramientas de Métricas
| Tool | Qué | Por qué | Cómo |
|---|---|---|---|
| Prometheus | Time-series DB con pull model | Estándar de facto, PromQL potente | Exponer /metrics, Prometheus scrapes cada 15s |
| Grafana | Dashboards para múltiples fuentes | Visualización flexible | Datasource → Query → Panel |
| StatsD | Aggregation daemon con push model | Fácil instrumentar | Cliente envía UDP, StatsD agrega |
| Micrometer | Facade para métricas (Java) | Vendor-neutral | Exportar a Prometheus, Datadog, etc. |
1.4 🔍 Tracing (Trazas Distribuidas)
Qué: Seguir una request a través de múltiples servicios.
Por qué: En microservicios, una operación toca N servicios. Tracing muestra el path completo.
| Componente | Qué | Cómo | Herramientas |
|---|---|---|---|
| Trace | Request completo (raíz a hojas) | ID único propagado por headers | X-B3-TraceId |
| Span | Operación individual dentro de trace | Parent-child relationships | POST /users (50ms) → INSERT INTO users (30ms) |
| Context Propagation | Pasar trace_id entre servicios | Headers HTTP, gRPC metadata | OpenTelemetry |
| Sampling | Solo trazar % de requests | Reducir overhead | 1% en prod (high traffic), 100% en staging |
1.4.1 Herramientas de Tracing
| Tool | Qué | Por qué | Cuándo |
|---|---|---|---|
| Jaeger | Tracing distribuido (Uber) | Open source, escalable | Microservicios con alta complejidad |
| Zipkin | Tracing distribuido (Twitter) | Maduro, ampliamente adoptado | Alternativa a Jaeger |
| OpenTelemetry | Estándar unificado (logs+metrics+traces) | Vendor-neutral, CNCF | Reemplazo de OpenTracing+OpenCensus |
| AWS X-Ray | Tracing para servicios AWS | Integración nativa | Apps en AWS |
1.5 🏥 Health Checks
Qué: Endpoints para validar estado del servicio.
| Tipo | Qué | Cuándo | Endpoint | Valida |
|---|---|---|---|---|
| Liveness | ¿Está vivo el proceso? | K8s reinicia si falla | /live o /healthz |
Proceso responde |
| Readiness | ¿Listo para recibir tráfico? | K8s no envía tráfico si falla | /ready |
DB conectada, dependencias OK |
| Startup | ¿Terminó inicialización? | K8s espera antes de liveness | /startup |
Warmup completado |
Ejemplo:
GET /ready
{
"status": "healthy",
"checks": {
"database": "ok",
"redis": "ok",
"external_api": "degraded"
},
"uptime": "3d 14h 22m"
}
1.6 🚨 Alerting (Alertas)
Qué: Notificaciones automáticas ante problemas.
Por qué: Detectar y responder antes que usuarios reporten.
| Concepto | Qué | Cómo |
|---|---|---|
| Threshold | Valor que dispara alerta | error_rate > 5% |
| Window | Periodo de evaluación | Últimos 5 minutos |
| Severity | Nivel de urgencia | Critical → page, Warning → ticket |
| Runbook | Guía paso a paso para resolver | Link en alerta |
| On-call Rotation | Quién responde | PagerDuty, Opsgenie |
1.6.1 Herramientas de Alerting
| Tool | Qué | Cuándo |
|---|---|---|
| Alertmanager | Alertas de Prometheus | Stack Prometheus |
| PagerDuty | Incident management | Equipos on-call |
| Opsgenie | Alertas + escalations | Alternativa PagerDuty |
Ejemplo Prometheus Alert:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate on {{ $labels.instance }}"
description: "Error rate is {{ $value | humanizePercentage }}"
1.7 📈 APM (Application Performance Monitoring)
Qué: Monitoreo end-to-end de aplicaciones con profiling automático.
Por qué: Detecta N+1 queries, memory leaks, slow transactions sin instrumentación manual.
| Tool | Qué | Cuándo |
|---|---|---|
| New Relic | APM full-stack | Enterprise, soporte 24/7 |
| Datadog APM | APM + Infra + Logs | Unified platform |
| Elastic APM | APM integrado con ELK | Ya usas Elasticsearch |
| Dynatrace | AI-powered APM | Apps complejas, auto-discovery |
1.8 🎯 SLIs, SLOs, SLAs
| Concepto | Qué | Ejemplo |
|---|---|---|
| SLI (Service Level Indicator) | Métrica que mide servicio | Latencia p95, error rate |
| SLO (Service Level Objective) | Target interno | p95 < 300ms en 99.9% requests |
| SLA (Service Level Agreement) | Contrato con usuario | 99.9% uptime, créditos si incumple |
| Error Budget | Cuánto downtime tolerable | 0.1% = 43 min/mes |
Fórmula Error Budget:
Error Budget = 100% - SLO
Si SLO = 99.9%, Error Budget = 0.1% = 43.2 min/mes
Uso: Si error budget consumido → pausar features, priorizar estabilidad.
1.9 📊 Dashboards
Qué incluir:
1.9.1 Dashboard de Servicio
- Request rate (QPS)
- Error rate (%)
- Latencia (p50, p95, p99)
- Availability (uptime %)
- Active users
1.9.2 Dashboard de Infraestructura
- CPU, Memory, Disk por nodo
- Network traffic
- Pod/container count
- Database connections
1.9.3 Dashboard de Negocio
- Conversiones
- Revenue
- Active subscriptions
Herramientas: Grafana, Kibana, Datadog
1.10 🚫 Anti-patrones
| Anti-patrón | Problema | Solución |
|---|---|---|
| Log everything | Ruido, costo storage | Log lo relevante, sampling en high cardinality |
| No correlation IDs | Impossible rastrear request | Siempre trace_id + user_id |
| Alertas no accionables | Alert fatigue | Alerta solo si requiere acción humana |
| Dashboards vanidosos | Métricas que nadie usa | Medir SLIs reales, no proxies |
| Sin runbooks | Alerta sin guía de resolución | Todo alerta → runbook |