基于 Application Insights 日志的指标

使用基于 Application Insights 日志的指标可以分析受监视应用的运行状况、创建功能强大的仪表板,以及配置警报。 有两种类型的指标:

由于标准指标会在收集期间预先聚合,因此它们在查询时具有更好的性能。 因此它们更适合在仪表板和实时警报中显示。 基于日志的指标具有更多的维度,因此,它们特别适合用于数据分析和即席诊断。指标资源管理器中使用命名空间选择器可以在基于日志的指标与标准指标之间切换。

本文中的查询的解释和用法

本文列出了指标以及支持的聚合与维度。 基于日志的指标的详细信息包括底层 Kusto 查询语句。 为方便起见,每个查询对时间粒度、图表类型使用默认值,有时还会拆分维度,这简化了查询在 Log Analytics 中的使用,而无需进行任何修改。

指标资源管理器中绘制同一指标的图表时,不会使用默认值 - 查询会根据图表设置动态调整:

  • 所选的“时间范围”将转换为额外的 where timestamp ... 子句,以便仅选取所选时间范围内的事件。 例如,对于显示最近 24 小时数据的图表,查询将包含 | where timestamp > ago(24 h)

  • 所选的“时间粒度”将放入最终的 summarize ... by bin(timestamp, [time grain]) 子句。

  • 任何所选“筛选器”维度将转换为额外的 where 子句。

  • 所选的“拆分图表”维度将转换为额外的 summarize 属性。 例如,如果你按位置拆分图表,并使用 5 分钟时间粒度绘制图表,则 summarize 子句将由 ... by bin(timestamp, 5 m), location 汇总。

注意

如果你不熟悉 Kusto 查询语言,请先复制 Kusto 语句并将其粘贴到 Log Analytics 查询窗格,而无需进行任何修改。 单击“运行”查看基本图表。 对查询语言的语法有一定的了解后,可以开始进行少量的修改,并查看更改造成的影响。 探索自己的数据是开始实现 Log AnalyticsAzure Monitor 的全部功能的好办法。

可用性指标

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

可用性 (availabilityResults/availabilityPercentage)

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

度量单位 支持的聚合 支持的维度
百分比 平均值 运行位置、测试名称
availabilityResults 
| summarize sum(todouble(success == 1) * 100) / count() by bin(timestamp, 5m), location
| render timechart

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

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

度量单位 支持的聚合 支持的维度
毫秒 Average、Min、Max 运行位置、测试名称、测试结果
availabilityResults
| where notempty(duration)
| extend availabilityResult_duration = iif(itemType == 'availabilityResult', duration, todouble(''))
| summarize sum(availabilityResult_duration)/sum(itemCount) by bin(timestamp, 5m), location
| render timechart

可用性测试 (availabilityResults/count)

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

度量单位 支持的聚合 支持的维度
计数 计数 运行位置、测试名称、测试结果
availabilityResults
| summarize sum(itemCount) by bin(timestamp, 5m)
| render timechart

浏览器指标

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

注意

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

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

从用户请求一直到 DOM、样式表、脚本和映像加载完之间的时间。

度量单位 支持的聚合 预先聚合的维度
毫秒 Average、Min、Max
browserTimings
| where notempty(totalDuration)
| extend _sum = totalDuration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 5m)
| render timechart

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

从接收文档的最后一个字节到 DOM 加载完之间的时间。 可能仍在处理异步请求。

度量单位 支持的聚合 预先聚合的维度
毫秒 Average、Min、Max
browserTimings
| where notempty(processingDuration)
| extend _sum = processingDuration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum)/sum(_count) by bin(timestamp, 5m)
| render timechart

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

用户请求和网络连接之间的时间。 包括 DNS 查找和传输连接。

度量单位 支持的聚合 预先聚合的维度
毫秒 Average、Min、Max
browserTimings
| where notempty(networkDuration)
| extend _sum = networkDuration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 5m)
| render timechart

接收响应时间 (browserTimings/receiveDuration)

第一个和最后一个字节之间的时间,或直至断开连接的时间。

度量单位 支持的聚合 预先聚合的维度
毫秒 Average、Min、Max
browserTimings
| where notempty(receiveDuration)
| extend _sum = receiveDuration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 5m)
| render timechart

发送请求时间 (browserTimings/sendDuration)

网络连接和接收第一个字节之间的时间。

度量单位 支持的聚合 预先聚合的维度
毫秒 Average、Min、Max
browserTimings
| where notempty(sendDuration)
| extend _sum = sendDuration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 5m)
| render timechart

失败指标

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

浏览器异常数 (exceptions/browser)

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

度量单位 支持的聚合 预先聚合的维度 备注
计数 计数 基于日志的版本使用 Sum 聚合
exceptions
| where notempty(client_Browser)
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

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

失败的依赖项调用数。

度量单位 支持的聚合 预先聚合的维度 备注
计数 计数 基于日志的版本使用 Sum 聚合
dependencies
| where success == 'False'
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

异常数 (exceptions/count)

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

度量单位 支持的聚合 预先聚合的维度 备注
计数 计数 云角色名称、云角色实例、设备类型 基于日志的版本使用 Sum 聚合
exceptions
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

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

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

