You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Application Insights中排除快速成功请求采样并保留指标

解决Application Insights采样时保留快速请求指标但不占采样配额的问题

问题背景

我们的.NET 4.8应用已接入Application Insights,请求量较大,绝大多数请求耗时低于80ms,但存在少量耗时超300ms的慢请求。排查慢请求时发现,快速请求占满了采样配额,导致慢请求没有可用样本。

我们需要实现的核心需求:限制快速成功请求被纳入采样样本,但仍保留这些请求在整体请求指标中的统计(比如请求总数、成功率等)。

之前尝试过两种方案,但都无法满足需求:

  • 自定义ITelemetryProcessor直接过滤快速请求:这些请求的指标计数完全消失,无法统计调用情况
  • 用ITelemetryInitializer设置request.ProactiveSamplingDecision = SamplingDecision.SampledOut:同样会把请求从指标统计中移除

解决方案:基于采样优先级的自定义处理器

正确的思路是利用Application Insights的采样优先级机制,给慢请求/失败请求设置最高优先级,让采样器优先保留这类请求;给快速成功请求设置最低优先级,让采样器在配额不足时优先丢弃这类请求,但所有请求的指标依然会被正确聚合(AI后台会根据采样率还原真实计数)。

自定义采样优先级处理器代码

public class PrioritySamplingProcessor : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _nextProcessor;

    public PrioritySamplingProcessor(ITelemetryProcessor nextProcessor)
    {
        _nextProcessor = nextProcessor;
    }

    public void Process(ITelemetry telemetryItem)
    {
        if (telemetryItem is RequestTelemetry requestTelemetry)
        {
            // 给慢请求(耗时>300ms)或失败请求设置最高采样优先级
            if (!requestTelemetry.Success || requestTelemetry.Duration.TotalMilliseconds > 300)
            {
                telemetryItem.Context.Tags["ai.sampling.priority"] = "1";
            }
            // 给快速成功请求设置最低采样优先级
            else if (requestTelemetry.Success && requestTelemetry.Duration.TotalMilliseconds < 100)
            {
                telemetryItem.Context.Tags["ai.sampling.priority"] = "0";
            }
        }

        // 将请求传递给下一个处理器(包括自适应采样器)
        _nextProcessor.Process(telemetryItem);
    }
}

配置Application Insights

在ApplicationInsights.config中,需要把自定义处理器放在自适应采样器之前,确保采样器能读取到我们设置的优先级标签:

<TelemetryProcessors>
  <!-- 自定义优先级处理器必须放在采样器之前 -->
  <Add Type="你的命名空间.PrioritySamplingProcessor, 你的程序集名称" />
  
  <!-- 配置自适应采样器,设置合理的采样参数 -->
  <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
    <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
    <MinSamplingPercentage>1</MinSamplingPercentage>
    <SamplingPercentageDecreaseTimeout>00:02:00</SamplingPercentageDecreaseTimeout>
    <SamplingPercentageIncreaseTimeout>00:10:00</SamplingPercentageIncreaseTimeout>
  </Add>
</TelemetryProcessors>

方案原理

  • ai.sampling.priority标签是Application Insights采样器的内置标识:优先级1的请求会被采样器强制保留,优先级0的请求会被优先丢弃
  • 自适应采样器会根据实时请求量自动调整采样率,但始终遵循优先级规则,确保慢请求/失败请求不会被配额挤占
  • 所有请求的指标数据都会被正确统计:采样器会记录每个请求的采样率,AI后台会基于采样率还原出真实的请求总数、成功率、平均耗时等指标,不会丢失快速请求的统计信息

之前方案失效原因

  • 自定义ITelemetryProcessor直接返回:相当于完全丢弃了请求,既不会生成采样样本,也不会上报指标数据
  • 设置ProactiveSamplingDecision = SampledOut:会告知采样器跳过该请求的处理,同样会导致指标数据无法被统计

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:42:38