在 Azure Application Insights 中跟踪依赖项

依赖项是由应用程序调用的组件。 它通常是使用 HTTP、数据库或文件系统调用的服务。 Application Insights 可以度量依赖项调用的持续时间、调用结果是否失败,以及依赖项名称等附加信息。 可以调查特定的依赖项调用,并将其与请求和异常相关联。

自动跟踪的依赖项

适用于 .NET 和 .NET Core 的 Application Insights SDK 随附了 DependencyTrackingTelemetryModule:一个自动收集依赖项的遥测模块。 根据链接的官方文档进行配置后,将自动为 ASP.NETASP.NET Core 应用程序启用此依赖项收集功能。DependencyTrackingTelemetryModule 作为 NuGet 包附送,使用 NuGet 包 Microsoft.ApplicationInsights.WebMicrosoft.ApplicationInsights.AspNetCore 时会自动打开它。

DependencyTrackingTelemetryModule 目前会自动跟踪以下依赖项:

依赖项 详细信息
Http/Https 本地或远程 http/https 调用
WCF 调用 仅当使用基于 Http 的绑定时,才会自动跟踪。
SQL 使用 SqlClient 发出的调用。 请参阅此文来捕获 SQL 查询。
Azure 存储(Blob、表、队列) 使用 Azure 存储客户端发出的调用。
事件中心客户端 SDK 1.1.0 和更高版本。
ServiceBus 客户端 SDK 3.0.0 和更高版本。
Azure Cosmos DB 仅当使用 HTTP/HTTPS 时,才会自动跟踪。 Application Insights 不会捕获 TCP 模式。

如果缺少某个依赖项,或使用其他 SDK,请确保它在自动收集的依赖项列表中。 如果依赖项不是自动收集的,仍可通过跟踪依赖项调用手动跟踪它。

在控制台应用中设置自动依赖项跟踪

要从 .NET 控制台应用自动跟踪依赖项,请安装 NuGet 包 Microsoft.ApplicationInsights.DependencyCollector,并按如下所示初始化 DependencyTrackingTelemetryModule

    DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule();
    depModule.Initialize(TelemetryConfiguration.Active);

对于 .NET Core 控制台应用,TelemetryConfiguration.Active 已过时。 请参阅辅助角色服务文档ASP.NET Core 监视文档中的指南

自动依赖项监视的工作原理

使用以下方法之一自动收集依赖项:

  • 围绕 select 方法使用字节代码检测。 (StatusMonitor 或 Azure Web 应用扩展中的 InstrumentationEngine)
  • EventSource 回调
  • 最新 .NET/.NET Core SDK 中的 DiagnosticSource 回调

手动跟踪依赖项

下面是不会自动收集的一些依赖项示例,需要手动跟踪它们。

  • 仅当使用 HTTP/HTTPS 时,才会自动跟踪 Azure Cosmos DB。 Application Insights 不会捕获 TCP 模式。
  • Redis

对于 SDK 不会自动收集的依赖项,可以通过标准自动收集模块使用的 TrackDependency API 手动跟踪它们。

例如,如果使用未自行编写的程序集生成代码,可以对其所有调用进行计时,以了解它对响应时间所做的贡献。 若要使此数据显示在 Application Insights 中的依赖项图表中,请使用 TrackDependency 发送它。


    var startTime = DateTime.UtcNow;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    try
    {
        // making dependency call
        success = dependency.Call();
    }
    finally
    {
        timer.Stop();
        telemetryClient.TrackDependency("myDependencyType", "myDependencyCall", "myDependencyData",  startTime, timer.Elapsed, success);
    }

或者,可以使用 TelemetryClient 提供的扩展方法 StartOperationStopOperation 来手动跟踪依赖项,如此处所示

若要关闭标准依赖项跟踪模块,请在 ASP.NET 应用程序的 ApplicationInsights.config 中删除对 DependencyTrackingTelemetryModule 的引用。 对于 ASP.NET Core 应用程序,请遵照此处的说明操作。

跟踪来自网页的 AJAX 调用

对于网页,Application Insights JavaScript SDK 以依赖项的形式自动收集 AJAX 调用。

使用高级 SQL 跟踪获取完整的 SQL 查询

备注

Azure Functions 需要单独的设置才能启用 SQL 文本收集:在 host.json 中,在 applicationInsights 中设置 "EnableDependencyTracking": true,"DependencyTrackingOptions": { "enableSqlCommandTextInstrumentation": true }

对于 SQL 调用,始终会收集服务器和数据库的名称,并将其存储为收集的 DependencyTelemetry 的名称。 有一个名为“data”的附加字段,其中可以包含完整的 SQL 查询文本。

对于 ASP.NET Core 应用程序,现在需要通过使用以下命令来选择加入 SQL 文本收集

