Criar recursos de monitoramento usando o Bicep

O Azure tem um conjunto abrangente de ferramentas que podem monitorar seus aplicativos e serviços. Você pode criar de modo programático seus recursos de monitoramento usando o Bicep para automatizar a criação de regras, as configurações de diagnóstico e os alertas ao provisionar sua infraestrutura do Azure.

Colocar sua configuração de monitoramento em seu código Bicep pode parecer incomum, considerando que há ferramentas disponíveis dentro do portal do Azure para configurar regras de alerta, configurações de diagnóstico e painéis.

No entanto, alertas e configurações de diagnóstico são essencialmente iguais aos outros recursos de infraestrutura. Ao incluí-los em seu código Bicep, você pode implantar e testar seus recursos de alerta como faria para outros recursos do Azure.

Se você usar o Git ou outra ferramenta de controle de versão para gerenciar seus arquivos Bicep, você também se beneficiará de ter um histórico da configuração de monitoramento que permite ver como os alertas foram instalados e configurados.

Espaços de trabalho do Log Analytics e do Application Insights

Você pode criar espaços de trabalho do Log Analytics com o tipo de recurso Microsoft.OperationalInsights/workspaces dos espaços de trabalho do Application Insights com o tipo Microsoft.Insights/components. Ambos os componentes são implantados em grupos de recursos.

Configurações de Diagnóstico

As configurações de diagnóstico permitem que você configure o Azure Monitor para exportar seus logs e métricas para vários destinos, incluindo o Log Analytics e o Armazenamento do Azure.

Ao criar configurações de diagnóstico no Bicep, lembre-se de que esse recurso é um recurso de extensão, o que significa que ele é aplicado a outro recurso. Você pode criar configurações de diagnóstico no Bicep usando o tipo de recurso Microsoft.Insights/diagnosticSettings.

Ao criar configurações de diagnóstico no Bicep, você precisa aplicar o escopo da configuração de diagnóstico. A configuração de diagnóstico pode ser aplicada no nível de gerenciamento, assinatura ou grupo de recursos. Use a propriedade de escopo nesse recurso para definir o escopo desse recurso.

Considere o seguinte exemplo:

param location string = resourceGroup().location
param appPlanName string = '${uniqueString(resourceGroup().id)}asp'
param logAnalyticsWorkspace string = '${uniqueString(resourceGroup().id)}la'

var appPlanSkuName = 'S1'

resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2021-12-01-preview' existing = {
  name: logAnalyticsWorkspace
}

resource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {
  name: appPlanName
  location: location
  sku: {
    name: appPlanSkuName
    capacity: 1
  } 
}

resource diagnosticLogs 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: appServicePlan.name
  scope: appServicePlan
  properties: {
    workspaceId: logAnalytics.id
    logs: [
      {
        category: 'AllMetrics'
        enabled: true
        retentionPolicy: {
          days: 30
          enabled: true 
        }
      }
    ]
  }
}

No exemplo anterior, você cria uma configuração de diagnóstico para o Plano do Serviço de Aplicativo e envia esses diagnósticos para o Log Analytics. Você pode usar a propriedade scope para definir seu Plano do Serviço de Aplicativo como o escopo da configuração de diagnóstico e usar a propriedade workspaceId para definir o workspace do Log Analytics para o qual enviar os logs de diagnóstico. Você também pode exportar configurações de diagnóstico para Hubs de Eventos e Contas de Armazenamento do Azure.

Os tipos de log diferem entre os recursos, portanto, verifique se os logs que você deseja exportar são aplicáveis ao recurso que você está usando.

Configurações de diagnóstico do log de atividades

Para usar o Bicep para definir as configurações de diagnóstico para exportar o log de atividades do Azure, implante um recurso de configuração de diagnóstico no escopo da assinatura.

O exemplo a seguir mostra como exportar vários tipos de log de atividades para um workspace do Log Analytics:

targetScope = 'subscription'

param logAnalyticsWorkspaceId string

var activityLogDiagnosticSettingsName = 'export-activity-log'

resource subscriptionActivityLog 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: activityLogDiagnosticSettingsName
  properties: {
    workspaceId: logAnalyticsWorkspaceId
    logs: [
      {
        category: 'Administrative'
        enabled: true
      }
      {
        category: 'Security'
        enabled: true
      }
      {
        category: 'ServiceHealth'
        enabled: true
      }
      {
        category: 'Alert'
        enabled: true
      }
      {
        category: 'Recommendation'
        enabled: true
      }
      {
        category: 'Policy'
        enabled: true
      }
      {
        category: 'Autoscale'
        enabled: true
      }
      {
        category: 'ResourceHealth'
        enabled: true
      }
    ]
  }
}

Alertas

