你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Application Insights 中的指标

Application Insights 支持三种不同类型的指标:标准(预聚合)指标、基于日志的指标和自定义指标。 每种指标在监视应用程序运行状况、诊断和分析方面都发挥了独特的作用。 检测应用程序的开发人员可以确定哪种类型的指标最适合特定的方案。 决策基于应用程序的大小、预期遥测量以及指标精度和警报方面的业务要求。 本文介绍所有支持的指标类型之间的差异。

标准指标

Application Insights 中的标准指标是预定义指标,由服务自动收集和监视。 这些指标涵盖各种性能和使用指标,例如 CPU 使用率、内存消耗、请求速率和响应时间。 标准指标提供应用程序运行状况和性能的全面概述,无需任何额外配置。 标准指标在收集期间进行预聚合,并作为时间序列存储在仅具有关键维度的专用存储库中,这使它们在查询时具有更好的性能。 因此,标准指标最适合用于准实时指标维度警报和响应速度更快的仪表板

基于日志的指标

Application Insights 中基于日志的指标是一个查询时概念,表示为应用程序日志数据之上的时序。 基础日志不会在集合或存储时预聚合,并保留每个日志条目的所有属性。 这种保留使得在查询时可以将日志属性作为维度应用于基于日志的指标,从而进行指标图表筛选指标拆分,从而为基于日志的指标提供卓越的分析和诊断价值。 然而,遥测量减少技术(例如采样遥测筛选)通常用于生成大量遥测数据的监视应用程序,会影响收集的日志条目的数量,从而降低基于日志的指标的准确性。

自定义指标(预览版)

Application Insights 中的自定义指标使你可以定义和跟踪应用程序特有的特定度量值。 可以通过检测代码将自定义遥测数据发送到 Application Insights 来创建这些指标。 自定义指标可以灵活地监视标准指标未涵盖的应用程序的任何方面,使你能够更深入地了解应用程序的行为和性能。

有关详细信息,请参阅 Azure Monitor 中的自定义指标(预览版)

注意

Application Insights 还提供一项称为实时指标流的功能,该功能允许对 Web 应用程序进行准实时监视,并且不存储任何遥测数据。

指标比较

功能 标准指标 基于日志的指标 自定义指标
数据源 在运行时收集的预聚合时序数据。 派生自使用 Kusto 查询的日志数据。 通过 Application Insights SDK 或 API 收集的用户定义的指标。
粒度 固定间隔(1 分钟)。 取决于日志数据本身的粒度。 基于用户定义的指标的灵活粒度。
准确性 高,不受日志采样影响。 可能会受到采样和筛选的影响。 高,尤其是在使用 GetMetric 等预聚合方法时。
成本 包括在 Application Insights 定价中。 基于日志数据引入和查询成本。 请参阅定价模型和保留期
配置 通过最小配置即可自动获取。 需要配置日志查询,以便从日志数据中提取所需的指标。 需要代码中的自定义实现和配置。
查询性能 由于预聚合,速度很快。 速度较慢,因为它涉及查询日志数据。 取决于数据量和查询复杂性。
存储 以时序数据的形式存储在 Azure Monitor 指标存储中。 作为日志存储在 Log Analytics 工作区中。 存储在 Log Analytics 和 Azure Monitor 指标存储中。
警报 支持实时警报。 允许基于详细日志数据的复杂警报场景。 基于用户定义的指标的灵活警报。
服务限制 受限于 Application Insights 限制 受限于 Log Analytics 工作区限制 受限于免费指标配额和其他维度的成本。
用例 实时监视、性能仪表板和快速见解。 详细的诊断、故障排除和深入分析。 定制的性能指标和业务特定的指标。
示例 CPU 使用率、内存使用率、请求持续时间。 请求计数、异常跟踪、依赖项调用。 自定义特定于应用程序的指标,例如用户参与度、功能使用情况。

指标预聚合

OpenTelemetry SDK 和较新的 Application Insights SDK (Classic API) 在收集过程中会对指标进行预聚合,以减少从 SDK 发送到遥测通道终结点的数据量。 此过程适用于默认发送的标准指标,因此准确度不受采样或筛选的影响。 它也适用于使用 OpenTelemetry APIGetMetric 和 TrackValue 发送的自定义指标,因此可减少数据引入并降低成本。 如果 Application Insights SDK 版本支持 GetMetric 和 TrackValue,则它是发送自定义指标的首选方法。

