使用 Bicep 建立監視資源

Azure 有一套完整的工具,可監視您的應用程式和服務。 您可以使用 Bicep 以程式設計方式建立監視資源,以在佈建 Azure 基礎結構時自動建立規則、診斷設定和警示。

將監視設定與 Bicep 程式碼整合似乎不太常見,因為考慮到 Azure 入口網站內有可用來設定警示規則、診斷設定和儀表板的工具。

不過,警示和診斷設定基本上與您其他基礎結構資源相同。 藉由將其包含再 Bicep 程式碼中,您即可部署和測試警示資源,如針對其他 Azure 資源進行的方式。

如果您使用 Git 或其他版本控制工具來管理 Bicep 檔案,您也能享受監視設定歷程記錄的優點,以便查看警示的設定方式。

Log Analytics 和 Application Insights 工作區

您可以使用 Microsoft.OperationalInsights/workspaces 資源類型來建立 Log Analytics 工作區,以及 Microsoft.Insights/components 類型來建立 Application Insights 工作區。 這兩個元件均會部署至資源群組。

診斷設定

診斷設定可讓您設定 Azure 監視器,以將記錄和計量匯出至數個目的地,包括 Log Analytics 和 Azure 儲存體。

在 Bicep 中建立診斷設定時,請記住此資源為延伸模組資源,這表示此資源會套用至另一個資源。 您可以使用資源類型 Microsoft.Insights/diagnosticSettings 在 Bicep 中建立診斷設定。

在 Bicep 中建立診斷設定時,您必須套用診斷設定的範圍。 診斷設定可以套用於管理、訂用帳戶或資源群組層級。 使用此資源上的範圍屬性來設定此資源的範圍

請考慮下列範例:

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 
        }
      }
    ]
  }
}

在上述範例中,您會針對 App Service 計畫建立診斷設定,並將這些診斷傳送至 Log Analytics。 您可以使用 scope 屬性將 App Service 計畫定義為診斷設定的範圍,並使用 workspaceId 屬性來定義要傳送診斷記錄 Log Analytics 工作區。 您也可以將診斷設定匯出至事件中樞和 Azure 儲存體帳戶。

資源之間的記錄類型不同,因此請確定您要匯出的記錄適用於您所使用的資源。

活動記錄診斷設定

若要使用 Bicep 設定診斷設定來匯出 Azure 活動記錄、請在訂用帳戶範圍中部署診斷設定資源。

下列範例顯示如何將多個活動記錄類型匯出至 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
      }
    ]
  }
}

警示

警示會藉由監視 Azure 監視器內的資料,主動通知您 Azure 基礎結構和應用程式中的問題。 藉由在 Bicep 程式碼中設定監視和警示設定,您可以自動建立上述警示,並建立在 Azure 中佈建的基礎結構。

如需警示在 Azure 中運作方式的詳細資訊,請參閱 Microsoft Azure 中的警示概觀

下列各節會示範如何使用 Bicep 程式碼設定不同類型的警示。

動作群組

若要在觸發警示時收到通知,您必須建立動作群組。 動作群組是 Azure 訂用帳戶擁有者定義的通知喜好設定集合。 動作群組可用於通知使用者系統已觸發警示,或用於觸發警示的自動回應。

若要在 Bicep 中建立動作群組,您可以使用 Microsoft.Insights/actionGroups 類型。 以下是範例:

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
      }
    ]
  }
}

上述範例會建立動作群組,來將警示傳送至電子郵件地址,但您也可以定義動作群組,將警示傳送至事件中樞、Azure Functions、Logic Apps 等等。

警示處理規則

警示處理規則 (先前稱為動作規則) 可讓您對已引發的警示套用處理方式。 您可以使用 Microsoft.AlertsManagement/actionRules 類型,在 Bicep 中建立警示處理規則。

每個警示處理規則皆有範圍,可能是一或多個特定資源的清單、特定資源群組或整個 Azure 訂用帳戶。 當您在 Bicep 中定義警示處理規則時,您會在範圍屬性中定義資源識別碼的清單,以警示處理規則為目標的資源。

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
    ]
  }
}

在上述範例中,已定義 Azure 備份 Vault 上 MonitorService 警示處理規則,此規則會套用至現有的動作群組。 此規則會觸發動作群組的警示。

記錄警示規則

記錄警示會自動執行 Log Analytics 查詢。 用來以您所定義的間隔評估資源記錄的查詢,判斷結果是否符合您指定的部分準則,然後引發警示。

您可以使用 Microsoft.Insights/scheduledQueryRules 類型,在 Bicep 中建立記錄警示規則。

計量警示規則

計量警示會在其中一項計量超過定義閾值時通知您。 您可以使用 Microsoft.Insights/metricAlerts 類型,在 Bicep 程式碼中定義計量警示規則。

活動記錄警示 \(部分機器翻譯\)

Azure 活動記錄是 Azure 中的平台記錄,可提供事件在訂用帳戶層級的深入解析。 此包含資訊,例如 Azure 中的資源進行修改的時間。

活動記錄警示為警示,會在警示中指定的符合條件新活動記錄事件發生時啟動。

您可以在 Microsoft.Insights/activityLogAlerts 類型中使用 scope 屬性來在使用資源識別碼作為前置碼的特定資源或資源清單上建立活動記錄警示。

您可以在 condition 屬性內定義警示規則條件,接著使用 actionGroup 陣列來設定警示群組觸發上述警示。 您可以在這裡根據需求傳遞單一或多個動作群組來傳送活動記錄警示。

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
    ]
  }
}

資源健康狀態警示

Azure 資源健康狀態會隨時通知您 Azure 資源目前和過去的健康狀態。 藉由使用 Bicep 建立資源健康情況警示,您可以大量建立和自訂這些警示。

在 Bicep 中,您可以使用 Microsoft.Insights/activityLogAlerts 類型建立資源健康情況警示。

資源健康情況警示可以設定為監視訂用帳戶、資源群組或個別資源層級的事件。

請考慮下列範例,您可以在其中建立資源健康情況警示,以報告服務健康情況警示。 警示會套用至訂用帳戶層級 (使用 scope 屬性),並將警示傳送至現有的動作群組:

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
        }
      ]
    }
  }
}

智慧型偵測警示

智慧偵測會警告您 Web 應用程式中的可能效能問題和失敗異常。 您可以使用 Microsoft.AlertsManagement/smartDetectorAlertRules 類型,在 Bicep 中建立智慧偵測警示。

儀表板​​

在 Bicep 中,您可以使用 Microsoft.Portal/dashboards 資源類型來建立入口網站儀表板。

如需使用程式碼建立儀表板的詳細資訊,請參閱以程式設計方式建立 Azure 儀表板

自動調整規則

若要建立自動調整設定,您可以使用 Microsoft.Insights/autoscaleSettings 資源類型定義上述設定。

若要將您想要套用自動調整設定的目標設為目標,您必須提供應新增設定資源的目標資源識別碼。

在此範例中,根據 10 分鐘期間的平均 CPU 百分比,App Service 計畫的相應放大條件。 如果 App Service 方案超過 70% 的平均 CPU 耗用量會超過 10 分鐘,則自動調整引擎會藉由新增一個執行個體來相應放大方案。

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
  }
}

注意

定義自動調整規則時,請記住最佳做法,以避免嘗試自動調整時發生問題,例如 flapping。 如需詳細資訊,請參閱下列自動調整最佳做法文件。