使用 Application Insights 调查故障、性能和事务

Application Insights 从应用程序收集遥测数据,以帮助诊断故障并分析事务处理速度缓慢的原因。 它包括四个基本工具:

  • 故障视图 - 跟踪错误、异常和故障,提供快速解决问题和增强稳定性的清晰见解。

  • 性能视图 - 通过显示响应时间和作计数快速识别和帮助解决应用程序瓶颈。

  • 搜索视图 - 允许用户查找和检查各个遥测项,例如页面视图、异常和自定义事件。

  • 事务诊断 - 通过全面深入了解端到端事务详细信息,帮助快速识别组件中的问题。

这些工具共同确保 Web 应用程序的持续运行状况和效率。 你可以使用它们来确定对用户影响最大的问题或增强功能。

若要访问 Application Insights 中的“失败”视图,请在“概述”窗格上选择“失败的请求”图,或在资源菜单中的“调查”类别下选择“失败”。

显示如何在 Application Insights 中访问“失败”视图的屏幕截图。

也可以通过选择资源,然后从会审部分选择调查故障,从应用程序映射进入故障视图。

注释

可以通过其他三种体验中的任何一种访问 事务诊断 。 有关详细信息,请参阅 分析遥测数据。

概述

“失败”视图显示了您应用程序中所有失败操作的列表,并提供深入查看每个操作的选项。 它允许你查看其频率和受影响的用户数,以帮助你将精力集中在影响最大的问题上。

显示 Application Insights 中的“失败”视图的屏幕截图。

注释

除了 Azure Monitor OpenTelemetry 发行版或 JavaScript SDK 发送的默认遥测之外,您可以添加和修改遥测(例如,自定义事件)。

有关详细信息,请参阅 添加和修改适用于 .NET、Java、Node.js和 Python 应用程序的 Azure Monitor OpenTelemetry。

筛选遥测数据

默认筛选器

所有体验都允许按时间范围筛选遥测数据。 此外,每个体验都有其自己的默认筛选器:

可以从“ 角色筛选器” 菜单中选择要查看的服务(云角色名称)或计算机/容器(云角色实例)。 此操作允许在应用程序的特定部分识别问题或性能趋势。

若要了解如何设置云角色名称和云角色实例,请参阅配置 Azure Monitor OpenTelemetry。

添加筛选器

可以按事件的属性值筛选事件。 可用属性取决于所选的事件或遥测类型。 添加过滤器:

  1. 选择 “筛选器”图标 以添加筛选器。

    筛选药丸

  2. 从左侧下拉列表中选择一个属性。

  3. 在中心下拉列表中,选择以下运算符之一:=、!=、或containsnot contains。

  4. 从右侧下拉列表中,选择要筛选的所有属性值。

    注释

    请注意,筛选器值右侧的计数显示当前筛选集合中出现了多少项。

  5. 若要添加另一个筛选器,请再次选择 “筛选器”图标 。

搜索遥测

可以使用操作列表上方的 “搜索以筛选项目...” 字段来搜索特定操作。

显示“搜索”字段的屏幕截图。

使用分析数据

Application Insights 收集的所有数据都存储在 Log Analytics 中。 它提供丰富的查询语言,用于分析生成正在调查的异常的请求。

小窍门

Log Analytics 中的简单模式提供直观的点键界面,用于分析和可视化日志数据。

  1. 在性能视图、故障视图或搜索视图中,选择顶部导航栏中的在日志中查看,并从下拉菜单中选择一个查询。

    顶部作栏的屏幕截图,其中突出显示了“在日志中查看”按钮。

  2. 此作会将你转到 “日志 ”视图,可以在其中进一步修改查询或从边栏中选择其他查询。

    显示“日志”视图的屏幕截图。

调查遥测