对于不实施预聚合的 SDK(即,早期版本的 Application Insights SDK 或用于浏览器检测的 SDK),Application Insights 后端仍会通过聚合 Application Insights 遥测通道终结点收集终结点收到的事件来填充新指标。 对于自定义指标,可以使用 trackMetric 方法。 尽管不能从减少的网络传输数据量中获益,但你仍然可以使用预先聚合的指标并体验到改善的性能,同时可以在收集期间使用不预先聚合指标的 SDK 进行准实时维度预警。

遥测通道终结点在引入采样之前预聚合事件。 因此,无论你在应用程序中使用哪个 SDK 版本,引入采样都不会影响预先聚合的指标的准确性。

下表列出了预聚合的位置。

使用 Azure Monitor OpenTelemetry 发行版预聚合指标

当前生产 SDK 标准指标预聚合 自定义指标预聚合
ASP.NET Core SDK SDK(通过 OpenTelemetry API
.NET(通过导出程序) SDK SDK(通过 OpenTelemetry API
Java (3.x) SDK SDK(通过 OpenTelemetry API
Java native SDK SDK(通过 OpenTelemetry API
Node.js SDK SDK(通过 OpenTelemetry API
Python SDK 中 IsInRole 中的声明 SDK(通过 OpenTelemetry API

使用 Application Insights SDK (Classic API) 进行指标预聚合

当前生产 SDK 标准指标预聚合 自定义指标预聚合
.NET Core 和 .NET Framework SDK (V2.13.1+) SDK (V2.7.2+)(通过 GetMetric
遥测通道终结点(通过 TrackMetric
Java (2.x) 遥测通道终结点 遥测通道终结点(通过 TrackMetric
JavaScript(浏览器) 遥测通道终结点 遥测通道终结点(通过 TrackMetric
Node.js 遥测通道终结点 遥测通道终结点(通过 TrackMetric
Python 遥测通道终结点 SDK(通过已停用的 OpenCensus.stats
遥测通道终结点(通过 TrackMetric

注意

使用自动检测预聚合指标

使用自动检测,SDK 会自动添加到应用程序代码中,并且无法自定义。 对于自定义指标,需要手动检测。

当前生产 SDK 标准指标预聚合 自定义指标预聚合
ASP.NET Core SDK 1 不支持
ASP.NET SDK 2 不支持
Java SDK 支持 3
Node.js SDK 不支持
Python SDK 中 IsInRole 中的声明 不支持

脚注

  • 1 应用服务上的 ASP.NET Core 自动检测会发出没有维度的标准指标。 所有维度都需要手动检测。
  • 2 虚拟机/虚拟机规模集上的本地的 ASP.NET 自动检测会发出无维度的标准指标。 Azure 应用服务也是如此,但集合级别必须设置为“推荐”。 所有维度都需要手动检测。
  • 3 与自动检测一起使用的 Java 代理会捕获热门库发出的指标,并将其作为自定义指标发送到 Application Insights。

自定义指标维度和预先聚合

使用 OpenTelemetrytrackMetricGetMetric 和 TrackValue API 调用发送的所有指标将自动存储在指标存储和日志中。 这些指标可以在 Application Insights 中的 customMetrics 表和指标资源管理器中名为“azure.applicationinsights”的自定义指标命名空间下找到。 虽然自定义指标基于日志的版本始终保留所有维度,但指标的预先聚合版本在存储时默认不包含任何维度。 保留自定义指标的维度是一项预览功能,可通过选择“将自定义指标发送到 Azure 指标存储”下的“使用维度”,从“使用情况和估计成本”选项卡启用此功能

屏幕截图显示使用情况和预估成本。

配额

预先聚合的指标作为时序存储在 Azure Monitor 中。 适用自定义指标的 Azure Monitor 配额

注意

超出配额可能会产生意外后果。 Azure Monitor 在你的订阅或区域中可能变得不可靠。 若要了解如何避免超出配额,请参阅设计限制和注意事项

为何默认禁用了自定义指标维度的收集?

之所以默认禁用自定义指标维度的收集,是因为存储包含维度的自定义指标将来会在 Application Insights 中单独计费。 存储无维度自定义指标的操作仍然免费(但不能超过配额限制)。 可以在官方定价页中了解我们即将做出的定价模式变化。

创建图表并浏览指标

使用 Azure Monitor 指标资源管理器可以根据预聚合的指标、基于日志的指标和自定义指标来绘制图表,以及创作包含图表的仪表板。 选择所需的 Application Insights 资源后,请使用命名空间选取器在指标之间进行切换。

屏幕截图显示指标命名空间。

Application Insights 指标的定价模型

如果将指标引入 Application Insights,则无论是基于日志的指标还是预先聚合的指标,都将产生基于引入数据的大小的成本。 有关详细信息,请参阅 Azure Monitor 日志定价详细信息。 自定义指标(包括其所有维度)始终存储在 Application Insights 日志存储中。 此外,默认情况下,会将自定义指标(不包含维度)的预先聚合版本转发到指标存储。

如果为了在指标存储中存储预先聚合指标的所有维度而选择“在自定义指标维度上启用警报”选项,则可能会产生基于自定义指标定价的额外成本

可用度量值

以下部分列出了指标以及支持的聚合与维度。 基于日志的指标的详细信息包括底层 Kusto 查询语句。

可用性指标

参考“可用性”类别中的指标可以了解在世界各地预测到的 Web 应用程序运行状况。 配置可用性测试,以开始使用此类别中的任何指标。

可用性 (availabilityResults/availabilityPercentage)

“可用性”指标显示未检测到任何问题的 Web 测试运行的百分比。 可能的最小值为 0,表示所有 Web 测试运行均失败。 值 100 表示所有 Web 测试运行都符合验证条件。

度量单位 支持的聚合 支持的维度
百分比 Avg Run locationTest name

可用性测试持续时间 (availabilityResults/duration)

“可用性测试持续时间”指标显示运行 Web 测试所花费的时间。 对于多步骤 Web 测试,该指标反映所有步骤的总执行时间。

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min Run locationTest nameTest result

可用性测试 (availabilityResults/count)

“可用性测试”指标反映 Azure Monitor 执行的 Web 测试运行计数。

度量单位 支持的聚合 支持的维度
计数 计数 Run locationTest nameTest result

浏览器指标

浏览器指标由 Application Insights JavaScript SDK 从实际的最终用户浏览器收集。 它们提供 Web 应用用户体验的深入见解。 通常不会对浏览器指标采样,这意味着,在用量数字方面,与服务器端指标相比,它们提供的精度更高,而后者的采样可能会导致结果有偏差。

注意

若要收集浏览器指标,必须使用 Application Insights JavaScript SDK 来检测应用程序。

浏览器页面加载时间 (browserTimings/totalDuration)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min

客户端处理时间 (browserTiming/processingDuration)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min

页面加载网络连接时间 (browserTimings/networkDuration)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min

接收响应时间 (browserTimings/receiveDuration)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min

发送请求时间 (browserTimings/sendDuration)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min

失败指标

“失败”中的指标显示处理请求、依赖项调用的问题,以及引发的异常。

浏览器异常数 (exceptions/browser)

此指标反映浏览器中运行的应用程序代码引发的异常数。 该指标仅包含使用 trackException() Application Insights API 调用跟踪的异常。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role name

依赖项调用失败数 (dependencies/failed)

失败的依赖项调用数。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameDependency performanceDependency typeIs traffic syntheticResult codeTarget of dependency call

异常数 (exceptions/count)

每当你将异常记录到 Application Insights 时,都会调用 SDK 的 trackException() 方法。 “异常数”指标显示记录的异常数。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameDevice type

失败的请求数 (请求/失败)

标记为失败的受跟踪服务器请求计数。 默认情况下,Application Insights SDK 会自动将返回 HTTP 响应代码 5xx 或 4xx 的每个服务器请求标记为失败的请求。 可以通过在自定义遥测初始化表达式中修改请求遥测项的 success 属性来自定义此逻辑。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameIs synthetic trafficRequest performanceResult code

服务器异常数 (exceptions/server)

此指标显示服务器异常数。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role name

性能计数器

使用“性能计数器”类别中的指标可以访问 Application Insights 收集的系统性能计数器

可用内存 (performanceCounters/availableMemory)

度量单位 支持的聚合 支持的维度
兆字节/千兆字节(依赖于数据) Avg、Max、Min Cloud role instance

异常率 (performanceCounters/exceptionRate)

度量单位 支持的聚合 支持的维度
计数 Avg、Max、Min Cloud role instance

HTTP 请求执行时间 (performanceCounters/requestExecutionTime)

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min Cloud role instance

HTTP 请求速率 (performanceCounters/requestsPerSecond)

度量单位 支持的聚合 支持的维度
每秒请求数 Avg、Max、Min Cloud role instance

应用程序队列中的 HTTP 请求数 (performanceCounters/requestsInQueue)

度量单位 支持的聚合 支持的维度
计数 Avg、Max、Min Cloud role instance

进程 CPU (performanceCounters/processCpuPercentage)

该指标显示托管受监视应用的进程消耗的处理器总容量。

度量单位 支持的聚合 支持的维度
百分比 Avg、Max、Min Cloud role instance

注意

指标的范围介于 0 到 100 * n 之间,其中 n 是可用的 CPU 核心数。 例如,200% 的指标值可以表示两个 CPU 核心的全部利用率,或者 4 个 CPU 核心的一半利用率,以此类推。 规范化的进程 CPU 是由许多 SDK 收集的另一种指标,它表示相同的值,但要除以可用的 CPU 核心数。 因此,规范化的进程 CPU 指标的范围为 0 到 100。

进程 IO 速率 (performanceCounters/processIOBytesPerSecond)

度量单位 支持的聚合 支持的维度
每秒字节数 Average、Min、Max Cloud role instance

进程专用字节数 (performanceCounters/processPrivateBytes)

受监视进程为其数据分配的非共享内存量。

度量单位 支持的聚合 支持的维度
字节 Average、Min、Max Cloud role instance

处理器时间 (performanceCounters/processorCpuPercentage)

受监视服务器实例上运行的所有进程的 CPU 消耗量。

度量单位 支持的聚合 支持的维度
百分比 Average、Min、Max Cloud role instance

注意

处理器时间指标不适用于 Azure 应用服务中托管的应用程序。 使用进程 CPU 指标可以跟踪应用服务中托管的 Web 应用程序的 CPU 利用率。

服务器指标

依赖项调用数 (dependencies/count)

此指标与依赖项调用数相关。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameDependency performanceDependency typeIs traffic syntheticResult codeSuccessful callTarget of a dependency call

依赖项持续时间 (dependencies/duration)

此指标是指依赖项调用的持续时间。

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min Cloud role instanceCloud role nameDependency performanceDependency typeIs traffic syntheticResult codeSuccessful callTarget of a dependency call

服务器请求速率 (requests/rate)

此指标反映 Web 应用程序收到的传入服务器请求数。

度量单位 支持的聚合 支持的维度
每秒计数 Avg Cloud role instanceCloud role nameIs traffic syntheticRequest performance Result codeSuccessful request

服务器请求数 (requests/count)

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameIs traffic syntheticRequest performance Result codeSuccessful request

服务器响应时间 (requests/duration)

此指标反映服务器处理传入请求所花费的时间。

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min Cloud role instanceCloud role nameIs traffic syntheticRequest performance Result codeSuccessful request

使用情况指标

页面查看次数加载时间 (pageViews/duration)

此指标是指加载 PageView 事件所花费的时间。

度量单位 支持的聚合 支持的维度
毫秒 Avg、Max、Min Cloud role nameIs traffic synthetic

页面查看次数 (pageViews/count)

使用 TrackPageView () Application Insights API 记录的 PageView 事件计数。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role nameIs traffic synthetic

跟踪数 (traces/count)

使用 TrackTrace () Application Insights API 调用记录的跟踪语句计数。

度量单位 支持的聚合 支持的维度
计数 计数 Cloud role instanceCloud role nameIs traffic syntheticSeverity level

自定义指标

不适用于标准指标。

使用 Application Insights REST API 直接访问基于日志的指标

Application Insights REST API 支持以编程方式检索基于日志的指标。 它还有一个可选参数 ai.include-query-payload,将该参数添加到查询字符串时,它会提示 API 不但返回时序数据,而且返回用于提取它的 Kusto 查询语言 (KQL) 语句。 对于想要理解 Log Analytics 中的原始事件与由此产生的基于日志的指标之间的联系的用户来说,此参数特别有用。

要直接访问数据,请使用 KQL 将参数 ai.include-query-payload 传递给查询中的 Application Insights API。

注意

要检索基础日志查询,不必替换 DEMO_APPDEMO_KEY。 如果只想检索 KQL 语句而不是你自己的应用程序的时序数据,则可以将其直接复制并粘贴到浏览器搜索栏中。

api.applicationinsights.io/v1/apps/DEMO_APP/metrics/users/authenticated?api_key=DEMO_KEY&prefer=ai.include-query-payload

以下是指标“经过身份验证的用户”的返回 KQL 语句的示例。 (在本例中,"users/authenticated" 为指标 ID。)

output
{
    "value": {
        "start": "2024-06-21T09:14:25.450Z",
        "end": "2024-06-21T21:14:25.450Z",
        "users/authenticated": {
            "unique": 0
        }
    },
    "@ai.query": "union (traces | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (requests | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (pageViews | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (dependencies | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (customEvents | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (availabilityResults | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (exceptions | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (customMetrics | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)), (browserTimings | where timestamp >= datetime(2024-06-21T09:14:25.450Z) and timestamp < datetime(2024-06-21T21:14:25.450Z)) | where notempty(user_AuthenticatedId) | summarize ['users/authenticated_unique'] = dcount(user_AuthenticatedId)"
}

后续步骤