Lorenzo GM

Reflexiones sobre desarrollo web, ingeniería de software y prácticas tecnológicas modernas

Inglés|Español
Lorenzo GM

Creación de Dashboards de Monitorización en Azure con MCP y Terraform

Aprende a crear dashboards de monitorización completos en Azure usando Infraestructura como Código con Terraform, potenciados por el Model Context Protocol (MCP) para acceso en tiempo real a la documentación del proveedor de Azure.

Creación de Dashboards de Monitorización en Azure con MCP y Terraform

Creación de Dashboards de Monitorización en Azure con MCP y Terraform

Resumen

Esta guía demuestra cómo crear dashboards de monitorización completos en Azure usando Infraestructura como Código (IaC) con Terraform, potenciados por el Model Context Protocol (MCP) para la documentación del proveedor de Azure. Recorreremos la construcción de una solución completa de monitorización de Container Apps con dashboards, alertas e integración con Log Analytics.

Tabla de Contenidos

  1. Requisitos Previos
  2. Visión General de la Arquitectura
  3. Configuración de MCP para Azure
  4. Configuración del Dashboard con Terraform
  5. Diseño de la Plantilla del Dashboard
  6. Componentes de Monitorización
  7. Proceso de Despliegue
  8. Mejores Prácticas
  9. Resolución de Problemas

Requisitos Previos

  • Suscripción de Azure con los permisos apropiados
  • Terraform >= 1.4.0
  • Azure CLI configurado
  • VS Code con soporte para MCP
  • Conocimiento de Azure Container Apps, Log Analytics y Azure Monitor

Visión General de la Arquitectura

Nuestra infraestructura de monitorización consiste en:

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Container App │────│  Log Analytics   │────│ Azure Monitor   │
│                 │    │   Workspace      │    │    Alertas      │
└─────────────────┘    └──────────────────┘    └─────────────────┘
         │                        │                       │
         └────────────────────────┼───────────────────────┘
                                  │
                         ┌─────────────────┐
                         │ Azure Portal    │
                         │   Dashboard     │
                         └─────────────────┘

Configuración de MCP para Azure

1. Configurar el Acceso a la Documentación del Proveedor de Azure

El Model Context Protocol (MCP) proporciona acceso en tiempo real a la documentación del proveedor de Azure, asegurando que usemos la sintaxis más reciente y las mejores prácticas.

// Ejemplo de configuración MCP para el proveedor Azure de Terraform
const azureProviderMCP = {
  provider: "hashicorp/azurerm",
  version: "~> 4.0",
  namespace: "hashicorp",
  capabilities: ["resources", "data-sources", "guides"]
};

2. Beneficios Clave de MCP

  • Documentación en Tiempo Real: Acceso a la sintaxis más reciente del proveedor de Azure
  • Descubrimiento de Recursos: Encontrar métricas y propiedades disponibles
  • Compatibilidad de Versiones: Asegurar versiones correctas del proveedor
  • Mejores Prácticas: Obtener recomendaciones para la configuración de recursos

Configuración del Dashboard con Terraform

1. Configuración del Proveedor

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

provider "azurerm" {
  features {}
}

2. Recurso Principal del Dashboard

resource "azurerm_portal_dashboard" "container_app_monitoring" {
  name                = local.dashboard_name
  resource_group_name = local.resource_group_name
  location            = data.terraform_remote_state.base.outputs.location
  
  tags = merge(local.tags, {
    "hidden-title" = "Container App Monitoring - ${title(var.ENVIRONMENT)}"
    "monitoring"   = "enabled"
  })

  dashboard_properties = templatefile("${path.module}/dashboard.tpl", {
    container_app_id             = azurerm_container_app.main.id
    container_app_name           = azurerm_container_app.main.name
    log_analytics_workspace_id   = local.log_analytics_workspace_id
  })
}

3. Configuración de Variables

variable "enable_monitoring_alerts" {
  description = "Habilitar alertas de monitorización para la container app"
  type        = bool
  default     = true
}

variable "cpu_threshold_nanocores" {
  description = "Umbral de CPU en nanocores para alertas"
  type        = number
  default     = 500000000  # 50% de 1 vCPU
}

variable "memory_threshold_bytes" {
  description = "Umbral de memoria en bytes para alertas"
  type        = number
  default     = 536870912  # 512MB
}

Diseño de la Plantilla del Dashboard

1. Estructura de la Plantilla

Crear un archivo separado dashboard.tpl para facilitar el mantenimiento:

