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

在 Application Insights 中采样

采样是 Application Insights 中的一项功能。 建议将它用于降低遥测流量、数据成本和存储成本,同时保留采用统计方式的应用程序数据的正确分析。 采样还有助于避免 Application Insights 限制遥测。 采样筛选器会选择相关项,以便可以在执行诊断调查时在不同项之间导航。

当指标计数显示在门户中时,它们会重新规范化以考虑到采样。 这样可以尽量减轻对统计的影响。

注意

  • 如果你已采用 OpenTelemetry 发行版并正在寻找配置选项,请参阅启用采样

注意

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

采样配置选项的屏幕截图。

简短摘要

  • 有三种不同类型的采样:自适应采样、固定速率采样和引入采样。
  • 默认情况下,已在所有最新版本的 Application Insights ASP.NET、ASP.NET Core 软件开发工具包 (SDK) 和 Azure Functions 中启用自适应采样。
  • 固定速率采样可在最新版本的用于 ASP.NET、ASP.NET Core、Java(代理和 SDK)、JavaScript 和 Python 的 Application Insights SDK 中使用。
  • 在 Java 中,可以使用采样替代,当需要对所选依赖项、请求和运行状况检查应用不同的采样率时,采样替代非常有用。 采样替代功能可用于在实现某个目的(例如,让所有重要错误都保持在 100%)的同时排除一些干扰性依赖项。 此行为是一种固定采样形式,使你能够精细地控制遥测。
  • 引入采样适用于 Application Insights 服务终结点。 仅当没有其他采样生效时,才能应用引入采样。 如果 SDK 为遥测数据采样,则会禁用引入采样。
  • 对于 Web 应用程序,如果记录自定义事件,并需要确保事件集一同保留或一同丢弃,则事件必须具有相同的 OperationId 值。
  • 如果要编写分析查询,应考虑采样。 特别是,应使用 summarize sum(itemCount),而不是仅对记录进行计数。
  • 某些遥测类型(包括性能指标和自定义指标)始终会保留,而不管是否启用采样。

下表汇总了适用于每个 SDK 和应用程序类型的采样类型:

Application Insights SDK 支持自适应采样 支持固定速率采样 支持引入采样
ASP.NET 是(默认已启用) 仅当没有其他采样生效时
ASP.NET Core 是(默认已启用) 仅当没有其他采样生效时
Azure Functions 是(默认已启用) 仅当没有其他采样生效时
Java 仅当没有其他采样生效时
JavaScript 仅当没有其他采样生效时
Node.JS 仅当没有其他采样生效时
Python 仅当没有其他采样生效时
所有其他 No

注意

  • 将遥测发送到 Application Insights 时,Java 应用程序代理 3.4.0 及更高版本使用速率限制采样作为默认值。 有关详细信息,请参阅速率限制采样
  • 本页中的大部分信息适用于最新版本的 Application Insights SDK。 有关旧版 SDK 的信息,请参阅旧 SDK 版本

何时使用采样

一般情况下,对于大多数小型和中型应用程序,不需要采样。 通过收集所有用户活动的数据,获取最有用的诊断信息和最准确的统计。

采样的主要优势在于:

  • 当应用以短时间间隔发送速率较高的遥测时,Application Insights 服务会删除(“限制”)数据点。 采样可以减少应用程序遭到限制的可能性。
  • 保持在定价层的数据点配额以内。
  • 减少遥测集合中的网络流量。

采样的工作原理

采样算法将决定要保留或删除的遥测项,无论是通过 SDK 还是 Application Insights 服务进行采样。 它遵循规则来保持所有相关数据点的完整性,确保 Application Insights 提供可操作且可靠的诊断体验,即使数据较少。 例如,如果样本包含失败的请求,它会保留所有相关的遥测项,例如异常和跟踪。 这样,当你在 Application Insights 中查看请求详细信息时,始终会看到该请求及其关联的遥测数据。

采样决定取决于请求的操作 ID,这意味着属于特定操作的所有遥测项不是被保留就是被删除。 对于未设置操作 ID 的遥测项(例如,异步线程报告的且没有 HTTP 上下文的遥测项),采样仅捕获每个类型的遥测项百分比。

当遥测发回给用户时,Application Insights 服务会以收集时所使用的同一采样百分比来调整指标,以补偿缺失的数据点。 因此,当用户在 Application Insights 中查看遥测数据,会看到统计的正确近似值接近于实际值。

