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