Os alertas notificam você proativamente quando os problemas são encontrados em sua infraestrutura e seus aplicativos do Azure monitorando dados no Azure Monitor. Ao definir sua configuração de monitoramento e alerta no código Bicep, você pode automatizar a criação desses alertas junto com a infraestrutura que você está provisionando no Azure.

Para mais informações sobre como os alertas funcionam no Azure, confira Visão geral dos alertas no Microsoft Azure.

As seções a seguir demonstram como você pode configurar diferentes tipos de alertas usando o código Bicep.

Grupos de ação

Para ser notificado quando os alertas forem disparados, você precisará criar um grupo de ações. Um grupo de ações é uma coleção de preferências de notificação definidas pelo proprietário de uma assinatura do Azure. Os grupos de ações são usados para notificar os usuários de que um alerta foi disparado ou para disparar respostas automatizadas aos alertas.

Para criar grupos de ações no Bicep, você pode usar o tipo Microsoft.Insights/actionGroups. Veja um exemplo:

param actionGroupName string = 'On-Call Team'
param location string = resourceGroup().location

var actionGroupEmail = 'oncallteam@contoso.com'

resource supportTeamActionGroup 'Microsoft.Insights/actionGroups@2023-01-01' = {
  name: actionGroupName
  location: location
  properties: {
    enabled: true
    groupShortName: actionGroupName
    emailReceivers: [
      {
        name: actionGroupName
        emailAddress: actionGroupEmail
        useCommonAlertSchema: true
      }
    ]
  }
}

O exemplo anterior cria um grupo de ações que envia alertas para um endereço de email, mas você também pode definir grupos de ações que enviam alertas para Hubs de Eventos, Azure Functions, Aplicativos Lógicos e muito mais.

Regras de processamento de alerta

As regras de processamento de alertas (anteriormente conhecidas como regras de ação) permitem aplicar o processamento em alertas que foram disparados. Você pode criar regras de processamento de alerta no Bicep usando o tipo Microsoft.AlertsManagement/actionRules.

Cada regra de processamento de alerta tem um escopo, que pode ser uma lista de um ou mais recursos específicos, um grupo de recursos específico ou toda a sua assinatura do Azure. Ao definir regras de processamento de alertas no Bicep, você define uma lista de IDs de recurso na propriedade escopo, que tem como destino esses recursos para a regra de processamento de alerta.

param alertRuleName string = 'AlertRuleName'
param actionGroupName string = 'On-Call Team'
param location string = resourceGroup().location

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource alertProcessingRule 'Microsoft.AlertsManagement/actionRules@2021-08-08' = {
  name: alertRuleName
  location: location
  properties: {
    actions: [
      {
        actionType: 'AddActionGroups'
        actionGroupIds: [
          actionGroup.id
        ]
      }
    ]
    conditions: [
      {
        field: 'MonitorService'
        operator: 'Equals'
        values: [
          'Azure Backup'
        ]
      }
    ]
    enabled: true
    scopes: [
      subscription().id
    ]
  }
}

No exemplo anterior, a regra de processamento de alerta MonitorService no Backup do Azure Vault é definida, que é aplicada ao grupo de ações existente. Essa regra dispara alertas para o grupo de ações.

Regras de alerta do log

Os alertas do log executam automaticamente uma consulta do Log Analytics. A consulta que é usada para avaliar os logs de recursos em um intervalo que você define, determina se os resultados atendem a alguns critérios especificados e, em seguida, dispara um alerta.

Você pode criar regras de alerta do log no Bicep usando o tipo Microsoft.Insights/scheduledQueryRules.

Regras de alerta de métrica

Alertas de métricas avisam quando uma de suas métricas ultrapassa um limite definido. Você pode definir uma regra de alerta da métrica no código Bicep usando o tipo Microsoft.Insights/metricAlerts.

Alertas do log de atividades

O log de atividades do Azure é um log de plataforma no Azure que fornece insights em eventos no nível da assinatura. Isso inclui informações como quando um recurso no Azure é modificado.

Alertas do log de atividades são alertas que são ativados quando ocorre um novo evento de log de atividades que corresponde às condições que são especificadas no alerta.

Você pode usar a propriedade scope dentro do tipo Microsoft.Insights/activityLogAlerts para criar alertas do log de atividades em um recurso específico ou uma lista de recursos usando as IDs de recurso como prefixo.

Você define suas condições de regra de alerta dentro da propriedade condition e configura o grupo de alertas para disparar esses alertas usando a matriz actionGroup. Aqui você pode passar um ou vários grupos de ações para enviar alertas do log de atividades, dependendo de seus requisitos.