services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, o) => { module. EnableSqlCommandTextInstrumentation = true; });

对于 ASP.NET 应用程序,完整 SQL 查询文本是在字节代码检测的帮助下收集的,这需要使用检测引擎,或者使用 Microsoft.Data.SqlClient NuGet 包而不是 System.Data.SqlClient 库。 下面介绍了启用完整 SQL 查询集合的平台特定步骤:

平台 获取完整 SQL 查询所要执行的步骤
Azure Web 应用 在 Web 应用控制面板中,打开“Application Insights”边栏选项卡并启用“.NET”下的“SQL 命令”
IIS 服务器(Azure VM、本地服务器,等等。) 使用 Microsoft.Data.SqlClient NuGet 包或使用状态监视器 PowerShell 模块安装检测引擎并重启 IIS。
Azure 云服务 添加启动任务以安装 StatusMonitor
应通过为 ASP.NETASP.NET Core 应用程序安装 NuGet 包,在生成应用时将其加入 ApplicationInsights SDK
IIS Express 使用 Microsoft.Data.SqlClient NuGet 包。
Azure Web 作业 使用 Microsoft.Data.SqlClient NuGet 包。

除了上述平台特定的步骤之外,还必须通过使用以下命令修改 applicationInsights.config 文件来显式选择启用 SQL 命令集合:

<TelemetryModules>
  <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
    <EnableSqlCommandTextInstrumentation>true</EnableSqlCommandTextInstrumentation>
  </Add>

在上述情况下,验证是否已正确安装该检测引擎的适当方法是验证收集的 DependencyTelemetry 的 SDK 版本是否为“rddp”。 “rdddsd”或“rddf”表示依赖项是通过 DiagnosticSource 或 EventSource 回调收集的,因此不会捕获完整的 SQL 查询。

在何处查找依赖项数据

诊断慢速请求

每个请求事件都与应用处理请求时跟踪的依赖项调用、异常和其他事件相关联。 因此,如果某些请求的执行状态不佳,可以判断其原因是否为某个依赖项的响应速度缓慢。

从发往依赖项的请求开始跟踪

打开“性能”选项卡,导航到顶部的操作旁边的“依赖项”选项卡。

单击整个选项卡下面的某个 依赖项名称。 选择一个依赖项后,右侧会显示该依赖项的持续时间分布图。

在“性能”选项卡中,单击顶部的“依赖项”选项卡,然后单击图表中的某个依赖项名称

单击右下方的蓝色“示例”按钮,然后单击某个示例以查看端到端的事务详细信息。

单击示例查看端到端的事务详细信息

分析实时站点

不知道时间花到哪去了? Application Insights 探查器将跟踪对实时站点的 HTTP 调用,并显示代码中有哪些函数花费了最长的时间。

失败的请求

失败的请求还可能与依赖项的失败调用相关联。

我们可以转到左侧的“失败”选项卡,然后单击顶部的“依赖项”选项卡。

单击失败的请求图表

在此处可以查看失败的依赖项计数。 若要获取有关某个失败依赖项的更多详细信息,请尝试单击底部表中的依赖项名称。 可以单击右下方的蓝色“依赖项”按钮获取端到端的事务详细信息。

日志(分析)

可以跟踪 Kusto 查询语言中的依赖项。 下面是一些示例。

  • 查找所有失败的依赖项调用:

    dependencies | where success != "True" | take 10
  • 查找 AJAX 调用:

    dependencies | where client_Type == "Browser" | take 10
  • 查找与请求关联的依赖项调用:

    dependencies
    | where timestamp > ago(1d) and  client_Type != "Browser"
    | join (requests | where timestamp > ago(1d))
      on operation_Id  
  • 查找与页面视图关联的 AJAX 调用:

    dependencies
    | where timestamp > ago(1d) and  client_Type == "Browser"
    | join (browserTimings | where timestamp > ago(1d))
      on operation_Id

常见问题

自动依赖项收集器如何报告依赖项的失败调用?

  • 失败依赖项调用的“success”字段设置为 False。 DependencyTrackingTelemetryModule 不会报告 ExceptionTelemetry此处介绍了依赖项的完整数据模型。

如何计算依赖项遥测的引入延迟?

dependencies
| extend E2EIngestionLatency = ingestion_time() - timestamp 
| extend TimeIngested = ingestion_time()

如何确定启动依赖项调用的时间?

在 Log Analytics“查询”视图中,timestamp 表示启动 TrackDependency() 调用的时刻,该时刻是在收到依赖项调用响应后立即发生的。 若要计算依赖项调用的开始时间,需要获取 timestamp,然后减去记录的依赖项调用的 duration

开源 SDK

与每个 Application Insights SDK 一样,依赖项收集模块也是开源的。 请在官方 GitHub 存储库中阅读和贡献代码,或者报告问题。

后续步骤