Problema
En entornos híbridos (AWS, Azure y on‑prem) la observabilidad tiende a crecer de forma descoordinada. Cada equipo despliega su propio agente, define sus propias etiquetas y crea monitores aislados. Con el tiempo aparecen versiones de agentes desalineadas, configuraciones de logs duplicadas y una gran cantidad de dashboards que no siguen un estándar. El resultado es una base de código de observabilidad que se vuelve difícil de mantener, actualizar y auditar. Cuando se necesita añadir una nueva regla de alerta o actualizar la versión del SDK de APM, la intervención de varios equipos retrasa la entrega y genera errores de configuración.
Causa
- Ausencia de fuente única de verdad – No existe un repositorio central donde se definan versiones de agentes, tags o plantillas de monitores. Cada equipo copia y pega fragmentos en sus pipelines.
- Falta de automatización en el ciclo de vida – Las actualizaciones de agentes y librerías de APM se hacen manualmente o mediante scripts ad‑hoc, lo que genera versiones mixtas en producción.
- Políticas de tagging y monitorización implícitas – Sin una política clara, los nombres de tags varían (
env,environment,env_name) y los umbrales de alertas se calibran de forma subjetiva. - Dependencia de equipos propietarios – Los equipos de aplicación controlan su propia instrumentación, lo que dificulta la aplicación de cambios globales como la migración a una nueva versión de OpenTelemetry.
- Procesos de onboarding manuales – La incorporación de un nuevo microservicio requiere crear manualmente agentes, dashboards y alertas, lo que aumenta la carga operativa y la probabilidad de errores.
Solución
Una Observability Foundation basada en Terraform permite describir la infraestructura de observabilidad como código, aplicar versiones controladas y validar la consistencia en cada despliegue. La solución se divide en tres capas:
1. Módulos Terraform reutilizables
- datadog_agent: despliegue del agente con versión bloqueada, configuración de logs y variables de entorno comunes.
- standard_tags: mapa de tags obligatorios y opcionales que se inyecta a recursos mediante
for_each. - monitor_templates: plantillas de monitores parametrizables (latencia, error rate, CPU) que usan variables de entorno y etiquetas estándar.
- dashboard_factory: genera dashboards a partir de un JSON base y permite sobrescribir panels específicos por aplicación.
Los módulos se versionan en un repositorio Git y se publican como Terraform Registry interno. Cada equipo importa la versión que necesita y la CI valida que no haya drift antes de aplicar.
2. Pipeline de CI/CD con políticas de guardia
- Planificación automática:
terraform planse ejecuta en PR y se compara con el estado remoto. - Validación de tags: un script de lint verifica que todos los recursos incluyan
standard_tags. - Control de versiones de agentes: un job de GitHub Actions o GitLab CI revisa que la variable
agent_versioncoincida con la última versión aprobada en el repositorio de módulos. - Aprobación de cambios críticos: monitores de seguridad y alertas de alta prioridad requieren revisión de un Observability Review Board.
3. Gestión de APM / OpenTelemetry
- SDK BOM (Bill of Materials): se mantiene un archivo
apm_bom.yamlque lista la versión de cada SDK (Java, .NET, Node, Go). Los pipelines de compilación consumen este archivo y añaden la dependencia correspondiente. - Instrumentación automática: se usan wrappers de OpenTelemetry que detectan el runtime y aplican la configuración estándar (exporters, samplers).
- Upgrade orchestrado: cuando se aprueba una nueva versión del SDK, se actualiza el BOM, se dispara un pipeline que recompila los servicios y despliega la nueva imagen. El proceso es transparente para los equipos de aplicación porque la única diferencia es la versión del SDK.
Cuándo aplicar esta solución
- Entornos con múltiples nubes y on‑prem donde los equipos comparten una única plataforma de observabilidad.
- Más de 50 microservicios o instancias de infraestructura que generan métricas y logs de forma continua.
- Necesidad de cumplimiento (por ejemplo, auditorías de tags o de retención de logs).
- Situaciones donde el tiempo de respuesta a incidentes está limitado y la consistencia de alertas es crítica.
No es recomendable cuando:
- La organización tiene un único equipo responsable de toda la infraestructura y no hay necesidad de delegar.
- La plataforma de observabilidad es muy nueva y todavía se está evaluando entre varios proveedores; en ese caso, una capa de abstracción ligera (por ejemplo, solo OpenTelemetry Collector) puede ser suficiente.
Código
# Módulo datadog_agent (variables.tf)
variable "agent_version" {
type = string
default = "7.55.0"
}
variable "tags" {
type = map(string)
default = {
env = "prod"
team = "infra"
service = "unknown"
}
}
resource "aws_instance" "example" {
# ... instancia existente ...
user_data = <<-EOF
#!/bin/bash
DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=${var.datadog_api_key} \
DD_TAGS="${join(",", [for k, v in var.tags : "${k}:${v}"])}" \
DD_AGENT_VERSION=${var.agent_version} bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)"
EOF
}
# Linter de tags (tag_lint.sh)
#!/usr/bin/env bash
REQUIRED_TAGS=("env" "team" "service")
for TAG in "${REQUIRED_TAGS[@]}"; do
if ! grep -q "\"${TAG}\":" *.tf; then
echo "Missing required tag: ${TAG}"
exit 1
fi
done
exit 0
Verificación
- Ejecutar
terraform plany confirmar que no aparecen cambios inesperados en los agentes o tags. - En el pipeline, el job
tag_lintdebe pasar sin errores; de lo contrario, el PR se bloquea. - Verificar en Datadog que todos los hosts reportan la misma versión de agente (
agent.versionmetric). - Probar una alerta de prueba (por ejemplo, CPU > 90% durante 5 min) y confirmar que dispara el canal configurado.
- Revisar que los dashboards generados incluyan los filtros de
envyteampor defecto.
Notas adicionales
- Evitar hard‑coding de IDs: usa data sources de Terraform para obtener IDs de recursos (por ejemplo,
data.datadog_integration_aws). - Control de drift: habilita
terraform state replace-providercuando cambies de Datadog a otro proveedor; la capa de módulos mantiene la misma estructura de recursos, lo que reduce el esfuerzo de migración. - Separación de responsabilidades: la capa de foundation gestiona la infraestructura de observabilidad; los equipos de aplicación solo añaden sus métricas personalizadas mediante anotaciones o exportadores OpenTelemetry.
- Gestión de secretos: almacena la API key de Datadog en un vault (AWS Secrets Manager, Azure Key Vault) y pásala al módulo mediante
var.datadog_api_keyconsensitive = true. - Rollback rápido: si una actualización de agente causa problemas, basta con revertir la versión en el módulo y aplicar el plan; el cambio se propaga automáticamente a todas las instancias.
Con este enfoque, la observabilidad deja de ser una colección de scripts aislados y se convierte en una pieza versionada y auditada del ciclo de vida de la infraestructura. La consistencia de tags, la uniformidad de los monitores y la capacidad de actualizar agentes y SDKs con un solo commit son los principales beneficios que reducen la deuda técnica y facilitan una futura migración a otro proveedor sin tocar el código de aplicación.