param activityLogAlertName string = '${uniqueString(resourceGroup().id)}-alert'
param actionGroupName string = 'adminactiongroup'

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource activityLogAlert 'Microsoft.Insights/activityLogAlerts@2020-10-01' = {
  name: activityLogAlertName
  location: 'Global'
  properties: {
    condition: {
      allOf: [
        {
          field: 'category'
          equals: 'Administrative'
        }
        {
          field: 'operationName'
          equals: 'Microsoft.Resources/deployments/write'
        }
        {
          field: 'resourceType'
          equals: 'Microsoft.Resources/deployments'
        }
      ]
    }
    actions: {
      actionGroups: [
        {
          actionGroupId: actionGroup.id
        }
      ]
    }
    scopes: [
      subscription().id
    ]
  }
}

Alertas de integridade do recurso

O Azure Resource Health mantém você informado sobre o status de integridade atual e histórico de seus recursos do Azure. Ao criar alertas de integridade de recursos usando o Bicep, você pode criar e personalizar esses alertas em massa.

No Bicep, você pode criar alertas de integridade de recursos com o tipo Microsoft.Insights/activityLogAlerts.

Alertas de integridade de recursos podem ser configurados para monitorar eventos no nível de uma assinatura, grupo de recursos ou recurso individual.

Considere o exemplo a seguir, em que você cria um alerta de integridade do recurso que relata alertas de integridade do serviço. O alerta é aplicado no nível da assinatura (usando a propriedade scope) e envia alertas para um grupo de ações existente:

param activityLogAlertName string = uniqueString(resourceGroup().id)
param actionGroupName string = 'oncallactiongroup'

resource actionGroup 'Microsoft.Insights/actionGroups@2021-09-01' existing = {
  name: actionGroupName
}

resource resourceHealthAlert 'Microsoft.Insights/activityLogAlerts@2020-10-01' = {
  name: activityLogAlertName
  location: 'global'
  properties: {
    condition: {
      allOf: [
        {
          field: 'category'
          equals: 'ServiceHealth'
        }
      ]
    }
    scopes: [
      subscription().id
    ]
    actions: {
      actionGroups: [
        {
          actionGroupId: actionGroup.id
        }
      ]
    }
  }
}

Alertas de detecção inteligente

Alertas de detecção inteligente avisam sobre possíveis problemas de desempenho no seu aplicativo Web. Você pode criar alertas de detecção inteligente no Bicep usando o tipo Microsoft.AlertsManagement/smartDetectorAlertRules.

Painéis

No Bicep, você pode criar painéis do portal usando o tipo de recurso Microsoft.Portal/dashboards.

Para saber mais sobre a criação de painéis com código, consulte Criar programaticamente um painel do Azure.

Regras de dimensionamento automático

Para criar uma configuração de dimensionamento automático, defina essas regras usando o tipo de recurso Microsoft.Insights/autoscaleSettings.

Para direcionar o recurso ao qual você deseja aplicar a configuração de dimensionamento automático, você precisa fornecer o identificador de recurso de destino do recurso ao qual a configuração deve ser adicionada.

Neste exemplo, uma condição de escalar horizontalmente para o Plano do Serviço de Aplicativo com base na porcentagem média da CPU durante um período de 10 minutos. Se o Plano do Serviço de Aplicativo exceder 70% do consumo médio de CPU em 10 minutos, o mecanismo de dimensionamento automático dimensiona o plano adicionando uma instância.

param location string = resourceGroup().location
param appPlanName string = '${uniqueString(resourceGroup().id)}asp'

var appPlanSkuName = 'S1'

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appPlanName
  location: location
  properties: {}
  sku: {
    name: appPlanSkuName
    capacity: 1
  }
}

resource scaleOutRule 'Microsoft.Insights/autoscalesettings@2022-10-01' = {
  name: appServicePlan.name
  location: location
  properties: {
    enabled: true
    profiles: [
      {
        name: 'Scale out condition'
        capacity: {
          maximum: '3'
          default: '1'
          minimum: '1'
        }
        rules: [
          {
            scaleAction: {
              type: 'ChangeCount'
              direction: 'Increase'
              cooldown: 'PT5M'
              value: '1'
            }
            metricTrigger: {
              metricName: 'CpuPercentage'
              operator: 'GreaterThan'
              timeAggregation: 'Average'
              threshold: 70
              metricResourceUri: appServicePlan.id
              timeWindow: 'PT10M'
              timeGrain: 'PT1M'
              statistic: 'Average'
            }
          }
        ]
      }
    ]
    targetResourceUri: appServicePlan.id
  }
}

Observação

Ao definir regras de dimensionamento automático, considere as práticas recomendadas para evitar problemas ao tentar dimensionar automaticamente, como oscilação. Para obter mais informações, consulte a documentação a seguir sobre as práticas recomendadas para o dimensionamento automático.