排查无数据问题:适用于 .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,则采样处于运行中。
- 有可能你达到了定价计划的数据率限制。 系统每隔一分钟应用这些限制。
我随机遇到数据丢失
注意
如果缺少数据,则后端可能会拒绝数据。 这种情况可能会因各种原因而发生,包括以下原因:
- 缺少必填字段。
- 一个或多个字段超出大小限制。
- SDK 以无提示方式失败,而不是引发异常。
可以使用 Fiddler 之类的工具,或任何其他将检查 HTTP 流量的工具来确认遥测上传是否成功。 后端将返回“200 正常”HTTP 状态代码以指示上传成功。 或者, 可以使用 SDK 日志 来查看后端是否拒绝数据。
当应用即将停止时,我在控制台应用或 Web 应用中遇到数据丢失
- SDK 通道将遥测数据保存在缓冲区中,并分批发送。 如果应用程序正在关闭,你可能需要显式调用 Flush()。 该
Flush()
行为取决于使用的实际 通道 。 - 根据 .NET Core/.NET Framework 控制台应用程序,控制台应用中需要显式调用后跟
Flush()
睡眠。
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 帐户出现问题。
- 对于在其中创建新资源的订阅或组,只拥有读取访问权限。
解决方法:
- 检查是否为正确的 Azure 帐户提供了登录凭据。
- 在浏览器中,检查是否可以访问 Azure 门户。 打开 “设置” ,看看是否有任何限制。
- 将 Application Insights 添加到现有项目。 在解决方案资源管理器中,右键单击项目并选择“添加 Application Insights”。
我的生成服务器上缺少“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 数据?
- 搜索并选择 Application Insights,然后选择应用程序。 如果未看到任何项目,则需要在 Web 项目中添加或配置 Application Insights。 可以浏览显示更多详细信息的摘要图表。
- 在 Visual Studio 中,调试应用时,选择 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 速率等性能数据:
- Java Web 服务
- Windows 桌面应用
- IIS Web 应用和服务 (如果安装 Application Insights 代理)
- Azure 云服务
将应用发布到服务器后未看到(服务器)数据
- 检查是否已将所有
Microsoft.ApplicationInsights
DLL 复制到服务器以及Microsoft.Diagnostics.Instrumentation.Extensions.Intercept.dll
。 - 在防火墙中,可能需要打开某些 TCP 端口。
- 如果必须使用代理从企业网络发送,请在 web.config 中设置 <defaultProxy> 元素。
启用 Application Insights 时的性能影响
在应用程序中启用 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 或更高版本,自适应 采样 功能可能会运行并仅发送遥测百分比。
可以禁用它,但我们不建议禁用它。 采样的设计目的是为了诊断目的正确传输相关遥测数据。
客户端 IP 地址为 0.0.0.0
2018 年 2 月 5 日,我们宣布删除了客户端 IP 地址的日志记录。 此建议不会影响地理位置。
注意
如果需要 IP 地址的前三个 八进制数,可以使用遥测初始值设定项 添加自定义属性。 此问题不会影响 2018 年 2 月 5 日之前收集的数据。
用户遥测数据包含错误的地理数据
城市和国家/地区维度派生自 IP 地址,并且并不总是准确的。 首先针对位置处理这些 IP 地址,然后将其更改为 0.0.0.0 以进行存储。
在 Azure 云服务中运行时发生“找不到方法”异常
是否为 .NET 长期支持(LTS)而构建? 在 Azure 云服务角色中不会自动支持较早版本。 在运行应用之前,请在每个角色 上安装 LTS。
排查日志问题
按照这些说明来捕获框架的故障排除日志。
.NET Framework
注意
从版本 2.14 开始, 不再需要 Microsoft.AspNet.ApplicationInsights.HostingStartup 包。 SDK 日志现在使用 Microsoft.ApplicationInsights 包收集。 不需要其他包。
修改 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 选取这些新设置。
完成后还原这些更改。
.NET Core
安装 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 收集日志
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 的情况下收集日志。 |
有关详细信息,请参阅:
使用 dotnet-trace 收集日志
或者,可以使用跨平台 .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
删除 Application Insights
若要删除 Visual Studio 中的 Application Insights,请遵循 Visual Studio 中删除 Application Insights 中提供的步骤。
它仍然不起作用
请参阅 Application Insights 的 Microsoft Q&A 页。
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。