度量单位 支持的聚合 预先聚合的维度 备注
计数 计数 云角色实例、云角色名称、实际或综合流量、请求性能、响应代码 基于日志的版本使用 Sum 聚合
requests
| where success == 'False'
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

服务器异常数 (exceptions/server)

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

度量单位 支持的聚合 预先聚合的维度 备注
计数 计数 云角色名称、云角色实例 基于日志的版本使用 Sum 聚合
exceptions
| where isempty(client_Browser)
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

性能计数器

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

可用内存 (performanceCounters/availableMemory)

performanceCounters
| where ((category == "Memory" and counter == "Available Bytes") or name == "availableMemory")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

异常率 (performanceCounters/exceptionRate)

performanceCounters
| where ((category == ".NET CLR Exceptions" and counter == "# of Exceps Thrown / sec") or name == "exceptionRate")
| extend performanceCounter_value = iif(itemType == 'performanceCounter',value,todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

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

performanceCounters
| where ((category == "ASP.NET Applications" and counter == "Request Execution Time") or name == "requestExecutionTime")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

HTTP 请求速率 (performanceCounters/requestsPerSecond)

performanceCounters
| where ((category == "ASP.NET Applications" and counter == "Requests/Sec") or name == "requestsPerSecond")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

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

performanceCounters
| where ((category == "ASP.NET Applications" and counter == "Requests In Application Queue") or name == "requestsInQueue")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

进程 CPU (performanceCounters/processCpuPercentage)

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

度量单位 支持的聚合 支持的维度
百分比 Average、Min、Max 云角色实例
performanceCounters
| where ((category == "Process" and counter == "% Processor Time Normalized") or name == "processCpuPercentage")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

注意

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

进程 IO 速率 (performanceCounters/processIOBytesPerSecond)

度量单位 支持的聚合 支持的维度
每秒字节数 Average、Min、Max 云角色实例
performanceCounters
| where ((category == "Process" and counter == "IO Data Bytes/sec") or name == "processIOBytesPerSecond")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

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

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

度量单位 支持的聚合 支持的维度
字节 Average、Min、Max 云角色实例
performanceCounters
| where ((category == "Process" and counter == "Private Bytes") or name == "processPrivateBytes")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

处理器时间 (performanceCounters/processorCpuPercentage)

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

度量单位 支持的聚合 支持的维度
百分比 Average、Min、Max 云角色实例

注意

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

performanceCounters
| where ((category == "Processor" and counter == "% Processor Time") or name == "processorCpuPercentage")
| extend performanceCounter_value = iif(itemType == "performanceCounter", value, todouble(''))
| summarize sum(performanceCounter_value) / count() by bin(timestamp, 1m)
| render timechart

服务器指标

依赖项调用数 (dependencies/count)

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

dependencies
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

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

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

dependencies
| where notempty(duration)
| extend dependency_duration = iif(itemType == 'dependency',duration,todouble(''))
| extend _sum = dependency_duration
| extend _count = itemCount
| extend _sum = _sum*_count
| summarize sum(_sum)/sum(_count) by bin(timestamp, 1m)
| render timechart

服务器请求数 (requests/count)

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

requests
| summarize sum(itemCount) by bin(timestamp, 5m)
| render barchart

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

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

requests
| where notempty(duration)
| extend request_duration = iif(itemType == 'request', duration, todouble(''))
| extend _sum = request_duration
| extend _count = itemCount
| extend _sum = _sum*_count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 1m)
| render timechart

使用情况指标

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

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

pageViews
| where notempty(duration)
| extend pageView_duration = iif(itemType == 'pageView', duration, todouble(''))
| extend _sum = pageView_duration
| extend _count = itemCount
| extend _sum = _sum * _count
| summarize sum(_sum) / sum(_count) by bin(timestamp, 5m)
| render barchart

页面查看次数 (pageViews/count)

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

pageViews
| summarize sum(itemCount) by bin(timestamp, 1h)
| render barchart

会话数 (sessions/count)

此指标是指不同会话 ID 的计数。

union traces, requests, pageViews, dependencies, customEvents, availabilityResults, exceptions, customMetrics, browserTimings
| where notempty(session_Id)
| summarize dcount(session_Id) by bin(timestamp, 1h)
| render barchart

跟踪数 (traces/count)

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

traces
| summarize sum(itemCount) by bin(timestamp, 1h)
| render barchart

用户数 (users/count)

访问应用程序的不同用户的数目。 使用遥测采样和筛选可能会显著影响此指标的准确性。

union traces, requests, pageViews, dependencies, customEvents, availabilityResults, exceptions, customMetrics, browserTimings
| where notempty(user_Id)
| summarize dcount(user_Id) by bin(timestamp, 1h)
| render barchart

经过身份验证的用户数 (users/authenticated)

在应用程序中进行身份验证的不同用户的数目。

union traces, requests, pageViews, dependencies, customEvents, availabilityResults, exceptions, customMetrics, browserTimings
| where notempty(user_AuthenticatedId)
| summarize dcount(user_AuthenticatedId) by bin(timestamp, 1h)
| render barchart

使用 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。

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