若要调查错误或异常的根本原因,可以深入分析问题操作,以获取包含依赖项和异常详细信息的详细端到端事务视图。

  1. 选择一个操作以查看该操作的前 3 个响应代码、前 3 个异常类型和前 3 个失败的依赖项。

  2. 在“深入钻取”下,选择带有经过筛选的结果数量的按钮,查看示例操作列表。

  3. 选择一个示例作以打开 端到端事务详细信息 视图。

    屏幕截图:显示“故障”视图,其中的“深入钻取”按钮高亮显示。

    注释

    推荐样本包含来自所有组件的相关遥测数据,即使其中有的组件启用了采样。

    小窍门

    如果您在失败时需要调用堆栈,请在 端到端事务详细信息 或 异常 选项卡中打开相关异常。仅当为该操作捕获异常遥测时,才会显示堆栈跟踪。

分析客户端性能和故障

如果将 Application Insights 集成到您的网页中,则可以获取关于页面视图、浏览器操作和依赖项的洞察。 收集此浏览器数据需要 向网页添加脚本。

  1. 添加脚本后,可以通过选择“性能”或“失败”视图上的“浏览器”开关来访问页面视图及其关联的性能指标。

    突出显示顶部作栏下方的“服务器/浏览器”切换的屏幕截图。

    此视图从浏览器的角度提供应用程序的各种遥测数据的直观摘要。

    小窍门

    对于单页应用程序(SPA),请启用 enableAutoRouteTracking 路由更改,以便每个逻辑页创建自己的页面视图和操作。 否则,多个路由更改可以与单个操作相关联,某些页面视图持续时间可以显示为 0。

  2. 对于浏览器操作,端到端事务详细信息视图显示客户端请求页面的页面视图属性,包括浏览器的类型及其位置。 此信息可以帮助确定是否存在与特定类型的客户端相关的性能问题。

    显示“端到端事务详细信息”视图的屏幕截图,其中突出显示了“页面视图属性”部分。

注释

与为服务器性能收集的数据一样,Application Insights 使所有客户端数据都可用于使用日志进行深入分析。

交易诊断体验

事务诊断体验(也称为端到端事务详细信息视图)显示事务的甘特图,其中列出了所有事件及其持续时间和响应代码。

此诊断体验会自动将所有 Application Insights 监视组件中的服务器端遥测数据关联到单个视图中,并支持多个资源。 Application Insights 可检测基础关系,并可用于轻松诊断导致事务缓慢或失败的应用程序组件、依赖项或异常。

选择特定事件可显示其属性,包括基础命令或调用堆栈等其他信息。

此视图有四个关键部分:

显示事务视图的屏幕截图,其中突出显示了结果列表。

此可折叠窗格会显示符合筛选条件的其他结果。 选择任何结果以更新前三个部分的相应详细信息。 我们试图找到可以从所有组件中获得详细信息的样本,即使在其中任何一个组件中已启用采样功能。 这些示例显示为建议。

版本注释

版本注释会标记 Application Insights 图表上的部署和其他重要事件,这样更改就会与性能、故障和使用情况相关联。

使用内联脚本在管道中配置注释

如果不使用上一部分中的任务,请在部署阶段添加内联脚本。

  1. 打开现有管道或创建新管道,然后在“阶段”下选择任务。

  2. 添加新的 Azure CLI 任务。

  3. 选择 Azure 订阅。 将“脚本类型”设置为“PowerShell”,将“脚本位置”设置为“内联”。

  4. 通过使用 Azure CLI 创建版本注释中的步骤 2 将 PowerShell 脚本添加到“内联脚本”。

  5. 添加脚本参数。 替换尖括号中的占位符。

    -aiResourceId "<aiResourceId>" `
    -releaseName "<releaseName>" `
    -releaseProperties @{"ReleaseDescription"="<a description>";
        "TriggerBy"="<Your name>" }
    

    以下示例显示了可以使用 build 和 release 变量在可选的 releaseProperties 参数中设置的元数据。 选择“保存”。

    -releaseProperties @{
    "BuildNumber"="$(Build.BuildNumber)";
    "BuildRepositoryName"="$(Build.Repository.Name)";
    "BuildRepositoryProvider"="$(Build.Repository.Provider)";
    "ReleaseDefinitionName"="$(Build.DefinitionName)";
    "ReleaseDescription"="Triggered by $(Build.DefinitionName) $(Build.BuildNumber)";
    "ReleaseEnvironmentName"="$(Release.EnvironmentName)";
    "ReleaseId"="$(Release.ReleaseId)";
    "ReleaseName"="$(Release.ReleaseName)";
    "ReleaseRequestedFor"="$(Release.RequestedFor)";
    "ReleaseWebUrl"="$(Release.ReleaseWebUrl)";
    "SourceBranch"="$(Build.SourceBranch)";
    "TeamFoundationCollectionUri"="$(System.TeamFoundationCollectionUri)" }
    