近似值的准确性很大程度上取决于配置的采样百分比。 此外,对于处理来自大量用户的类似请求的较大量的应用程序,准确性也会提升。 相反,对于不处理大量负载的应用程序,不需要采样,因为这些应用程序通常可以发送其所有遥测的同时保持在配额以内,而不会因限制而造成数据丢失。

采样类型

有三种不同的采样方法:

  • 自适应采样自动调整从 ASP.NET/ASP.NET Core 应用中的 SDK 以及从 Azure Functions 发送的遥测量。 这是使用 ASP.NET 或 ASP.NET Core SDK 时的默认采样。 自适应采样目前仅适用于 ASP.NET/ASP.NET Core 服务器端遥测,以及 Azure Functions。

  • 固定速率采样会减少从 ASP.NET、ASP.NET Core 或 Java 服务器和用户浏览器发送的遥测量。 用户设定速率。 客户端和服务器将同步其采样,以便在“搜索”中可以在多个相关页面视图和请求之间导航。

  • 引入采样在 Application Insights 服务终结点上发生。 它会以设置的采样率丢弃一些来自应用的遥测数据。 它不会减少应用发送的遥测流量,但可帮助保持在每月配额内。 引入采样的大优点是,无需重新部署应用就可设置它。 引入采样统一适用于所有服务器和客户端,但在运行任何其他类型的采样时,不会应用引入采样。

重要

如果为遥测类型启用了自适应或固定速率采样方法,则将对该遥测禁用引入采样。 但是,从 SDK 级别的采样中排除的遥测类型仍会按门户中设置的速率进行引入采样。

自适应采样

自适应采样会影响从 Web 服务器应用发送至 Application Insights 服务终结点的遥测量。

提示

使用 ASP.NET SDK 或 ASP.NET Core SDK 时,默认会启用自适应采样,并且默认会为 Azure Functions 启用它。

遥测量会自动调整,以保持在 MaxTelemetryItemsPerSecond 速率限制范围内。 如果应用程序生成的遥测数据较少(例如在调试期间或使用率较低期间),只要遥测量保持在 MaxTelemetryItemsPerSecond 以下,它就不会删除项。 随着遥测量的增加,它会调整采样率以达到目标遥测量。 此调整会定期重新计算,计算依据是传出的传输速率的移动平均线。

为了实现目标量,一些生成的遥测会被丢弃。 但与其他类型的采样一样,该算法会保留相关的遥测项。 例如,在“搜索”中检查遥测数据时,可以查找与特定异常相关的请求。

诸如请求速率和异常率等指标计数将进行调整以补偿采样率,以便它们在指标资源管理器中能够显示近似值。

为 ASP.NET 应用程序配置自适应采样

注意

本部分适用于 ASP.NET 应用程序,而不适用于 ASP.NET Core 应用程序。 稍后在本文档中了解如何为 ASP.NET Core 应用程序配置自适应采样。

ApplicationInsights.config 中,可以在 AdaptiveSamplingTelemetryProcessor 节点中调整多个参数。 显示的数字是默认值:

  • <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>

    自适应算法旨在收集每个服务器主机上的逻辑操作的目标速率。 如果在多台主机上运行 Web 应用,应减小此值以保留在 Application Insights 门户的目标流量速率以内。

  • <EvaluationInterval>00:00:15</EvaluationInterval>

    会重新评估当前遥测速率的间隔。 评估以移动平均线形式进行执行。 可能想要缩短此间隔(如果遥测很容易就激增)。

  • <SamplingPercentageDecreaseTimeout>00:02:00</SamplingPercentageDecreaseTimeout>

    当采样百分比值发生变化时,它将决定我们多快可以再次降低采样百分比以捕获更少数据。

  • <SamplingPercentageIncreaseTimeout>00:15:00</SamplingPercentageIncreaseTimeout>

    当采样百分比值发生变化时,它将决定我们多久可以再次增加采样百分比以捕获更多数据。

  • <MinSamplingPercentage>0.1</MinSamplingPercentage>

    随着采样百分比的变化,我们可以设置的最小值是多少?

  • <MaxSamplingPercentage>100.0</MaxSamplingPercentage>

    随着采样百分比的变化,我们可以设置的最大值是多少?

  • <MovingAverageRatio>0.25</MovingAverageRatio>

    在移动平均的计算中,此值指定要分配给最新值的权重。 使用等于或小于 1 的值。 较小的值会使算法不易受突然的更改影响。

  • <InitialSamplingPercentage>100</InitialSamplingPercentage>

    应用启动时要采样的遥测量。 在调试时请不要减小此值。

  • <ExcludedTypes>type;type</ExcludedTypes>

    不要采样的类型的分号分隔列表。 识别的类型为:DependencyEventExceptionPageViewRequestTrace。 将传输指定类型的所有遥测;将对未指定的类型采样。

  • <IncludedTypes>type;type</IncludedTypes>

    要采样的类型的分号分隔列表。 识别的类型为:DependencyEventExceptionPageViewRequestTrace。 对指定的类型采样;始终会传输其他类型的所有遥测。

