Monitoramento do DR no Azure com Azure Monitor

Monitoramento do DR no Azure com Azure Monitor

Monitoramento do DR no Azure com Azure Monitor

Monitoramento do DR no Azure com Azure Monitor

Este é o artigo final da série: o monitoramento do DR no Azure — a camada de observabilidade que garante que você saiba o estado do seu ambiente de Disaster Recovery a qualquer momento, não apenas durante os drills. O artigo configura Log Analytics Workspaces em ambas as regiões, dois Action Groups (crítico e aviso), três alertas essenciais baseados em KQL cobrindo ASR, Storage geo-replicado e AKS, e dois Workbooks consolidando visibilidade multi-região em um painel único. Ao final, você tem um dashboard operacional que dispara alertas automaticamente quando a saúde da replicação cai ou o lag de storage excede o RPO definido.

Série: DR Azure e Landing Zone
  • 📖 Art. 01: Planejamento de DR Azure e Landing Zone
  • 📖 Art. 02: Hub-Spoke Landing Zone com Terraform
  • 📖 Art. 03: Azure Firewall e NSGs na Landing Zone
  • 📖 Art. 04: Azure Bastion na Landing Zone sem IP Público
  • 📖 Art. 05: Azure Front Door e Traffic Manager para Failover
  • 📖 Art. 06: DNS Privado Multi-Região no Azure
  • 📖 Art. 07: Azure Site Recovery para VMs Multi-Região
  • 📖 Art. 08: Azure Storage com Geo-Replicação para DR
  • 📖 Art. 09: AKS Multi-Região com Failover no Azure
  • 📖 Art. 10: Velero no AKS para Backup e Restore Cross-Region
  • 📖 Art. 11: Runbooks de Failover no Azure Automation
  • 📖 Art. 12: Simular um DR no Azure sem Impacto em Produção
  • ⚙️ Art. 13 (este): Monitoramento do DR no Azure com Azure Monitor

Sumário

Arquitetura de monitoramento

A estratégia de monitoramento do DR no Azure usa dois Log Analytics Workspaces — um por região — para evitar que a indisponibilidade da região primária também derrube o sistema de monitoramento. Os alertas são definidos com escopo nos workspaces de ambas as regiões, e os Action Groups ficam centralizados no Resource Group de network de Brazil South:

Componente Recurso Resource Group
Log Analytics BRS law-blog-castilho-brazilsouth rg-blog-castilho-network-brazilsouth
Log Analytics EUS law-blog-castilho-eastus rg-blog-castilho-network-eastus
Action Group Crítico ag-critico-blog-castilho rg-blog-castilho-network-brazilsouth
Action Group Aviso ag-aviso-blog-castilho rg-blog-castilho-network-brazilsouth
Alerta ASR replicação asr-replication-unhealthy Severity 0 — avalia a cada 5 min
Alerta Storage lag storage-replication-lag-5min Severity 0 — avalia a cada 5 min
Alerta AKS nodes aks-node-not-ready Severity 1 — avalia a cada 2 min
Workbooks dr-overview, replication-health rg-blog-castilho-network-brazilsouth

Pré-requisitos

  • Resource Groups rg-blog-castilho-network-brazilsouth e rg-blog-castilho-network-eastus existentes (Art. 02)
  • Azure CLI autenticado com permissões de Contributor
  • Terraform ≥ 1.5 com backend Azure Storage configurado
  • Endereço de email para receber alertas
Segurança: Os comandos deste artigo utilizam variáveis de ambiente para credenciais. Nunca insira IDs de subscription, senhas ou chaves diretamente nos comandos. Use um arquivo .env local (não versionado) ou o Azure Key Vault para armazenar segredos.

Passo 1 — Log Analytics Workspaces

O primeiro componente do monitoramento do DR no Azure são os Log Analytics Workspaces. O Terraform em scripts/art-13-monitoramento/law-blog-castilho-brazilsouth/ cria o workspace de Brazil South com SKU PerGB2018 e retenção configurável via variável. O workspace de East US é idêntico, apontando para o Resource Group de network-eastus:

<code">resource "azurerm_log_analytics_workspace" "this" {
  name                = "law-blog-castilho-brazilsouth"
  resource_group_name = data.azurerm_resource_group.this.name
  location            = data.azurerm_resource_group.this.location
  sku                 = "PerGB2018"
  retention_in_days   = var.retention_days  # default: 30
  tags                = var.tags
}

Para aplicar os dois workspaces:

<code">SUBSCRIPTION_ID=""

# Brazil South
cd scripts/art-13-monitoramento/law-blog-castilho-brazilsouth
terraform init -backend-config=backend.hcl
terraform apply -var="subscription_id=$SUBSCRIPTION_ID"

# East US
cd ../law-blog-castilho-eastus
terraform init -backend-config=backend.hcl
terraform apply -var="subscription_id=$SUBSCRIPTION_ID"

Após a criação, os recursos Azure precisam ser configurados para enviar diagnósticos para os workspaces. Para o RSV (Art. 07), habilite o envio de logs via portal: RSV → Configurações de diagnóstico → + Adicionar configuração de diagnóstico → selecionar AzureSiteRecovery → enviar para o workspace de East US. Para o AKS (Art. 09), o Container Insights pode ser habilitado via az aks enable-addons --addons monitoring --workspace-resource-id.

Passo 2 — Action Groups

O Terraform em scripts/art-13-monitoramento/alerts-blog-castilho/ cria dois Action Groups com diferentes níveis de urgência. O grupo ag-critico-blog-castilho notifica por email e opcionalmente por Teams webhook. O grupo ag-aviso-blog-castilho notifica apenas por email:

<code">resource "azurerm_monitor_action_group" "critico" {
  name                = "ag-critico-blog-castilho"
  resource_group_name = data.azurerm_resource_group.network_brs.name
  short_name          = "ag-critico"
  tags                = var.tags

  email_receiver {
    name                    = "time-ops"
    email_address           = var.alert_email
    use_common_alert_schema = true
  }

  dynamic "webhook_receiver" {
    for_each = var.teams_webhook_uri != "" ? [1] : []
    content {
      name                    = "teams"
      service_uri             = var.teams_webhook_uri
      use_common_alert_schema = true
    }
  }
}

resource "azurerm_monitor_action_group" "aviso" {
  name                = "ag-aviso-blog-castilho"
  resource_group_name = data.azurerm_resource_group.network_brs.name
  short_name          = "ag-aviso"
  tags                = var.tags

  email_receiver {
    name          = "time-ops"
    email_address = var.alert_email
    use_common_alert_schema = true
  }
}

O bloco dynamic "webhook_receiver" só cria o receiver do Teams se a variável teams_webhook_uri não estiver vazia — isso evita erro no apply quando o webhook ainda não foi configurado. Para conectar com o canal Teams da equipe, passe a URL do webhook do conector Incoming Webhook via variável de ambiente:

<code">terraform apply \
  -var="subscription_id=$SUBSCRIPTION_ID" \
  -var="alert_email=" \
  -var="teams_webhook_uri=$TEAMS_WEBHOOK_URI"

Passo 3 — Alertas críticos com KQL

Os alertas KQL são o núcleo do monitoramento do DR no Azure. O mesmo Terraform cria três alertas do tipo azurerm_monitor_scheduled_query_rules_alert_v2 — a versão mais recente das Scheduled Query Rules que suporta avaliação de múltiplos períodos e dimensões. Cada alerta usa uma query KQL diferente:

Alerta 1 — ASR Replication Unhealthy (Severity 0 — Crítico)

Avaliado a cada 5 minutos com janela de 15 minutos no workspace de East US. Dispara quando qualquer VM tem ReplicationHealthStatus diferente de Normal:

<code">AzureDiagnostics
| where Category == "AzureSiteRecoveryReplicationStats"
| where ReplicationHealthStatus_s != "Normal"
| summarize count() by Resource

Alerta 2 — Storage Replication Lag > 5min (Severity 0 — Crítico)

Avaliado a cada 5 minutos com janela de 10 minutos no workspace de Brazil South. Dispara quando o lag de geo-replicação da Storage Account excede 300 segundos (5 minutos = RPO objetivo):

<code">AzureMetrics
| where MetricName == "GeoReplicationLag"
| where Average > 300

Alerta 3 — AKS Node Not Ready (Severity 1 — Alto)

Avaliado a cada 2 minutos com janela de 5 minutos. Dispara se qualquer nó do AKS entrar em estado NotReady por dois períodos consecutivos — evitando falsos positivos de reinicializações normais:

<code">KubeNodeInventory
| where Status == "NotReady"
| summarize count() by Computer

O critério de minimum_failing_periods_to_trigger_alert = 1 nos alertas de ASR e Storage significa que uma única avaliação com resultado positivo já dispara o alerta — é o comportamento correto para situações de DR onde cada minuto conta. Para o AKS, o valor é 2 (dois períodos consecutivos) para evitar alertas de nós que reiniciam brevemente durante atualizações do node pool.

Passo 4 — Workbooks de DR

Os Workbooks consolidam o monitoramento do DR no Azure em dashboards interativos que combinam queries KQL, métricas e texto em um único painel. A pasta scripts/art-13-monitoramento/workbooks/ contém dois arquivos JSON que podem ser importados diretamente no portal:

Workbook Conteúdo
dr-overview.json Visão consolidada do DR: estado de replicação ASR, lag do Storage, nós do AKS por região, últimos alertas disparados
replication-health.json Detalhamento da saúde de replicação: histórico de ReplicationHealthStatus por VM, recovery points disponíveis, tempo desde o último sync

Para importar um Workbook no portal Azure:

<code"># Via CLI — criar workbook a partir do JSON
WORKBOOK_CONTENT=$(cat scripts/art-13-monitoramento/workbooks/dr-overview.json)

az monitor app-insights workbook create \
  --resource-group rg-blog-castilho-network-brazilsouth \
  --name "DR Overview" \
  --category workbook \
  --serialized-data "$WORKBOOK_CONTENT" \
  --location brazilsouth

Alternativamente, importe diretamente no portal: Azure Monitor → Workbooks → + Novo → Editor avançado → colar o JSON → Aplicar → Salvar. O Workbook fica disponível no Resource Group especificado e pode ser fixado no Azure Dashboard para acesso rápido durante incidentes.

Passo 5 — Grafana (opcional)

A pasta scripts/art-13-monitoramento/grafana/ contém dashboards JSON e manifests Kubernetes para deploy do Grafana no AKS BRS com o plugin Azure Monitor como datasource. Um Service Principal dedicado (sp-grafana-blog-castilho) com o papel Monitoring Reader e Log Analytics Reader é criado para autenticar o Grafana na API do Azure Monitor — as credenciais ficam no Key Vault kv-blog-castilho criado no Art. 11.

# Criar o Service Principal e salvar as credenciais no Key Vault
az ad sp create-for-rbac \
  --name "sp-grafana-blog-castilho" \
  --role "Monitoring Reader" \
  --scopes "/subscriptions/$AZURE_SUBSCRIPTION_ID"

az role assignment create \
  --assignee "sp-grafana-blog-castilho" \
  --role "Log Analytics Reader" \
  --scope "/subscriptions/$AZURE_SUBSCRIPTION_ID"

# Salvar credenciais no Key Vault (nunca em arquivos versionados)
az keyvault secret set --vault-name kv-blog-castilho \
  --name "grafana-client-id" --value "<APP_ID_DO_SP>"
az keyvault secret set --vault-name kv-blog-castilho \
  --name "grafana-client-secret" --value "<PASSWORD_DO_SP>"

