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

Application Insights 中的遥测通道

遥测通道是 Application Insights SDK 不可或缺的组成部分。 它们可以管理缓冲以及将遥测数据传输到 Application Insights 服务的过程。 SDK 的 .NET 和 .NET Core 版本包含两个内置的遥测通道:InMemoryChannelServerTelemetryChannel。 本文将介绍每个通道,并演示如何自定义通道行为。

注意

我们建议新应用程序或客户使用 Azure Monitor OpenTelemetry 发行版来支持 Azure Monitor Application Insights。 Azure Monitor OpenTelemetry 发行版提供与 Application Insights SDK 类似的功能和体验。 可以使用 .NETNode.jsPython 的迁移指南从 Application Insights SDK 进行迁移,但我们仍在努力添加更多功能以实现后向兼容性。

什么是遥测通道?

遥测通道负责缓冲遥测项并将其发送到 Application Insights 服务,存储在该服务中的项可用于查询和分析。 遥测通道是实现 Microsoft.ApplicationInsights.ITelemetryChannel 接口的任何类。

遥测信道的 Send(ITelemetry item) 方法在调用所有遥测初始化器和遥测处理器之后被调用。 因此,遥测处理器删除的项都不会进入通道。 一般情况下,Send() 方法不会立即将项发送到后端。 它通常将这些项缓冲在内存中并分批发送,以提高传输效率。

除非立即发送缓冲的遥测数据至关重要,否则请避免调用 Flush() 。 仅在应用程序关闭、异常处理或使用短期进程(如后台作业或命令行工具)时使用。 在 Web 应用程序或长时间运行的服务中,SDK 会自动处理遥测发送。 不必要地调用 Flush() 可能会导致性能问题。

实时指标流还包含一个自定义通道用于支持遥测数据的实时流式传输。 此通道独立于常规的遥测通道,本文档对它不适用。

内置遥测通道

Application Insights .NET 和 .NET Core SDK 随附了两个内置通道:

  • InMemoryChannel:一个轻型通道,它在内存中将项缓冲到发送为止。 项在内存中缓冲,每隔 30 秒刷新一次,或者每当缓冲了 500 个项时刷新。 此通道提供最基本的可靠性保证,因为它在失败后不会重试发送遥测数据。 此通道也不会将项目存储在磁盘上。 因此,无论应用程序关闭是否正常,任何未发送的项都将永久丢失。 此通道实现 Flush() 方法,使用此方法可以强制同步刷新内存中的所有遥测项。 此通道非常适合用于短时间运行的、最好是进行同步刷新的应用程序。

    此通道随附在较大的 Microsoft.ApplicationInsights NuGet 包中,是未配置任何其他通道时,SDK 使用的默认通道。

  • ServerTelemetryChannel:一个更高级的通道,它具有重试策略,并可以在本地磁盘上存储数据。 如果发生暂时性错误,此通道会重试发送遥测数据。 在网络中断或者遥测量较高时,此通道还会使用本地磁盘存储将项保留在磁盘上。 由于这些重试机制和本地磁盘存储,我们认为此通道更可靠。 建议将其用于所有生产方案。 此通道是根据官方文档配置的 ASP.NETASP.NET Core 应用程序的默认通道。 此通道已针对长时间运行的服务器方案进行优化。 此通道实现的 Flush() 方法不是同步的。

    此通道作为 Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet 包交付,使用 Microsoft.ApplicationInsights.Web 或 Microsoft.ApplicationInsights.AspNetCore NuGet 包时可自动获取它。

配置遥测通道

您可以通过将遥测通道设置为当前的遥测配置来进行配置。 对于 ASP.NET 应用程序,配置过程涉及到将遥测通道实例设置为 TelemetryConfiguration.Active,或修改 ApplicationInsights.config。 对于 ASP.NET Core 应用程序,配置过程涉及到将通道添加到依赖项注入容器。

以下部分演示如何在各种应用程序类型中配置通道的 StorageFolder 设置。 StorageFolder 只是可配置的设置之一。 有关配置设置的完整列表,请参阅本文后面的通道中的可配置设置部分。

使用适用于 ASP.NET 应用程序的 ApplicationInsights.Config 进行配置

ApplicationInsights.config 中的以下节显示了在将 ServerTelemetryChannel 设置为自定义位置的情况下配置的 StorageFolder 通道:

    <TelemetrySinks>
        <Add Name="default">
            <TelemetryProcessors>
                <!-- Telemetry processors omitted for brevity  -->
            </TelemetryProcessors>
            <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
                <StorageFolder>d:\temp\applicationinsights</StorageFolder>
            </TelemetryChannel>
        </Add>
    </TelemetrySinks>