若要关闭自适应采样,请从 ApplicationInsights.config 中删除 AdaptiveSamplingTelemetryProcessor 节点。

替换项:在代码中配置自适应采样

除了在 .config 文件中设置采样参数以外,还可以编程方式设置这些值。

  1. .config 文件中删除所有 AdaptiveSamplingTelemetryProcessor 节点。

  2. 使用以下代码片段来配置自适应采样:

    using Microsoft.ApplicationInsights;
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.WindowsServer.Channel.Implementation;
    using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
    
    // ...
    
    var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
    // For older versions of the Application Insights SDK, use the following line instead:
    // var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
    
    // Enable AdaptiveSampling so as to keep overall telemetry volume to 5 items per second.
    builder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5);
    
    // If you have other telemetry processors:
    builder.Use((next) => new AnotherProcessor(next));
    
    builder.Build();
    

    了解遥测处理器。)

也可以单独调整每个遥测类型的采样率,甚至可以完全排除特定类型的采取:

// The following configures adaptive sampling with 5 items per second, and also excludes Dependency telemetry from being subjected to sampling.
builder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Dependency");

为 ASP.NET Core 应用程序配置自适应采样

ASP.NET Core 应用程序可以在代码中或通过 appsettings.json 文件进行配置。 有关详细信息,请参阅 ASP.NET Core 中的配置

默认情况下会为所有 ASP.NET Core 应用程序启用自适应采样。 你可以禁用或自定义采样行为。

禁用自适应采样

添加 Application Insights 服务时,可以禁用默认采样功能。

Program.cs 文件中的 WebApplication.CreateBuilder() 方法后面添加 ApplicationInsightsServiceOptions

var builder = WebApplication.CreateBuilder(args);

var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();
aiOptions.EnableAdaptiveSampling = false;
builder.Services.AddApplicationInsightsTelemetry(aiOptions);

var app = builder.Build();

以上代码会禁用自适应采样。 可以执行以下步骤使用更多自定义选项来添加采样。

配置采样设置

使用以下 TelemetryProcessorChainBuilder 扩展方法来自定义采样行为。

重要

如果使用此方法配置采样,请确保在调用 AddApplicationInsightsTelemetry() 时将 aiOptions.EnableAdaptiveSampling 属性设置为 false。 进行此更改后,你需要严格按照以下代码块中的说明操作,以便使用准备好的自定义项重新启用自适应采样。 否则,可能会导致数据引入过量。 始终测试更改后的采样设置,并设置相应的每日数据上限,以帮助控制成本。

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.ApplicationInsights.Extensibility;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
{
   var telemetryProcessorChainBuilder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;

   // Using adaptive sampling
   telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond: 5);

   // Alternately, the following configures adaptive sampling with 5 items per second, and also excludes DependencyTelemetry from being subject to sampling:
   // telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Dependency");

   telemetryProcessorChainBuilder.Build();
});

builder.Services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
{
   EnableAdaptiveSampling = false,
});

var app = builder.Build();

可以使用 SamplingPercentageEstimatorSettings 类自定义其他采样设置:

using Microsoft.ApplicationInsights.WindowsServer.Channel.Implementation;

telemetryProcessorChainBuilder.UseAdaptiveSampling(new SamplingPercentageEstimatorSettings
{
     MinSamplingPercentage = 0.01,
     MaxSamplingPercentage = 100,
     MaxTelemetryItemsPerSecond = 5
 }, null, excludedTypes: "Dependency"); 

