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

Application Insights 中的依赖项跟踪

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

注意

以下文档依赖于 Application Insights 经典 API。 Application Insights 的长期计划是使用 OpenTelemetry 收集数据。 有关详细信息,请参阅为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry

自动跟踪的依赖项

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

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

依赖项 详细信息
HTTP/HTTPS 本地或远程 HTTP/HTTPS 调用。
WCF 调用 仅当使用基于 HTTP 的绑定时,才会自动跟踪。
SQL 使用 SqlClient 发出的调用。 有关如何捕获 SQL 查询,请参阅使用高级 SQL 跟踪获取完整的 SQL 查询
Azure Blob 存储、表存储或队列存储 使用 Azure 存储客户端发出的调用。
Azure 事件中心客户端 SDK 使用最新的包:https://nuget.org/packages/Azure.Messaging.EventHubs
Azure 服务总线客户端 SDK 使用最新的包:https://nuget.org/packages/Azure.Messaging.ServiceBus
Azure Cosmos DB 使用 HTTP/HTTPS 时会自动跟踪。 使用 TCP 直接模式的操作的跟踪也将使用预览包 >= 3.33.0-preview 进行自动捕获。 有关更多详细信息,请访问文档

如果缺少某个依赖项,或使用其他 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。 对于早于 2.22.0-Beta1 的 SDK 版本,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 应用程序,请按照适用于 ASP.NET Core 应用程序的 Application Insights 中的说明操作。

跟踪来自网页的 AJAX 调用

对于网页,Application Insights JavaScript SDK 会自动收集 AJAX 调用作为依赖项。

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

注意

Azure Functions 需要使用单独的设置来启用 SQL 文本收集。 有关详细信息,请参阅启用 SQL 查询收集

对于 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 虚拟机、本地计算机等) 使用 Microsoft.Data.SqlClient NuGet 包或使用 Application Insights 代理 PowerShell 模块安装检测引擎并重启 IIS。
Azure 云服务 添加启动任务以安装 StatusMonitor
应通过为 ASP.NETASP.NET Core 应用程序安装 NuGet 包,在生成时将应用加入 ApplicationInsights SDK。
IIS Express 使用 Microsoft.Data.SqlClient NuGet 包。
Azure 应用服务中的 WebJobs 使用 Microsoft.Data.SqlClient NuGet 包。

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

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

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

在何处查找依赖项数据

诊断慢速请求

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

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

选择左侧的“性能”选项卡,然后选择顶部的“依赖项”选项卡。

在“整体”下选择某个依赖项名称。 选择一个依赖项后,右侧会显示该依赖项的持续时间分布图。

Screenshot that shows the Dependencies tab open to select a Dependency Name in the chart.

选择右下角的“示例”按钮。 然后选择一个示例以查看端到端事务详细信息。

Screenshot that shows selecting a sample to see the end-to-end transaction details.

分析实时站点

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

失败的请求

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

选择左侧的“失败”选项卡,然后选择顶部的“依赖项”选项卡。

Screenshot that shows selecting the failed requests chart.

在此处可以看到失败的依赖项计数。 若要获取有关失败项的详细信息,请在底部的表中选择一个依赖项名称。 选择右下方的“依赖项”按钮以查看端到端事务详细信息。

日志(分析)

可以跟踪 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 不报告 ExceptionTelemetryApplication Insights 遥测数据模型中介绍了依赖项的完整数据模型。

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

请使用此代码:

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

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

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

Application Insights 中的依赖项跟踪是否包括日志记录响应正文?

Application Insights 中的依赖项跟踪不包括日志记录响应正文,因为它会为大多数应用程序生成过多的遥测数据。

开源 SDK

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

依赖项自动收集

下面是当前支持的依赖项调用的列表,系统会自动将其检测为依赖项,不需对应用程序的代码进行额外的修改。 这些依赖项在 Application Insights 的应用程序映射事务诊断视图中可视化。 如果依赖项不在下面的列表中,仍可通过跟踪依赖项调用手动跟踪它。

.NET

应用框架 版本
ASP.NET Webforms 4.5+
ASP.NET MVC 4+
ASP.NET WebAPI 4.5+
ASP.NET Core 1.1+
通信库
HttpClient 4.5+、.NET Core 1.1+
SqlClient .NET Core 1.0+、NuGet 4.3.0
Microsoft.Data.SqlClient 1.1.0 - 最新稳定版本。 (请参阅下面的说明。)
事件中心客户端 SDK 1.1.0
ServiceBus 客户端 SDK 7.0.0
存储客户端
ADO.NET 4.5+

注意

早期版本的 Microsoft.Data.SqlClient 存在一个已知问题。 建议使用 1.1.0 或更高版本来缓解此问题。 Entity Framework Core 不一定随附 Microsoft.Data.SqlClient 的最新稳定版本,因此我们建议你确认所使用的最低版本是 1.1.0 版本以避免此问题。

Java

请参阅 Application Insights Java 自动收集依赖项的列表。

Node.js

最新当前支持的模块列表将在此处维护。

Javascript

通信库 版本
XMLHttpRequest 全部

后续步骤