ASP.NET 应用程序代码中的配置

以下代码设置一个 ServerTelemetryChannel 实例,其中 StorageFolder 设置为自定义位置。 请将此代码添加到应用程序的开头,通常是添加到 Global.aspx.cs 中的 Application_Start() 方法内。

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
protected void Application_Start()
{
    var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
    serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
    TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
}

ASP.NET Core 应用程序代码中的配置

修改类 ConfigureServicesStartup.cs 方法,如下所示:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;

public void ConfigureServices(IServiceCollection services)
{
    // This sets up ServerTelemetryChannel with StorageFolder set to a custom location.
    services.AddSingleton(typeof(ITelemetryChannel), new ServerTelemetryChannel() {StorageFolder = @"d:\temp\applicationinsights" });

    services.AddApplicationInsightsTelemetry();
}

重要

ASP.NET Core 应用程序不支持使用 TelemetryConfiguration.Active 配置通道。

.NET/.NET Core 控制台应用程序代码中的配置

.NET 和 .NET Core 控制台应用的代码相同:

var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;

ServerTelemetryChannel 的操作详细信息

ServerTelemetryChannel 在内存中缓冲区内存储抵达的项。 每隔 30 秒或每当缓冲了 500 个项时,这些项将序列化、压缩并存储到 Transmission 实例中。 单个 Transmission 实例最多包含 500 个项,表示通过 Application Insights 服务的单个 HTTPS 调用发送的遥测数据批。

默认情况下,最多可以并行发送 10 个 Transmission 实例。 如果遥测数据以更快的速度抵达,或者网络或 Application Insights 后端速度缓慢,则 Transmission 实例将被存储到内存中。 此内存中 Transmission 缓冲区的默认容量为 5 MB。 超过内存中容量时,Transmission 实例将存储在本地磁盘上(不超过 50 MB)。

出现网络问题时,Transmission 实例也会存储在本地磁盘上。 当应用程序崩溃时,只有存储在本地磁盘中的项才能幸存。 应用程序每次再次启动时,都会发送数据。 如果网络问题仍然存在,ServerTelemetryChannel 将自动使用从 10 秒到 1 小时不等的指数退避逻辑,然后再次尝试发送遥测数据。

通道中的可配置设置

有关每个通道的可配置设置完整列表,请参阅:

下面是 ServerTelemetryChannel 的最常用设置:

  • MaxTransmissionBufferCapacity:用于在内存中缓冲传输内容的通道所用的内存量,以字节为单位。 达到此容量时,新项将直接存储到本地磁盘。 默认值为 5 MB。 设置更大的值可以减少磁盘用量,但请记住,如果应用程序崩溃,内存中的项将会丢失。
  • MaxTransmissionSenderCapacity:要同时发送到 Application Insights 的最大 Transmission 实例数量。 默认值为 10。 可将此设置配置为更大的数字,生成巨量的遥测数据时建议这样做。 当进行负载测试或关闭采样功能时,通常会出现高负载。
  • StorageFolder:磁盘上的文件夹,通道根据需要将项存储到其中。 在 Windows 中,如果未显式指定其他路径,则会使用 %LOCALAPPDATA% 或 %TEMP%。 在非 Windows 环境中,必须指定有效的位置,否则遥测数据不会存储到本地磁盘。

应使用哪个通道?

对于涉及到长时间运行的应用程序的大多数生产方案,建议使用 ServerTelemetryChannel。 有关刷新遥测的详细信息,请了解如何使用 Flush()

何时使用 Flush()

该方法 Flush() 会立即发送任何缓冲的遥测数据。 但是,它只应在特定方案中使用。

在以下情况下使用 Flush()

  • 应用程序即将关闭,并且你想要确保在退出之前发送遥测数据。
  • 你处于异常处理程序中,需要保证遥测数据得到传输。
  • 你正在编写一个短期的过程,例如快速退出的后台作业或 CLI 工具。

避免在长时间运行的应用程序(如 Web 服务)中使用 Flush() 。 SDK 会自动管理缓冲和传输。 不必要地调用 Flush() 可能会导致性能上的问题,并且无法保证所有数据都会被发送,尤其是在使用 ServerTelemetryChannel 时,因为它不会同步刷新。

开源 SDK

与 Application Insights 的每个 SDK 一样,通道也是开源的。 请在官方 GitHub 存储库中阅读和参与编写代码,或者报告问题。

后续步骤