为 Azure Functions 配置自适应采样

按照此页中的说明,为 Azure Functions 中运行的应用配置自适应采样。

固定速率采样

固定速率采样会减少从 Web 服务器和 Web 浏览器发送的流量。 与自适应采样不同,它会按用户确定的固定速率来降低遥测。 固定速率采样适用于 ASP.NET、ASP.NET Core、Java 和 Python 应用程序。

与其他方法一样,此方法也会保留相关的项。 它还会同步客户端和服务器采样,以便保留相关项。 例如,当你在搜索中查看页面视图时,可以找到其相关的服务器请求。

在指标资源管理器中,诸如请求和异常计数等速率将乘以某个系数来补偿采样率,从而使其尽可能准确。

为 ASP.NET 应用程序配置固定速率采样

  1. 禁用自适应采样:在 ApplicationInsights.config 中,删除或注释掉 AdaptiveSamplingTelemetryProcessor 节点

    <TelemetryProcessors>
        <!-- Disabled adaptive sampling:
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
            <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
        </Add>
        -->
    
  2. 启用固定速率采样模块。 将以下代码片段添加到 ApplicationInsights.config

    在此示例中,SamplingPercentage 为 20,因此将对所有项的 20% 进行采样。 指标资源管理器中的值将乘以 (100/20) = 5 进行补偿。

    <TelemetryProcessors>
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.SamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
            <!-- Set a percentage close to 100/N where N is an integer. -->
            <!-- E.g. 50 (=100/2), 33.33 (=100/3), 25 (=100/4), 20, 1 (=100/100), 0.1 (=100/1000) -->
            <SamplingPercentage>20</SamplingPercentage>
        </Add>
    </TelemetryProcessors>
    

    如果不在 ApplicationInsights.config 文件中设置采样参数,可以编程方式设置这些值:

    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
    
    // ...
    
    var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
    // For older versions of the Application Insights SDK, use the following line instead:
    // var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
    
    builder.UseSampling(10.0); // percentage
    
    // If you have other telemetry processors:
    builder.Use((next) => new AnotherProcessor(next));
    
    builder.Build();
    

    了解遥测处理器。)

为 ASP.NET Core 应用程序配置固定速率采样

  1. 禁用自适应采样

    可以在 WebApplication.CreateBuilder() 方法后使用 ApplicationInsightsServiceOptions 进行更改:

    var builder = WebApplication.CreateBuilder(args);
    
    var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();
    aiOptions.EnableAdaptiveSampling = false;
    builder.Services.AddApplicationInsightsTelemetry(aiOptions);
    
    var app = builder.Build();
    
  2. 启用固定速率采样模块

    可以在 WebApplication.CreateBuilder() 方法后进行更改:

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
    {
        var builder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
    
        // Using fixed rate sampling
        double fixedSamplingPercentage = 10;
        builder.UseSampling(fixedSamplingPercentage);
        builder.Build();
    });
    
    builder.Services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
    {
        EnableAdaptiveSampling = false,
    });
    
    var app = builder.Build(); 
    

为 Java 应用程序配置采样替代和固定速率采样

默认情况下,在 Java 自动检测和 SDK 中不启用任何采样。 目前支持 Java 自动检测、采样替代和固定速率采样。 Java 不支持自适应采样。

配置 Java 自动检测

  • 若要配置替代默认采样率并将不同采样率应用于选定请求和依赖项的采样替代,请使用采样替代指南
  • 若要配置适用于所有遥测的固定速率采样,请使用固定速率采样指南

注意

对于采样百分比,请选择一个接近于 100/N 的百分比,其中 N 是整数。 当前采样不支持其他值。

为 OpenCensus Python 应用程序配置固定速率采样

使用最新的 OpenCensus Azure Monitor 导出程序检测应用程序。

注意

固定速率采样不适用于指标导出程序。 这意味着,自定义指标是唯一不能配置采样的遥测类型。 指标导出程序将发送它跟踪的所有遥测数据。

用于跟踪的固定速率采样

可以在 Tracer 配置中指定 sampler。 如果未提供显式采样器,则默认使用 ProbabilitySamplerProbabilitySampler 将使用默认采样率 1/10000。这意味着,每 10,000 个请求中就会有一个发送到 Application Insights。 如需指定采样率,请参阅以下详细信息。