使用 Azure CLI 创建发布注释

使用以下 PowerShell 脚本从任何进程创建版本注释,而无需使用 Azure DevOps。

  1. 登录 Azure CLI。

  2. 将以下脚本另存为 CreateReleaseAnnotation.ps1。

    param(
        [parameter(Mandatory = $true)][string]$aiResourceId,
        [parameter(Mandatory = $true)][string]$releaseName,
        [parameter(Mandatory = $false)]$releaseProperties = @()
    )
    
    # Function to ensure all Unicode characters in a JSON string are properly escaped
    function Convert-UnicodeToEscapeHex {
      param (
        [parameter(Mandatory = $true)][string]$JsonString
      )
      $JsonObject = ConvertFrom-Json -InputObject $JsonString
      foreach ($property in $JsonObject.PSObject.Properties) {
        $name = $property.Name
        $value = $property.Value
        if ($value -is [string]) {
          $value = [regex]::Unescape($value)
          $OutputString = ""
          foreach ($char in $value.ToCharArray()) {
            $dec = [int]$char
            if ($dec -gt 127) {
              $hex = [convert]::ToString($dec, 16)
              $hex = $hex.PadLeft(4, '0')
              $OutputString += "\u$hex"
            }
            else {
              $OutputString += $char
            }
          }
          $JsonObject.$name = $OutputString
        }
      }
      return ConvertTo-Json -InputObject $JsonObject -Compress
    }
    
    $annotation = @{
        Id = [GUID]::NewGuid();
        AnnotationName = $releaseName;
        EventTime = (Get-Date).ToUniversalTime().GetDateTimeFormats("s")[0];
        Category = "Deployment"; #Application Insights only displays annotations from the "Deployment" Category
        Properties = ConvertTo-Json $releaseProperties -Compress
    }
    
    $annotation = ConvertTo-Json $annotation -Compress
    $annotation = Convert-UnicodeToEscapeHex -JsonString $annotation
    
    $accessToken = (az account get-access-token | ConvertFrom-Json).accessToken
    $headers = @{
        "Authorization" = "Bearer $accessToken"
        "Accept"        = "application/json"
        "Content-Type"  = "application/json"
    }
    $params = @{
        Headers = $headers
        Method  = "Put"
        Uri     = "https://management.chinacloudapi.cn$($aiResourceId)/Annotations?api-version=2015-05-01"
        Body    = $annotation
    }
    Invoke-RestMethod @params
    

注释

将“类别”设置为“部署”,否则“注释”不会显示在 Azure 门户中。

调用脚本并传递参数的值。 -releaseProperties 参数是可选的。

