Application Insights 中的依赖项跟踪
注意
以下文档依赖于 Application Insights 经典 API。 Application Insights 的长期计划是使用 OpenTelemetry 收集数据。 有关详细信息,请参阅为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry 和我们的 OpenTelemetry 路线图。 迁移指导适用于 .NET、Node.js 和 Python。
依赖项是由应用程序调用的组件。 它通常是使用 HTTP、数据库或文件系统调用的服务。 Application Insights 可以度量依赖项调用的持续时间、调用结果是否失败,以及依赖项名称等信息。 可以调查特定的依赖项调用,并将其与请求和异常相关联。
自动跟踪的依赖项
适用于 .NET 和 .NET Core 的 Application Insights SDK 随附了 DependencyTrackingTelemetryModule
:一个自动收集依赖项的遥测模块。 根据链接的官方文档进行配置时,ASP.NET 和 ASP.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
提供的扩展方法 StartOperation
和 StopOperation
来手动跟踪依赖项,如传出的依赖项跟踪中所示。
若要关闭标准依赖项跟踪模块,请在 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.NET 或 ASP.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
。 使用 rdddsd
或 rddf
表示依赖项是通过 DiagnosticSource
或 EventSource
回调收集的,因此不会捕获完整的 SQL 查询。
在何处查找依赖项数据
- 应用程序地图直观显示应用与相邻组件之间的依赖关系。
- 事务诊断显示统一的关联服务器数据。
- “浏览器”选项卡显示从用户浏览器发出的 AJAX 调用。
- 选择缓慢或失败的请求可以检查其依赖项调用。
- Analytics 可用于查询依赖性数据。
诊断慢速请求
每个请求事件都与处理请求时跟踪的依赖项调用、异常和其他事件相关联。 因此,如果某些请求的执行状态不佳,可以判断其原因是否为某个依赖项的响应速度缓慢。
从发往依赖项的请求开始跟踪
选择左侧的性能选项卡,然后选择顶部的依赖项选项卡。
在“整体”下选择某个依赖项名称。 选择一个依赖项后,会显示该依赖项的持续时间分布图。
选择右下角的“示例”按钮。 然后选择一个示例以查看端到端事务详细信息。
分析实时站点
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
。 Application 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 | 全部 |
后续步骤
- 异常
- 用户和页面数据
- 可用性
- 为 Java 设置自定义依赖项跟踪。
- 为 OpenCensus Python 设置自定义依赖项跟踪。
- 编写自定义依赖项遥测
- 有关 Application Insights 的类型和数据模型,请参阅数据模型。
- 查看 Application Insights 支持的平台。