若要指定采样率,请确保 Tracer 指定的采样器使用的采样率为 0.0 到 1.0(含)。 采样率 1.0 代表 100%,这意味着所有请求都会作为遥测数据发送到 Application Insights。

tracer = Tracer(
    exporter=AzureExporter(
        instrumentation_key='00000000-0000-0000-0000-000000000000',
    ),
    sampler=ProbabilitySampler(1.0),
)

日志的固定速率采样

可以通过修改 logging_sampling_rate 可选参数,为 AzureLogHandler 配置固定速率采样。 如果未提供参数,将使用采样率 1.0。 采样率 1.0 代表 100%,这意味着所有请求都会作为遥测数据发送到 Application Insights。

handler = AzureLogHandler(
    instrumentation_key='00000000-0000-0000-0000-000000000000',
    logging_sampling_rate=0.5,
)

为包含 JavaScript 的网页配置固定速率采样

可将基于 JavaScript 的网页配置为使用 Application Insights。 遥测数据是从用户浏览器中运行的客户端应用程序发送的,可在任何服务器中托管页面。

为 Application Insights 配置基于 JavaScript 的网页时,请修改从 Application Insights 门户获取的 JavaScript 代码片段。

提示

在包含 JavaScript 的 ASP.NET 应用中,该代码片段通常放在 _Layout.cshtml 中。

在检测密钥前插入类似于 samplingPercentage: 10, 的行:

<script>
    var appInsights = // ... 
    ({ 
      // Value must be 100/N where N is an integer.
      // Valid examples: 50, 25, 20, 10, 5, 1, 0.1, ...
      samplingPercentage: 10, 

      instrumentationKey: ...
    }); 

    window.appInsights = appInsights; 
    appInsights.trackPageView(); 
</script>

注意

对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

对于采样百分比,请选择一个接近于 100/N 的百分比,其中 N 是整数。 当前采样不支持其他值。

协调服务器端和客户端采样

客户端 JavaScript SDK 与服务器端 SDK 一同参与固定速率采样。 检测的页面仅从服务器端 SDK 决定“纳入采样”的相同用户发送客户端遥测数据。 此逻辑旨在维持跨客户端和服务器端应用程序的用户会话的完整性。 因此,通过 Application Insights 中的任何特定遥测项,可以找到此用户或会话的所有其他遥测项;在搜索中,可以在相关页面视图与请求之间导航。

如果客户端和服务器端遥测不显示协调的样本:

  • 确认是否已同时在服务器和客户端上启用采样。
  • 检查在客户端和服务器上设置的采样百分比相同。
  • 确保 SDK 版本是 2.0 或更高版本。

引入采样

当来自 Web 服务器、浏览器和设备的遥测数据抵达 Application Insights 服务终结点时,将运行引入采样。 尽管它未减少从应用发送的遥测流量,但它确实减少了由 Application Insights 处理和保留(并收费)的遥测量。

如果应用经常超过其每月配额,且没有使用任一种基于 SDK 的采样类型的选项,请使用此种类型的采样。

在“使用情况和预估成本”页面中设置采样率:

在应用程序的“概述”窗格中,选择“设置”、“配额”、“示例”,选择采样率,然后选择“更新”。

与其他类型的采样一样,该算法会保留相关的遥测项。 例如,在“搜索”中检查遥测数据时,可以查找与特定异常相关的请求。 诸如请求速率和异常率等指标计数会正确保留。

采样会丢弃某些数据点,这会使其在任何 Application Insights 功能(如连续导出)中都不可用。

引入采样不适用于自适应或固定速率采样。 自适应采样会通过 Azure 应用服务中的 ASP.NET SDK、ASP.NET Core SDK 或 Application Insights 代理自动激活。 当 Application Insights 服务终结点接收遥测数据并检测到采样率低于 100%(表示主动采样)时,它会忽略任何设置的引入采样率。

警告

门户磁贴上显示的值表示为引入采样设置的值。 如果任何类型的 SDK 采样(自适应采样或固定速率采样)正在运行,则此值不表示实际采样率。

应该使用哪种类型的采样?

在以下情况下使用引入采样:

  • 经常用完每月遥测配额。
  • 收到来自用户 Web 浏览器的大量遥测数据。
  • 使用的 SDK 版本不支持采样,例如版本早于 2.0 的 ASP.NET 版本。

