如何在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
相关产品推荐
相关产品推荐

