监控 Azure 资源和应用程序

使用 Azure Monitor 跨 JavaScript 应用程序及其依赖的 Azure 服务收集日志、指标和警报。 Azure Monitor 是收集和存储遥测数据的中心平台服务。 可以使用 Application Insights 检测应用程序。 应监视托管的应用程序服务、应用程序与之集成的 Azure 服务以及应用程序源代码本身。

了解日志、指标和警报

遥测是从应用程序和服务收集的数据,用于监视其运行状况、性能和使用情况。 在 Azure 中,遥测分为日志、指标和警报。

Azure 提供四种类型的遥测:

遥测类型 它给你什么 如何找到每项服务
指标 数值、时序数据(CPU、内存等) 门户或 CLI 中的az monitor metrics
警报 达到阈值时主动通知 az monitor metrics alert
日志 基于文本的事件和诊断 (Web, 应用) 应用服务 日志 、函数 监视器、容器应用 诊断
自定义日志 使用 App Insights 获取自己的应用程序遥测数据 Application Insights 资源的 日志(跟踪)

为问题选取正确的遥测数据:

情景 使用日志... 使用指标... 使用通知...
“我的 Web 应用是否启动并响应? 应用服务网络服务器日志(Web 日志)
“我的函数是否超时或失败? 函数调用日志 (监视器) 函数执行持续时间指标 有关“函数错误 >0”的警报
“我的服务有多忙?它可以扩展以应对需求吗?” 指标中的服务吞吐量和CPU CPU% > 70% 上的自动缩放警报
“我的代码引发什么异常? Application Insights 中的自定义跟踪日志 有关“>ServerExceptions 0”的警报
我是否超出了交易或配额限制? 与配额相关的指标(事务、限流) 有关“ThrottlingCount >0”的警报

成本优化

通过了解配置选项的最佳做法和减少其收集的数据量,可以显著降低 Azure Monitor 的成本

为所有 Azure 资源启用日志记录和指标

Azure 中的每个服务都有自己的日志记录和指标功能。 在每个 Azure 资源上启用日志记录,以确保获取所需的遥测数据来监控您的整个端到端应用程序。

创建 Azure Monitor 资源

可以创建 Azure Monitor 资源,以便从 Azure 资源收集日志和指标。 此资源通常是 Log Analytics 工作区,存储日志和指标的位置。

可以通过多种方式创建此资源:

  • Azure 门户:使用 Azure 门户 创建 Log Analytics 工作区并配置资源的诊断设置。
  • Azure CLI:使用 Azure CLI 创建 Log Analytics 工作区并为资源配置诊断设置。
  • PowerShell:使用 PowerShell 创建 Log Analytics 工作区并为资源配置诊断设置。
  • Bicep:使用 Bicep 模板以声明方式定义和部署 Azure Monitor 资源。

使用 Azure CLI 创建 Log Analytics 工作区

使用 Azure CLI 创建 Log Analytics 工作区,该工作区存储日志和指标的位置。 示例:

# Variables
resourceGroup="myResourceGroup"
location="eastus"
workspaceName="myWorkspace"
webAppName="myWebApp"
diagName="${webAppName}/appServiceLogging"

# 1) Create a Log Analytics workspace
workspaceId=$(az monitor log-analytics workspace create \
  --resource-group $resourceGroup \
  --workspace-name $workspaceName \
  --location $location \
  --query id -o tsv)

# 2) Enable diagnostic settings on your App Service
az monitor diagnostic-settings create \
  --name "$diagName" \
  --resource "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$webAppName" \
  --workspace $workspaceId \
  --logs '[{"category": "Administrative", "enabled": true},{"category":"AppServiceConsoleLogs","enabled":true},{"category":"AppServiceHTTPLogs","enabled":true}]' \
  --metrics '[{"category":"AllMetrics","enabled":true}]'

使用 Bicep 创建 Log Analytics 工作区

使用 Bicep 以声明方式定义和部署 Azure Monitor 资源。 此示例创建 Log Analytics 工作区并配置应用服务的诊断设置:


Include logging, metrics, and alerting in your IaC templates with a [Bicep diagnosticSettings resource reference](/azure/templates/microsoft.insights/diagnosticsettings). Example (Bicep):