在以下情况下使用固定速率采样:

  • 需要在客户端和服务器之间进行同步采样才能在相关事件之间进行导航。 例如,调查事件时“搜索”中的页面浏览量和 HTTP 请求。
  • 对应用的适当采样百分比有信心。 它应该足够高以获取准确指标,但应低于超出定价配额和限制的速率。

使用自适应采样:

如果使用其他采样格式的条件不适用,我们建议使用自适应采样。 ASP.NET/ASP.NET Core SDK 中默认已启用此设置。 只有在达到特定的最低速率时,它才会减少流量,因此,可能根本不会对使用率较低的站点采样。

了解采样是否正在运行

使用 Analytics 查询查找采样率。

union requests,dependencies,pageViews,browserTimings,exceptions,traces
| where timestamp > ago(1d)
| summarize RetainedPercentage = 100/avg(itemCount) by bin(timestamp, 1h), itemType

如果你发现任何类型的 RetainedPercentage 小于 100,则表示正在对该类型的遥测数据采样。

重要

Application Insights 不会在任何采样方法中对会话、指标(包括自定义指标)或性能计数器遥测类型采样。 这些类型始终会排除在采样之外,因为精度下降可能会给这些遥测类型造成很大的不利。

日志查询准确度和高采样率

随着应用程序的纵向扩展,它可能需要每秒处理数十、数百甚至数千个工作项。 为每个工作项记录一个事件既不能保持资源效益,也不符合成本效益。 Application Insights 使用采样来灵活适应不断增长的遥测数据量,以及控制资源用量和成本。

警告

如果分布式操作中的任一应用程序已启用采样,则分布式操作的端到端视图完整性可能会受到影响。 每个应用程序在分布式操作中做出不同的采样决策,因此某个操作 ID 的遥测数据可能由某个应用程序保存,而其他应用程序可能决定不对同一操作 ID 的遥测数据进行采样。

随着采样率的增大,基于日志的查询准确度将会降低并且会被夸大。 它只会在启用采样并且采样率处于较高范围 (~ 60%) 时影响基于日志的查询的准确度。 影响程度因遥测类型、每个操作的遥测计数以及其他因素而异。

SDK 使用预先聚合的指标来解决采样引起的问题。 有关这些指标的详细信息,请参阅 Azure Application Insights - Azure Monitor | Microsoft Docs。SDK 标识记录的数据的相关属性,并在采样之前提取统计信息。 为了最大限度地减少资源使用和成本,指标会被聚合。 此过程每分钟生成一些指标遥测项,而不是数千个事件遥测项。 例如,这些指标可能会向 MDM 帐户报告“此 Web 应用程序处理了 25 个请求”,发送的请求遥测记录中的 itemCount 为 100。 这些预先聚合的指标提供准确的数字,即使在采样影响基于日志的查询结果时也可靠。 可以在 Application Insights 门户的“指标”窗格中查看这些指标。

常见问题

采样是否会影响警报的准确性?

  • 是的。 警报只能基于采样数据触发。 主动筛选可能会导致警报未按预期触发。

注意

采样不适用于指标,但指标可以从采样数据中派生。 这样,采样可能会间接影响警报的准确性。

ASP.NET 和 ASP.NET Core SDK 中的默认采样行为是什么?

  • 如果使用上述 SDK 的某个最新版本,则默认会启用自适应采样:每秒采样 5 个遥测项。 默认情况下,系统添加两个 AdaptiveSamplingTelemetryProcessor 节点:一个在采样中包含 Event 类型,另一个不包含。 此配置将遥测限制为五个 Event 类型项和五个所有其他类型组合的项,确保 Events 与其他遥测类型分开采样。

使用本页前面部分中的示例可以更改此默认行为。

是否可以对遥测数据进行多次采样?

  • 否。 如果项已采样,则 SamplingTelemetryProcessor 将不考虑项的采样。 对于引入采样也是如此,对于已在 SDK 本身中采样的项,它不会应用采样。

为何不采样简单“收集每个遥测类型 %X”?

  • 虽然此采样方法提供极高精度的指标近似值,但它会破坏每个用户、会话和请求关联诊断数据的能力,而这对于诊断而言很关键。 因此,对于“收集 X% 应用用户的所有遥测项”或“收集 X% 应用请求的所有遥测数据”等策略,采样的效果更佳。对于与请求不关联的遥测项(如后台异步处理),回退为“收集每个遥测类型 %X 的所有项”。

