排查无数据问题:适用于 .NET 和 .NET Core 的 Application Insights
本文提供故障排除信息,以帮助解决数据缺失或未在将 Application Insights 用于 .NET 和 .NET Core 时出现的问题。
备注
本文最近更新为使用术语 Azure Monitor 日志 而不是 Log Analytics。 日志数据仍存储在 Log Analytics 工作区中,并且仍由同一 Log Analytics 服务收集和分析。 我们正在更新术语,以更好地反映 Azure Monitor 中的日志角色。 有关详细信息,请参阅 Azure Monitor 术语更改。
方案示例:
在 Application Insights 中,我只看到应用生成的事件的一小部分
- 如果持续看到同一个部分,可能是由于自适应采样所导致。 若要确认此原因,请选择“概述>搜索”并查看请求或其他事件的实例。 若要查看完整的属性详细信息,请选择“属性”部分底部的省略号图标 (...) 。 如果请求计数大于 1,则采样处于运行中。
- 有可能你达到了定价计划的数据率限制。 系统每隔一分钟应用这些限制。
- 检查是否在遥测通道上遇到数据丢失。
- 检查 GitHub 存储库的遥测通道中是否存在任何已知问题。
备注
如果缺少数据,则后端可能会拒绝数据。 这种情况可能会因各种原因而发生,包括以下原因:
- 缺少必填字段。
- 一个或多个字段超出大小限制。
- SDK 以无提示方式失败,而不是引发异常。
可以使用 Fiddler 之类的工具,或任何其他将检查 HTTP 流量的工具来确认遥测上传是否成功。 后端将返回“200 正常”HTTP 状态代码以指示上传成功。 或者, 可以使用 SDK 日志 来查看后端是否拒绝数据。
当应用即将停止时,我在控制台应用或 Web 应用中遇到数据丢失
Application Insights SDK 收集的请求计数与应用程序的 IIS 日志计数不匹配
Internet Information Services (IIS) 记录到达 IIS 的所有请求的计数,并且本质上可能与到达应用程序的总请求不同。 由于此行为,不能保证 SDK 收集的请求计数将与 IIS 日志总数匹配。
方案示例:
我在 Web 服务器上安装了应用,现在我看不到其中的任何遥测数据。 它在开发计算机上正常工作
最有可能的原因是防火墙问题。 为 Application Insights 设置防火墙例外即可发送数据。
我在 Web 服务器上安装了 Azure Monitor Application Insights 代理来监视现有应用。 我看不到任何结果
请参阅排查状态监视器问题。
检查 TLS/SSL 客户端设置 (ASP.NET)
如果 ASP.NET 应用程序托管在虚拟机上的 Azure App 服务 或 IIS 中,应用程序可能无法连接到 Snapshot Debugger 服务,因为缺少 SSL 安全协议。
Snapshot Debugger 终结点需要 TLS 版本 1.2。 SSL 安全协议集是由 web.config 文件中元素的targetFramework
属性值<system.web>
启用<httpRuntime>
的怪癖之一。 如果目标框架为 4.5.2 或更低,则默认情况下不包含 TLS 1.2。
备注
元素 <httpRuntime>
的 targetFramework
属性值与生成应用程序时使用的目标框架无关。
若要检查设置,请打开 web.config 文件并找到该 <system.web>
部分。 确保 targetFramework
for <httpRuntime>
设置为 4.6 或更高版本。
<system.web>
...
<httpRuntime targetFramework="4.7.2" />
...
</system.web>
备注
<httpRuntime>
修改元素targetFramework
的值会更改应用于应用程序的运行时怪癖,并可能导致其他微妙的行为更改。 进行此更改后,请务必彻底测试应用程序。 有关兼容性更改的完整列表,请参阅重定目标更改。
如果目标框架为 4.7 或更高版本,Windows 将确定可用的协议。 Azure 应用程序服务中提供了 TLS 1.2。 但是,如果使用自己的虚拟机,可能需要在 OS 中启用 TLS 1.2。
FileNotFoundException:“无法加载文件或程序集 Microsoft.AspNet TelemetryCorrelation”
有关此错误的详细信息,请参阅 GitHub 问题 1610。
从低于版本 2.4 的 Application Insights SDK 升级时,请确保对 web.config 和 ApplicationInsights.config 文件应用了以下更改:
在 web.config 中,应该有两个 HTTP 模块,而不是一个。 对于某些场景,顺序很重要:
<system.webServer>
<modules>
<add name="TelemetryCorrelationHttpModule"
type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation"
preCondition="integratedMode,managedHandler" />
<add name="ApplicationInsightsHttpModule"
type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
preCondition="managedHandler" />
</modules>
</system.webServer>
在 ApplicationInsights.config 中,除了 RequestTrackingTelemetryModule
以下遥测模块外,还应具有以下遥测模块:
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web"/>
</TelemetryModules>
无法正确升级可能会导致未收集意外异常或遥测数据。
Visual Studio 中没有“添加 Application Insights”选项
示例方案:
在解决方案资源管理器中右键单击现有项目时,看不到任何 Application Insights 选项
- 这些工具不支持所有类型的 .NET 项目。 支持 Web 和 Windows Communication Foundation (WCF) 项目。 对于其他项目类型(如桌面或服务应用程序),仍 可手动将 Application Insights SDK 添加到项目。
- 请务必使用 Visual Studio 2013 Update 3 或更高版本。 该软件预装了开发人员分析工具,其中提供了 Application Insights SDK。
- 依次选择“工具”>“扩展和更新”。 然后检查是否已 安装并启用开发人员分析工具 。 如果已安装并已启用,请选择“更新”以查看是否有可用的更新。
- 打开“新建项目”对话框,然后选择 ASP.NET Web 应用程序。 如果看到 Application Insights 选项,则安装这些工具。 如果没有,请卸载并重新安装开发人员分析工具。
添加 Application Insights 失败
示例方案:
尝试将 Application Insights 添加到现有项目时,会看到错误消息
可能的原因:
- 与 Application Insights 门户的通信失败。
- Azure 帐户出现问题。
- 对于在其中创建新资源的订阅或组,只拥有读取访问权限。
解决方法:
示例方案:
在开发计算机上调试时,所有内容都生成正常,但生成服务器上出现 NuGet 错误
请参阅 NuGet 包还原和自动包还原。
缺少用于通过 Visual Studio 打开 Application Insights 的菜单命令
示例方案:
右键单击项目解决方案资源管理器时,看不到任何 Application Insights 命令,或者看不到“打开 Application Insights”命令
可能的原因:
- Application Insights 资源是手动创建的。
- 该项目的类型为 Application Insights 工具不支持的类型。
- 开发人员分析工具在 Visual Studio 实例中处于禁用状态。
- Visual Studio 的版本早于 Visual Studio 2013 Update 3。
解决方法:
- 确保 Visual Studio 版本为 Visual Studio 2013 Update 3 或更高版本。
- 依次选择“工具”>“扩展和更新”。 检查以确保 已安装并启用开发人员分析工具 。 如果已安装并已启用,请选择“更新”以查看是否有可用的更新。
- 在“解决方案资源管理器”中右键单击项目。 如果看到 Application Insights>配置 Application Insights 命令,请使用它将项目连接到 Application Insights 服务中的资源。
否则,Developer Analytics Tools 不会直接支持你的项目类型。 若要查看遥测数据,请登录到Azure 门户,搜索并选择 Application Insights,然后选择应用程序。
从 Visual Studio 打开 Application Insights 时出现“拒绝访问”
示例方案:
“打开 Application Insights”菜单命令将我转到Azure 门户,但出现“拒绝访问”错误
上一次在默认浏览器中使用的 Microsoft 登录名无权访问将 Application Insights 添加到此应用时所创建的资源。 有两个可能的原因:
原因 |
解决方案 |
有多个Microsoft帐户,可能是工作帐户和个人Microsoft帐户。 如果是这种情况,上次在默认浏览器中使用的登录与有权向 项目添加 Application Insights 的帐户不同。 |
选择浏览器窗口右上角的名称并注销。然后使用有权访问的帐户登录。 搜索并选择 Application Insights 并选择应用程序。 |
其他人向项目添加了 Application Insights,他们忘记了访问 在其中创建了它的资源组 。 |
如果他们使用了组织帐户,则可以将你添加到团队。 或者,他们可以授予你对资源组的单独访问权限。 |
从 Visual Studio 打开 Application Insights 时出现“找不到资产”
示例方案:
“打开 Application Insights”菜单命令将我转到Azure 门户,但出现“找不到资产”错误
有两个可能的原因:
- 已删除应用程序的 Application Insights 资源。
- 有人在 ApplicationInsights.config 中设置或更改了连接字符串,而无需更新项目文件。
ApplicationInsights.config 文件中的连接字符串控制遥测数据的发送位置。 项目文件中的某个行控制在 Visual Studio 中使用命令时打开哪个资源。
应用以下修复之一:
- 在解决方案资源管理器中,右键单击项目并选择 Application Insights>配置 Application Insights。 在对话框中,可以选择将遥测数据发送到现有资源或创建新资源。
- 直接打开资源。 登录到Azure 门户,搜索并选择 Application Insights,然后选择应用程序。
示例方案:
我已登录到 Azure 门户,将查看 Azure 主页仪表板。 但是,可以在哪里找到我的 Application Insights 数据?
示例方案:
我运行了应用,然后在 Microsoft Azure 中打开 Application Insights 服务,但所有图表都显示“了解如何收集”、“未配置”或仅页面视图和用户数据,但没有服务器数据
在 Visual Studio 中以调试模式运行应用程序 (F5)。 使用应用程序生成一些遥测数据。 检查是否可以在 Visual Studio 的“输出”窗口中看到记录的事件。
在 Application Insights 门户中,选择“ 概述>搜索”。 数据通常会先显示在此处。
选择“刷新”。 窗格会定期刷新自身,但你也可以手动执行此操作。 时间范围越大,刷新间隔就越长。
验证连接字符串是否匹配。 在 Application Insights 门户的应用的主窗格中,在 Essentials 下拉列表中 查看连接字符串。 然后,在 Visual Studio 的项目中,打开 ApplicationInsights.config 并查找 <ConnectionString>
元素。 检查两个字符串是否相等。 如果字符串不匹配,请执行下列操作之一:
环境 |
操作 |
Azure 门户 |
搜索并选择 Application Insights ,然后使用正确的字符串查找应用资源。 |
Visual Studio |
在 Visual Studio 解决方案资源管理器中,右键单击项目并选择 Application Insights>配置。 重置应用以将遥测数据发送到正确的资源。 |
如果找不到匹配的字符串,请检查以确保在 Visual Studio 中使用用于登录门户的相同登录凭据。
在Azure 门户中,搜索并选择“服务运行状况”。 如果地图有一些警报指示,请等待它们返回到运行状况。 然后关闭并重新打开 Application Insights 应用程序窗格。
是否针对服务器端 SDK 编写了可能更改 TelemetryClient
实例或 TelemetryContext
中的连接字符串的任何代码? 或者,是否编写了可能筛选掉过多内容的筛选或采样配置?
如果编辑了 ApplicationInsights.config,请仔细检查 TelemetryInitializers> 和 <TelemetryProcessors> 元素的配置<。 命名不当的类型或参数可能导致 SDK 不发送任何数据。
示例方案:
我在服务器响应时间和服务器请求图表中看到数据,但在页面视图加载时间或浏览器或使用情况窗格中没有数据
这些数据来自网页中的脚本。
- 如果将 Application Insights 添加到现有 Web 项目,则必须手动添加脚本。
- 确保 Internet Explorer 不是以兼容模式显示站点。
- 使用浏览器的调试功能(某些浏览器上的 F12,然后选择 “网络”)验证数据是否已发送到
dc.services.visualstudio.com
。
请参阅依赖项遥测和异常遥测。
“设置服务器”>下的以下环境提供了 CPU 和 I/O 速率等性能数据:
- 检查是否已将所有
Microsoft.ApplicationInsights
DLL 复制到服务器以及 Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.dll
。
- 在防火墙中,可能需要打开某些 TCP 端口。
- 如果必须使用代理从企业网络发送,请在 web.config 中设置 <defaultProxy> 元素。
在应用程序中启用 Application Insights SDK 可能会导致性能问题,例如 CPU 使用率高、内存泄漏、线程泄漏或 TCP 端口耗尽。 这些问题通常源自应用程序泄露 Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration
对象。 每个泄漏的实例都会创建两个额外的线程,这会导致进程线程计数随时间推移不断增加。 如果观察到越来越多的线程,则检查 TelemetryConfiguration 对象的泄漏至关重要。
TelemetryConfiguration 泄漏的常见原因
泄漏 TelemetryConfiguration
对象有两个主要原因:
代码中的显式创建:如果在TelemetryConfiguration
代码中创建对象,请确保不会无意中创建每个 Web 请求的对象。 请改用共享全局实例。 对于 .NET Framework 应用程序,请使用 TelemetryConfiguration.Active
.NET Framework 应用程序访问全局实例。 对于 .NET Core 应用程序,用于 TelemetryConfiguration.CreateDefault()
获取默认配置。
不正确的服务提供商使用:在 .NET Core 应用程序中,避免在内ConfigureServices
调用services.BuildServiceProvider()
。 BuildServiceProvider 方法创建一个新的服务提供程序,用于初始化和读取配置,每次都会生成一个新 TelemetryConfiguration
对象。 此类模式可能会导致泄漏,不建议这样做,如 Visual Studio 针对此编码做法的警告中所述。
是否达到了数据点的每月配额? 打开“设置>配额”和“定价”以了解。如果是这样,可以升级计划或支付更多容量的费用。 请参阅定价方案。
如果应用程序发送了大量数据,并且你正在使用 Application Insights SDK ASP.NET 版本 2.0.0-beta3 或更高版本,自适应 采样 功能可能会运行并仅发送遥测百分比。
可以禁用它,但我们不建议禁用它。 采样的设计目的是为了诊断目的正确传输相关遥测数据。
2018 年 2 月 5 日,我们宣布删除了客户端 IP 地址的日志记录。 此建议不会影响地理位置。
城市和国家/地区维度派生自 IP 地址,并且并不总是准确的。 首先针对位置处理这些 IP 地址,然后将其更改为 0.0.0.0 以进行存储。
在 Azure 云服务中运行时发生“找不到方法”异常
是否为 .NET 长期支持(LTS)而构建? 在 Azure 云服务角色中不会自动支持较早版本。 在运行应用之前,请在每个角色 上安装 LTS。
按照这些说明来捕获框架的故障排除日志。
修改 ApplicationInsights.config 文件以包含以下 XML 代码:
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.FileDiagnosticsTelemetryModule, Microsoft.ApplicationInsights">
<Severity>Verbose</Severity>
<LogFileName>mylog.txt</LogFileName>
<LogFilePath>C:\\SDKLOGS</LogFilePath>
</Add>
</TelemetryModules>
应用程序必须具有对配置位置的写入权限。
重启该过程,以便 SDK 选取这些新设置。
完成后还原这些更改。
安装 NuGet 中适用于 ASP.NET Core 的 Application Insights SDK NuGet 包。 安装的版本必须与当前安装的 Microsoft.ApplicationInsights
版本匹配。
最新版本 Microsoft.ApplicationInsights.AspNetCore
为 2.14.0,它引用 Microsoft.ApplicationInsights
版本 2.14.0。 因此,要安装的版本 Microsoft.ApplicationInsights.AspNetCore
应为 2.14.0。
ConfigureServices
修改Startup.cs类中的方法:
services.AddSingleton<ITelemetryModule, FileDiagnosticsTelemetryModule>();
services.ConfigureTelemetryModule<FileDiagnosticsTelemetryModule>( (module, options) => {
module.LogFilePath = "C:\\SDKLOGS";
module.LogFileName = "mylog.txt";
module.Severity = "Verbose";
} );
应用程序必须具有对配置位置的写入权限。
重启该过程,以便 SDK 选取这些新设置。
完成后还原这些更改。
PerfView 是一个免费工具,可帮助查明 CPU、内存和其他问题。
Application Insights SDK 日志 EventSource
具有可由 PerfView 捕获的自故障排除日志。
若要收集日志,请下载 PerfView 并运行以下命令:
PerfView.exe collect -MaxCollectSec:300 -NoGui /onlyProviders=*Microsoft-ApplicationInsights-Core,*Microsoft-ApplicationInsights-Data,*Microsoft-ApplicationInsights-WindowsServer-TelemetryChannel,*Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Dependency,*Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Web,*Microsoft-ApplicationInsights-Extensibility-DependencyCollector,*Microsoft-ApplicationInsights-Extensibility-HostingStartup,*Microsoft-ApplicationInsights-Extensibility-PerformanceCollector,*Microsoft-ApplicationInsights-Extensibility-EventCounterCollector,*Microsoft-ApplicationInsights-Extensibility-PerformanceCollector-QuickPulse,*Microsoft-ApplicationInsights-Extensibility-Web,*Microsoft-ApplicationInsights-Extensibility-WindowsServer,*Microsoft-ApplicationInsights-WindowsServer-Core,*Microsoft-ApplicationInsights-LoggerProvider,*Microsoft-ApplicationInsights-Extensibility-EventSourceListener,*Microsoft-ApplicationInsights-AspNetCore,*Redfield-Microsoft-ApplicationInsights-Core,*Redfield-Microsoft-ApplicationInsights-Data,*Redfield-Microsoft-ApplicationInsights-WindowsServer-TelemetryChannel,*Redfield-Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Dependency,*Redfield-Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Web,*Redfield-Microsoft-ApplicationInsights-Extensibility-DependencyCollector,*Redfield-Microsoft-ApplicationInsights-Extensibility-PerformanceCollector,*Redfield-Microsoft-ApplicationInsights-Extensibility-EventCounterCollector,*Redfield-Microsoft-ApplicationInsights-Extensibility-PerformanceCollector-QuickPulse,*Redfield-Microsoft-ApplicationInsights-Extensibility-Web,*Redfield-Microsoft-ApplicationInsights-Extensibility-WindowsServer,*Redfield-Microsoft-ApplicationInsights-LoggerProvider,*Redfield-Microsoft-ApplicationInsights-Extensibility-EventSourceListener,*Redfield-Microsoft-ApplicationInsights-AspNetCore
可根据需要修改这些参数:
参数 |
说明 |
MaxCollectSec |
设置此参数可防止 PerfView 无限期运行并影响服务器的性能。 |
OnlyProviders |
设置此参数可以仅从 SDK 收集日志。 可根据自己的具体调查自定义此列表。 |
NoGui |
设置此参数可以在不使用 GUI 的情况下收集日志。 |
有关详细信息,请参阅:
或者,可以使用跨平台 .NET Core 工具 dotnet-trace 收集日志,这些日志可提供进一步的故障排除帮助。 此工具可能对基于 Linux 的环境有所帮助。
安装 dotnet-trace
后,在 bash 中运行以下 dotnet-trace collect 命令:
dotnet-trace collect --process-id <PID> --providers Microsoft-ApplicationInsights-Core,Microsoft-ApplicationInsights-Data,Microsoft-ApplicationInsights-WindowsServer-TelemetryChannel,Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Dependency,Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Web,Microsoft-ApplicationInsights-Extensibility-DependencyCollector,Microsoft-ApplicationInsights-Extensibility-HostingStartup,Microsoft-ApplicationInsights-Extensibility-PerformanceCollector,Microsoft-ApplicationInsights-Extensibility-EventCounterCollector,Microsoft-ApplicationInsights-Extensibility-PerformanceCollector-QuickPulse,Microsoft-ApplicationInsights-Extensibility-Web,Microsoft-ApplicationInsights-Extensibility-WindowsServer,Microsoft-ApplicationInsights-WindowsServer-Core,Microsoft-ApplicationInsights-LoggerProvider,Microsoft-ApplicationInsights-Extensibility-EventSourceListener,Microsoft-ApplicationInsights-AspNetCore,Redfield-Microsoft-ApplicationInsights-Core,Redfield-Microsoft-ApplicationInsights-Data,Redfield-Microsoft-ApplicationInsights-WindowsServer-TelemetryChannel,Redfield-Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Dependency,Redfield-Microsoft-ApplicationInsights-Extensibility-AppMapCorrelation-Web,Redfield-Microsoft-ApplicationInsights-Extensibility-DependencyCollector,Redfield-Microsoft-ApplicationInsights-Extensibility-PerformanceCollector,Redfield-Microsoft-ApplicationInsights-Extensibility-EventCounterCollector,Redfield-Microsoft-ApplicationInsights-Extensibility-PerformanceCollector-QuickPulse,Redfield-Microsoft-ApplicationInsights-Extensibility-Web,Redfield-Microsoft-ApplicationInsights-Extensibility-WindowsServer,Redfield-Microsoft-ApplicationInsights-LoggerProvider,Redfield-Microsoft-ApplicationInsights-Extensibility-EventSourceListener,Redfield-Microsoft-ApplicationInsights-AspNetCore
若要删除 Visual Studio 中的 Application Insights,请遵循 Visual Studio 中删除 Application Insights 中提供的步骤。
请参阅 Application Insights 的 Microsoft Q&A 页。
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。