Com as credenciais no Key Vault, o script grafana/k8s/deploy-grafana.sh lê os segredos e aplica todos os manifests no namespace monitoring do AKS BRS — Namespace, Secret, ConfigMaps (datasource + dashboards), PVC (2Gi) e Deployment (1 réplica, grafana:11.1.0):

# Deploy do Grafana no AKS BRS (lê credenciais do Key Vault automaticamente)
bash scripts/art-13-monitoramento/grafana/k8s/deploy-grafana.sh

# Verificar pod e endpoint
kubectl get pods -n monitoring
kubectl get svc grafana -n monitoring

# Output esperado:
# NAME                       READY   STATUS    RESTARTS
# grafana-xxxxxxxxx-xxxxx    1/1     Running   0
#
# NAME      TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)
# grafana   LoadBalancer   172.16.x.x      <LB_IP>       80:xxxxx/TCP
#
# Acessar em http://<LB_IP>  (credenciais padrão: admin / admin)

O Grafana Managed do Azure (Preview) também pode ser usado — ele se integra nativamente com Log Analytics e Azure Monitor sem precisar configurar datasources manualmente. Para ambientes de produção com múltiplas equipes, o Azure Managed Grafana é preferível por ter RBAC integrado com o Azure AD.

Consultas KQL úteis para o DR

Além dos alertas automáticos, estas queries KQL complementam o monitoramento do DR no Azure para investigação manual durante e após um incidente:

Histórico de saúde de replicação das últimas 24h:

<code">AzureDiagnostics
| where Category == "AzureSiteRecoveryReplicationStats"
| where TimeGenerated > ago(24h)
| project TimeGenerated, Resource, ReplicationHealthStatus_s, RecoveryPointObjective_d
| order by TimeGenerated desc

Eventos de failover e recovery no ASR:

<code">AzureDiagnostics
| where Category == "AzureSiteRecoveryEvents"
| where EventName_s contains "Failover" or EventName_s contains "Recovery"
| project TimeGenerated, EventName_s, Description_s, VmName_s
| order by TimeGenerated desc
| take 20

Pods do AKS com restart excessivo (possível impacto no DR):

<code">KubePodInventory
| where TimeGenerated > ago(1h)
| where RestartCount > 3
| summarize MaxRestarts = max(RestartCount) by PodName, Namespace, Computer
| order by MaxRestarts desc

Lag de geo-replicação do Storage nas últimas 4h:

<code">AzureMetrics
| where MetricName == "GeoReplicationLag"
| where TimeGenerated > ago(4h)
| summarize AvgLagSeconds = avg(Average), MaxLagSeconds = max(Maximum) by bin(TimeGenerated, 5m), Resource
| order by TimeGenerated desc

Troubleshooting

Problema Causa Solução
Alerta ASR nunca dispara mesmo com replicação unhealthy O RSV não está enviando diagnósticos para o Log Analytics Verificar as Configurações de diagnóstico no RSV — a categoria AzureSiteRecoveryReplicationStats deve estar habilitada e apontando para o workspace de East US
Query KQL retorna zero resultados para KubeNodeInventory O Container Insights não foi habilitado no AKS Habilitar: az aks enable-addons --addons monitoring --resource-group rg-blog-castilho-workload-brazilsouth --name aks-blog-castilho-brazilsouth --workspace-resource-id <LAW_ID>
Email de alerta não chega Spam filter ou Action Group sem permissão para enviar Verificar caixa de spam. Confirmar o email no portal: Monitor → Action Groups → ag-critico → Email receivers → verificar endereço
Workbook sem dados após importação O datasource do Workbook aponta para o workspace errado Editar o Workbook: + Editar → selecionar o datasource correto no topo e atualizar o Resource Group e workspace nas queries
Alerta de Storage lag disparando constantemente Threshold de 300s muito baixo para a largura de banda disponível Aumentar o threshold para 600s (10 min) ou investigar throttling na Storage Account. O lag normal em RA-GZRS varia de segundos a poucos minutos dependendo do volume de escrita