采样百分比是否随时间变化?

  • 是,自适应采样会根据当前观察到的遥测量,逐渐更改采样百分比。

如果我使用固定速率采样,如何知道哪一个才样百分比最适合我的应用?

  • 一种方法是从自适应采样开始,了解应用选定的速率(请参阅上述问题),然后使用该速率切换到固定速率采样。

    否则,就必须猜测。 分析 Application Insights 中当前遥测使用量、观察出现的任何限制,并估计所收集的遥测量。 这三个输入以及所选的定价层暗示你可能想要减少收集的遥测的数量。 但是,用户数量的增加或遥测量中的某些其他变化可能导致估计无效。

如果我配置的采样百分比过低,会发生什么情况?

  • 当 Application Insights 尝试补偿数据量减少的数据可视化效果时,过低的采样百分比会导致过度采样,并降低近似值的准确性。 此外,诊断体验可能会受到负面影响,因此可能会采样某些很少出现的请求或缓慢请求。

如果我配置的采样百分比过高,会发生什么情况?

  • 将配置过高的采样百分比(力度不够)会导致收集的遥测量减少不够。 仍可能会遇到与限制相关的遥测数据丢失,而使用 Application Insights 的成本可能因过高费用而超出预算。

如果同时配置 IncludedTypes 和 ExcludedTypes 设置,会发生什么情况?

  • 最好不要在配置中同时设置 ExcludedTypesIncludedTypes,以防止任何冲突并确保遥测收集设置明确。
  • 即使在 IncludedTypes 设置中同时设置了 ExcludedTypes 中所列出的遥测类型,也会将其排除。 ExcludedTypes 优先于 IncludedTypes。

可以在哪些平台上使用采样?

  • 如果 SDK 未执行采样,则对于过于特定量的任何遥测,自动运行引入采样。 例如,如果使用旧版 ASP.NET SDK 或 Java SDK,则此配置可正常运行。
  • 如果使用最新 ASP.NET 或 ASP.NET Core SDK(托管在 Azure 中或者自己的服务器上),则默认运行自适应采样,不过可按前文所述切换到固定速率采样。 使用固定速率采样,浏览器 SDK 会自动同步到示例相关的事件。
  • 如果使用最新的 Java 代理,可以配置 applicationinsights.json(对于 Java SDK,配置 ApplicationInsights.xml)来启用固定速率采样。 默认情况下,采样处于关闭状态。 使用固定速率采样时,浏览器 SDK 和服务器会自动同步到样本相关的事件。

我总是想要查看某些罕见的事件。 如何让它们通过采样模块?

  • 始终查看特定事件的最佳方法是编写一个自定义的 TelemetryInitializer,以便在想要保留的遥测项中将 SamplingPercentage 设置为 100,如以下示例所示。 保证初始化程序将在遥测处理器(包括采样)之前运行,从而确保所有采样技术都会出于任何采样考虑而忽略此项。 自定义遥测初始化表达式在 ASP.NET SDK、ASP.NET Core SDK、JavaScript SDK 和 Java SDK 中可用。 例如,可以使用 ASP.NET SDK 配置遥测初始化表达式:

    public class MyTelemetryInitializer : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            if(somecondition)
            {
                ((ISupportSampling)telemetry).SamplingPercentage = 100;
            }
        }
    }
    

旧 SDK 版本

自适应采样适用于 Application Insights SDK for ASP.NET v2.0.0-beta3 及更高版本、Microsoft.ApplicationInsights.AspNetCore SDK v2.2.0-beta1 及更高版本,默认已启用。

固定速率采样是 ASP.NET 版本 2.0.0 及更高版本,以及 Java SDK 版本 2.0.1 及更高版本中的一项 SDK 功能。

在 ASP.NET SDK v2.5.0-beta2 和 ASP.NET Core SDK v2.2.0-beta3 之前,定义“用户”的应用程序(如大多数 Web 应用程序)的采样决策依赖于用户 ID 的哈希。 对于未定义用户的应用程序(例如 Web 服务),它基于请求的操作 ID 进行决策。 最新版本的 ASP.NET 和 ASP.NET Core SDK 现在都使用操作 ID 制定采样决策。

后续步骤