.\CreateReleaseAnnotation.ps1 `
 -aiResourceId "<aiResourceId>" `
 -releaseName "<releaseName>" `
 -releaseProperties @{"ReleaseDescription"="<a description>";
     "TriggerBy"="<Your name>" }
论点 Definition 注释
aiResourceId 目标 Application Insights 资源的资源 ID。 示例: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MyRGName/providers/microsoft.insights/components/MyResourceName
releaseName 新版本注释的名称。
releaseProperties 要附加到注释的自定义元数据。 可选

查看批注

注释

版本注释在“指标”窗格中不可用。

Application Insights 在以下体验中显示版本注释:

批注将可视化为图表顶部的标记。

带有批注的异常图表的屏幕截图。

要在工作簿中启用注释,请打开“高级设置”,然后选择“显示注释”。 选择任何注释标记可打开发布详细信息,例如请求者、源代码管理分支、发布管道和环境。

常见问题

本部分提供常见问题的解答。

搜索视图

什么是组件?

组件是分布式或微服务应用程序的可独立部署的部件。 开发人员和运营团队对这些应用程序组件生成的遥测具有代码级可见性或访问权限。

  • 组件不同于“观察到的”外部依赖项,例如 SQL 和事件中心,你的团队或组织可能无权访问这些依赖项(代码或遥测)。
  • 组件在任意数目的服务器、角色或容器实例上运行。
  • 即使订阅不同,组件也可以是单独的 Application Insights 连接字符串。 组件也可以充当向单一 Application Insights 连接字符串报告的不同角色。 新体验显示了所有组件的详细信息,而不论其设置方式。

保留多少数据?

请参阅限制摘要。


如何在服务器请求中查看 POST 数据?

我们不会自动记录 POST 数据。 如果需要捕获请求正文详细信息,并避免收集敏感数据,请仔细使用应用程序日志记录。


为什么 Azure 函数搜索不返回任何结果?

Azure Functions 不会记录 URL 查询字符串。

交易事务诊断

为什么在图表上看到单个组件和其他组件仅显示为外部依赖项,而不显示任何详细信息?

可能的原因:

  • 是否使用 Application Insights 检测了其他组件?
  • 是否使用了最新的稳定 Application Insights SDK?
  • 如果这些组件是单独的 Application Insights 资源,验证你是否具有访问权限。 如果确实具有访问权限,并且组件使用最新的 Application Insights 软件开发工具包(SDK)进行检测,请通过右上角的反馈通道告知我们。

我看到依赖项的重复行。此行为是否预期?

当前,出站依赖项调用与入站请求分开显示。 通常情况下,这两种调用大致相同,但持续时间值因网络往返而不同。 可通过前导图标和样式不同的持续时间条来区分它们。 这份数据演示文稿是否包含令人困惑的内容? 欢迎提供反馈!


不同组件实例的时钟偏差如何?

在事务图中针对时钟偏差调整了时间线。 可以在详细信息窗格中查看确切的时间戳,或使用 Log Analytics 进行查看。


为什么新体验缺少大部分相关项查询?

此行为是设计造成的。 所有组件中的所有相关项都已在左侧顶部和底部部分中提供。 在新的体验中,有两个左侧没有覆盖的相关项目:事件发生前后五分钟内的所有遥测数据以及用户活动时间线。


使用 Application Insights JavaScript SDK 时,是否可以减少查看每个事务的事件?

事务诊断体验显示共享操作 ID 的单个操作中的所有遥测数据。 默认情况下,Application Insights SDK for JavaScript 为每个唯一的页面视图创建一个新操作。 在单页应用程序(SPA)中,只创建一个页面视图事件,且单个操作 ID 用于生成的所有遥测数据。 这会导致许多事件与相同操作相关联。

在这些情况下,可以使用自动路由跟踪来自动创建新操作,以便在 SPA 中进行导航。 必须启用 enableAutoRouteTracking ,以便系统在每次更新 URL 路由时创建页面视图(逻辑页面视图发生)。 若要手动刷新操作 ID,请调用 appInsights.properties.context.telemetryTrace.traceID = Microsoft.ApplicationInsights.Telemetry.Util.generateW3CId()。 手动触发 PageView 事件还将重置操作 ID。


为什么事务详细信息持续时间不加到最高请求持续时间?

甘特图中未说明的时间是跟踪的依赖项未涵盖的时间。 此问题可能是由于外部调用未进行自动或手动检测而导致的。 出现这种情况也可能是因为所花费的时间是在处理过程中,而非由于外部调用。

如果所有调用都进行了检测,那么处理过程可能是耗时的根本原因。 .NET Profiler 是用于诊断进程的有用工具。


如果在 Azure 门户中导航 Application Insights 时看到消息“检索数据时出错”,该怎么办?

此错误表示浏览器无法调用所需的 API 或 API 返回了失败响应。 若要解决此问题,请打开浏览器 InPrivate 窗口并禁用正在运行的任何浏览器扩展,然后确定是否仍可以重现门户行为。 如果门户错误仍然存在,请尝试与其他浏览器或其他计算机进行测试,调查来自 API 调用失败的客户端计算机的域名系统(DNS)或其他网络相关问题。 如果门户错误仍然存在,则在重现意外行为时 收集浏览器网络跟踪 。 然后从 Azure 门户打开支持案例。

后续步骤