```bicep
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
  name: 'myWorkspace'
  location: resourceGroup().location
}

resource diagSettings 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {
  name: '${webApp.name}/appServiceLogging'
  properties: {
    workspaceId: logAnalytics.id
    logs: [
      { category: 'AppServiceConsoleLogs'; enabled: true }
      { category: 'AppServiceHTTPLogs'; enabled: true }
    ]
    metrics: [
      { category: 'AllMetrics'; enabled: true }
    ]
  }
}

为资源创建警报

可以在 Azure 门户中 或使用 Azure CLI 为指标设置警报。 警报可以包括特定指标、通信流(如电子邮件)和频率。

使用以下示例在门户中或以编程方式创建指标警报:

  • Azure CLI:通过 az monitor metrics alert 快速设置
  • Bicep:声明式 IaC 定义 Microsoft.Insights/metricAlerts

警报可以指定目标指标、通知通道(电子邮件、Webhook)、严重性、评估频率和作组。

az monitor metrics alert create \
  --name HighCpuAlert \
  --resource-group MyResourceGroup \
  --scopes /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/Microsoft.Web/sites/myApp \
  --condition "avg CpuPercentage > 70" \
  --description "Alert when CPU goes above 70%" \
  --severity 2 \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup
resource cpuAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
  name: 'highCpuAlert'
  location: resourceGroup().location
  properties: {
    description: 'Alert when CPU goes above 70%'
    severity: 2
    enabled: true
    scopes: [
      webApp.id
    ]
    evaluationFrequency: 'PT1M'
    windowSize: 'PT5M'
    criteria: {
      allOf: [
        {
          criterionType: 'StaticThresholdCriterion'
          name: 'HighCpu'
          metricName: 'CpuPercentage'
          metricNamespace: 'Microsoft.Web/sites'
          operator: 'GreaterThan'
          threshold: 70
          timeAggregation: 'Average'
        }
      ]
    }
    autoMitigate: false
    actions: [
      {
        actionGroupId: '/subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup'
      }
    ]
  }
}

查看日志数据

若要在 Azure 门户中查看日志数据,请导航到 Log Analytics 工作区并选择“ 日志”。 可以针对日志运行 Kusto 查询语言 (KQL) 查询。

流式传输日志

使用下表详细了解如何流式传输日志。

Azure MCP 服务器

在本地开发时,可以使用 Azure MCP 服务器监视器 工具来查询日志,而无需离开 IDE。 安装服务器后,示例 Copilot 提示包括:

  • 列出工作区:“显示我的订阅中的所有 Log Analytics 工作区。
  • 查找表:“列出工作区”security-logs“中的所有表”
  • 复杂查询:“显示过去 24 小时内 Web 服务器的 CPU 使用率趋势”

将日志记录添加到你的代码中

对于应用程序日志记录,Application Insights 可以提供:

  • Azure 服务和源代码中的标准日志记录,具体取决于初始化。
  • 在您的部署管道和源代码中进行自定义日志记录。

标准控制台日志记录 (stdout/stderr)

Azure Web Apps 和 Azure Functions 会自动为 stdoutstderr 提供自定义日志记录,前提是您使用正确的日志记录函数。

  • Web 应用使用 console.log('your message here')
  • 函数应用使用 context.log('your message here')

添加自定义 Application Insights 日志记录

可以在 Azure Monitor 中使用 Application Insights 添加更丰富的自定义日志记录。 Application Insights 提供 服务器 (Node.js)和 客户端 (浏览器)方案:

  • 将 Application Insights SDK 添加到源代码。
  • 使用 npm 包从 Node.js 记录。
    • 请务必配置 enableAutoCollectConsole: true Node.js SDK,以便收集自定义控制台日志。
  • 使用 npm 包在客户端代码中记录日志。
  • Kubernetes 群集Azure 虚拟机获取日志。

启用 SDK 管道日志(@Azure/日志记录器)

使用 AZURE_LOG_LEVEL 环境变量或 @azure/logger npm 包控制 SDK 详细程度:

import { setLogLevel } from "@azure/logger";
// Options: 'error', 'warning', 'info', 'verbose'
setLogLevel(process.env.AZURE_LOG_LEVEL || "info");

配置 Application Insights Node.js SDK

初始化 Node.js SDK 的 Application Insights,方法是进行采样、收集依赖项和捕获控制台日志。

import appInsights from "applicationinsights";
appInsights
  .setup("<INSTRUMENTATION_KEY>")
  .setAutoCollectConsole(true, true)        // collect console.log
  .setAutoCollectDependencies(true)        // track outgoing requests
  .setInternalLogging(false, true)         // SDK internal logs
  .start();

// Optional: add custom properties to all telemetry
appInsights.defaultClient.commonProperties = { serviceName: "my-service" };

添加关联和分布式跟踪

Application Insights SDK 自动将操作和关联 ID 注入到请求中。 若要添加自定义关联或属性,请执行以下作:

appInsights.defaultClient.trackTrace({
  message: "Custom trace",
  properties: { userId: user.id }
});

了解详细信息: 分布式跟踪指南

在开发脚本中清除遥测数据

确保在本地开发期间进程退出之前发送日志:

appInsights.defaultClient.flush({
  callback: () => process.exit(0)
});

客户端遥测设置

对于客户端应用程序,请使用 @microsoft/applicationinsights-web

import { ApplicationInsights } from "@microsoft/applicationinsights-web";
const ai = new ApplicationInsights({ config: {
  instrumentationKey: "<INSTRUMENTATION_KEY>",
  enableAutoRouteTracking: true
}});
ai.loadAppInsights();

后续步骤