Partilhar via


Criar recursos de monitoramento usando o Bicep

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

Trazer sua configuração de monitoramento para o código do 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, os alertas e as configurações de diagnóstico são essencialmente os mesmos que seus 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, também terá o benefício de ter um histórico de sua configuração de monitoramento para que você possa ver como os alertas foram configurados 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 e espaços de trabalho do Application Insights com o tipo Microsoft.Insights/components. Ambos os componentes são implantados em grupos de recursos.

Definiçõ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 scope neste recurso para definir o escopo para este 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 scope propriedade para definir seu plano do Serviço de Aplicativo como o escopo para sua configuração de diagnóstico e usar a workspaceId propriedade para definir o espaço de trabalho do Log Analytics para 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 recursos, portanto, certifique-se de que os logs que você deseja exportar sejam aplicáveis ao recurso que você está usando.

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

Para usar o Bicep para definir 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 espaço de trabalho 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 proativamente quando são encontrados problemas na sua infraestrutura e aplicações do Azure monitorizando dados no Azure Monitor. Ao configurar sua configuração de monitoramento e alerta em seu código Bicep, você pode automatizar a criação desses alertas junto com a infraestrutura que está provisionando no Azure.

Para obter mais informações sobre como os alertas funcionam no Azure, consulte 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ções

Para ser notificado quando os alertas forem acionados, você precisa 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ção são usados para notificar os usuários de que um alerta foi acionado ou para disparar respostas automatizadas a alertas.

Para criar grupos de ações no Bicep, você pode usar o tipo Microsoft.Insights/actionGroups. Segue-se 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ção que enviam alertas para Hubs de Eventos, Azure Functions, Aplicativos Lógicos e muito mais.

Regras de processamento de alertas

As regras de processamento de alertas (anteriormente referidas como regras de ação) permitem que você aplique o processamento em alertas que foram acionados. Você pode criar regras de processamento de alertas 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 recursos na propriedade scope , que direciona esses recursos para a regra de processamento de alertas.

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 MonitorService regra de processamento de alertas no Cofre de Backup do Azure é definida, que é aplicada ao grupo de ações existente. Esta regra dispara alertas para o grupo de ações.

Regras de alertas de registos

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

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

Regras de alerta de métricas

Os alertas de métricas notificam quando uma das suas métricas ultrapassa um limite definido. Você pode definir uma regra de alerta de métrica em seu código Bicep usando o tipo Microsoft.Insights/metricAlerts.

Alertas do registo de atividades

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

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

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

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

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 Resource Health

O Azure Resource Health mantém você informado sobre o status de integridade atual e histórico de seus recursos do Azure. Ao criar seus 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.

Os 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, onde você cria um alerta de integridade de recurso que relata alertas de integridade do serviço. O alerta é aplicado no nível da assinatura (usando a scope propriedade) 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 deteção inteligentes

Os alertas de deteção inteligente avisam sobre possíveis problemas de desempenho e anomalias de falha em seu aplicativo Web. Você pode criar alertas de deteção inteligentes no Bicep usando o tipo Microsoft.AlertsManagement/smartDetectorAlertRules.

Dashboards

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

Para obter mais informações sobre como criar 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-as 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 expansão para o plano do Serviço de Aplicativo com base na porcentagem média da CPU durante um período de tempo de 10 minutos. Se o plano do Serviço de Aplicativo exceder 70% do consumo médio da CPU em 10 minutos, o mecanismo de dimensionamento automático expandirá 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
  }
}

Nota

Ao definir regras de dimensionamento automático, tenha em mente as práticas recomendadas para evitar problemas ao tentar dimensionar automaticamente, como batimento. Para obter mais informações, consulte a seguinte documentação sobre práticas recomendadas para Autoscale.