Conclusão da série

Esta série de 13 artigos construiu um ambiente completo de Disaster Recovery no Azure do zero — desde o planejamento da Landing Zone Hub-Spoke até o monitoramento do DR no Azure com Azure Monitor. Cada artigo adicionou uma camada que depende das anteriores, resultando em um lab funcional com:

  • Rede multi-região: Hub-Spoke em Brazil South e East US com Firewall, NSGs, Bastion e DNS privado
  • Roteamento global: Front Door com WAF e Traffic Manager para failover automático de tráfego
  • Proteção de VMs: Azure Site Recovery com replicação contínua e RPO de 5 minutos
  • Dados resilientes: Storage Account RA-GZRS com Private Endpoints em ambas as regiões
  • Containers multi-região: AKS em Brazil South e East US com ACR geo-replicado e Velero para backup de namespaces
  • Automação de failover: Runbooks PowerShell no Azure Automation com webhook de acionamento
  • Validação periódica: Drills de DR com Test Failover sem impacto em produção e relatório de RTO/RPO
  • Observabilidade: Log Analytics, alertas KQL e Workbooks consolidados

O próximo passo natural é adaptar este lab ao seu ambiente real: substituir os recursos fictícios pelos nomes do seu ambiente, ajustar os objetivos de RTO e RPO, e integrar o webhook de failover com o seu sistema de on-call. O monitoramento do DR no Azure que você configurou aqui — com Log Analytics, alertas KQL e Workbooks — é o ponto de partida para a visibilidade operacional em produção. O código Terraform de todos os artigos está disponível na pasta scripts/ deste repositório.

Série: DR Azure e Landing Zone
  • 📖 Art. 01: Planejamento de DR Azure e Landing Zone
  • 📖 Art. 02: Hub-Spoke Landing Zone com Terraform
  • 📖 Art. 03: Azure Firewall e NSGs na Landing Zone
  • 📖 Art. 04: Azure Bastion na Landing Zone sem IP Público
  • 📖 Art. 05: Azure Front Door e Traffic Manager para Failover
  • 📖 Art. 06: DNS Privado Multi-Região no Azure
  • 📖 Art. 07: Azure Site Recovery para VMs Multi-Região
  • 📖 Art. 08: Azure Storage com Geo-Replicação para DR
  • 📖 Art. 09: AKS Multi-Região com Failover no Azure
  • 📖 Art. 10: Velero no AKS para Backup e Restore Cross-Region
  • 📖 Art. 11: Runbooks de Failover no Azure Automation
  • 📖 Art. 12: Simular um DR no Azure sem Impacto em Produção
  • ⚙️ Art. 13 (este): Monitoramento do DR no Azure com Azure Monitor

Interessado em saber mais sobre artigos relacionados ao Microsoft Azure CLIQUE AQUI

🚀 Vamos nos conectar?

Não perca nenhuma oportunidade! Cadastre-se nas minhas redes e no canal do YouTube para receber conteúdos de TI, Cloud, Azure, Kubernetes e DevOps em primeira mão.

Dica: No Facebook, todos os artigos do blog são publicados automaticamente. Vale a pena curtir!


💬 Dúvidas ou Problemas?

Com o intuito de ajudar a comunidade, caso você tenha dúvidas ou encontre problemas na execução dos comandos deste artigo, deixe um comentário abaixo. Responderei o mais breve possível!

Muito obrigado pela visita e até o próximo post!

Jefferson Castilho Especialista em Cloud & DevOps.

Este guia técnico é exclusivo do Blog do Castilho. Explore nossa para mais conteúdos sobre IA e Cloud.

 

Deixe uma resposta

Rolar para cima

Descubra mais sobre Blog do Castilho - Tecnologia | FinOps | DevOps | Cloud

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continue reading