{
  "lenses": {
    "0": {
      "order": 0,
      "parts": {
        "0": {
          "position": {
            "x": 0, "y": 0,
            "rowSpan": 4, "colSpan": 12
          },
          "metadata": {
            "type": "Extension/HubsExtension/PartType/MarkdownPart",
            "settings": {
              "content": {
                "settings": {
                  "content": "# 📊 Dashboard de Monitorización de Container App\n\n**Container App**: ${container_app_name}",
                  "title": "Monitorización de Container App"
                }
              }
            }
          }
        }
      }
    }
  }
}

2. Estrategia de Disposición

Nuestro dashboard usa una disposición estructurada:

  1. Panel de Cabecera (rowSpan: 4) - Vista general y enlaces de navegación
  2. Métricas de Errores (ancho completo) - Monitorización prioritaria
  3. Métricas de Rendimiento (cuadrícula 2x2) - CPU, Memoria, Solicitudes, Réplicas

3. Integración de Navegación

**Funcionalidades de Monitorización:**
- ❌ **Métricas de Errores** → 🔍 **[Ver Logs de Errores](https://portal.azure.com/#@${log_analytics_workspace_id}/blade/Microsoft_Azure_Monitoring_Logs/LogsBlade)**
- 📈 **Uso de CPU** - Métricas de rendimiento del procesador en tiempo real
- 💾 **Uso de Memoria** - Monitorización del consumo de RAM
- 🌐 **Tasa de Solicitudes** - Patrones de tráfico
- 🔄 **Conteo de Réplicas** - Comportamiento de auto-escalado
- ⚠️ **Alertas Automatizadas** → 🚨 **[Ver Alertas](https://portal.azure.com/#blade/Microsoft_Azure_Monitoring/AzureMonitoringBrowseBlade/~/alerts)**

Componentes de Monitorización

1. Alertas de Métricas

resource "azurerm_monitor_metric_alert" "cpu_usage" {
  count               = var.enable_monitoring_alerts ? 1 : 0
  name                = "${azurerm_container_app.main.name}-cpu-usage-alert"
  resource_group_name = local.resource_group_name
  scopes              = [azurerm_container_app.main.id]
  description         = "Alerta cuando el uso de CPU es alto"
  severity            = 2
  frequency           = "PT5M"
  window_size         = "PT5M"
  enabled             = true
  auto_mitigate       = true

  criteria {
    metric_namespace = "Microsoft.App/containerApps"
    metric_name      = "UsageNanoCores"
    aggregation      = "Average"
    operator         = "GreaterThan"
    threshold        = var.cpu_threshold_nanocores
  }
}

2. Alertas Basadas en Logs

resource "azurerm_monitor_scheduled_query_rules_alert_v2" "application_errors" {
  count               = var.enable_monitoring_alerts ? 1 : 0
  name                = "${azurerm_container_app.main.name}-application-errors"
  resource_group_name = local.resource_group_name
  location            = data.terraform_remote_state.base.outputs.location

  evaluation_frequency = "PT5M"
  window_duration      = "PT10M"
  scopes               = [local.log_analytics_workspace_id]
  severity             = 1
  enabled              = true
  auto_mitigation_enabled = true

  criteria {
    query = <<-QUERY
      ContainerAppConsoleLogs_CL
      | where ContainerAppName_s == "${azurerm_container_app.main.name}"
      | where TimeGenerated > ago(10m)
      | where Log_s contains "ERROR" or Log_s contains "Exception"
      | summarize count()
    QUERY
    time_aggregation_method = "Count"
    threshold               = var.error_log_threshold
    operator                = "GreaterThan"
  }
}

3. Configuración de Diagnósticos

resource "azurerm_monitor_diagnostic_setting" "container_app" {
  name                       = "${azurerm_container_app.main.name}-diagnostics"
  target_resource_id         = azurerm_container_app.main.id
  log_analytics_workspace_id = local.log_analytics_workspace_id

  enabled_metric {
    category = "AllMetrics"
  }
}

Proceso de Despliegue

1. Configuración del Entorno

Crear configuración específica por entorno en env.development.json:

{
  "enable_monitoring_alerts": true,
  "cpu_threshold_nanocores": 500000000,
  "memory_threshold_bytes": 536870912,
  "request_rate_threshold": 5000,
  "error_log_threshold": 1
}

2. Comandos de Despliegue

# Inicializar Terraform
terraform init

# Planificar el despliegue
terraform plan -var-file=env.development.json

# Aplicar los cambios
terraform apply -var-file=env.development.json

3. Verificación

Después del despliegue, verificar:

  • El dashboard aparece en el Portal de Azure
  • Todos los paneles muestran datos correctamente
  • Los enlaces de navegación funcionan correctamente
  • Las alertas están configuradas y activas

Artículos relacionados