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

ASP.NET应用如何为特定文件扩展名配置Application Insights自适应采样?

针对特定文件扩展名配置Application Insights自适应采样

可以通过实现自定义ITelemetryProcessor来针对不同文件扩展名的请求设置差异化采样规则,以下是具体实现方案:

实现自定义采样处理器

创建一个继承ITelemetryProcessor的自定义处理器,使用令牌桶限流器针对不同扩展名的请求设置采样上限:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System.Threading.RateLimiting;

public class ExtensionBasedSamplingProcessor : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _nextProcessor;
    private readonly RateLimiter _defaultRateLimiter;
    private readonly RateLimiter _jsRateLimiter;

    public ExtensionBasedSamplingProcessor(ITelemetryProcessor nextProcessor)
    {
        _nextProcessor = nextProcessor;
        // 默认请求:每秒最多3条采样
        _defaultRateLimiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
        {
            TokenLimit = 3,
            ReplenishmentPeriod = TimeSpan.FromSeconds(1),
            TokensPerPeriod = 3,
            QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
            QueueLimit = 0
        });

        // .js请求:每秒最多1条采样(若需发送更多数据,可提高TokenLimit和TokensPerPeriod值)
        _jsRateLimiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
        {
            TokenLimit = 1,
            ReplenishmentPeriod = TimeSpan.FromSeconds(1),
            TokensPerPeriod = 1,
            QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
            QueueLimit = 0
        });
    }

    public void Process(ITelemetry item)
    {
        if (item is RequestTelemetry requestTelemetry)
        {
            var url = requestTelemetry.Url;
            bool isJsRequest = url.AbsolutePath.EndsWith(".js", StringComparison.OrdinalIgnoreCase);

            RateLimiter targetLimiter = isJsRequest ? _jsRateLimiter : _defaultRateLimiter;

            // 尝试获取令牌,获取成功则发送遥测
            using var lease = targetLimiter.AcquireAsync(1).GetAwaiter().GetResult();
            if (lease.IsAcquired)
            {
                _nextProcessor.Process(item);
            }
            // 获取失败则丢弃该遥测,不发送到Application Insights
        }
        else
        {
            // 非请求类型的遥测(如日志、依赖项)直接传递到下一个处理器
            _nextProcessor.Process(item);
        }
    }
}

注册自定义处理器

在应用启动代码中注册该采样处理器,以替换或补充默认的采样逻辑:

.NET 6+(Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 添加Application Insights服务
builder.Services.AddApplicationInsightsTelemetry();

// 注册自定义采样处理器
builder.Services.AddApplicationInsightsTelemetryProcessor<ExtensionBasedSamplingProcessor>();

var app = builder.Build();

// 其他中间件配置...

app.Run();

.NET 5及以前(Startup.cs)

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetry();
        services.AddApplicationInsightsTelemetryProcessor<ExtensionBasedSamplingProcessor>();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 其他配置...
    }
}

注意事项

  • 若需要让.js请求发送更多数据,只需调高_jsRateLimiter配置中的TokenLimit和TokensPerPeriod值(例如设置为10,即每秒最多10条采样)。
  • 该处理器仅对RequestTelemetry(请求遥测)生效,若需对日志、依赖项等其他遥测类型应用扩展名规则,可扩展Process方法的判断逻辑。
  • 可调整QueueLimit参数设置排队长度,避免直接丢弃请求(设置为0则直接丢弃超出限制的请求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:50:25