ASP.NET Core 8中用OpenTelemetry向AppInsights过滤Verbose级Trace遥测
解决ASP.NET Core 8 + OpenTelemetry + AppInsights 过滤Verbose级别Trace遥测的问题
问题本质
你遇到的Verbose级别Trace遥测,是OpenTelemetry的Activity(由ASP.NET Core Instrumentation生成)被Azure Monitor Trace Exporter转换而来的。常规的日志级别配置(如appsettings.json中的Logging节点)仅作用于ApplicationInsights日志提供者,对OpenTelemetry的追踪信号不生效,所以之前的配置无效。
可行解决方案
方案一:自定义遥测转换器过滤(推荐)
通过修改Azure Monitor Trace Exporter的转换逻辑,直接过滤掉Verbose级别的Trace遥测:
using Azure.Monitor.OpenTelemetry.Exporter; using Microsoft.ApplicationInsights.DataContracts; // 在Program.cs中配置OpenTelemetry builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => { tracerProviderBuilder // 启用ASP.NET Core请求追踪 .AddAspNetCoreInstrumentation() // 添加Azure Monitor Trace导出器并自定义转换逻辑 .AddAzureMonitorTraceExporter(options => { // 保存原始转换器 var originalConverter = options.TelemetryConverter; // 重写转换器逻辑 options.TelemetryConverter = (activity, exporterOptions) => { // 调用原始转换器生成遥测数据 var telemetries = originalConverter(activity, exporterOptions); // 过滤掉SeverityLevel为Verbose的Trace遥测 return telemetries.Where(t => { if (t is TraceTelemetry traceTelemetry) { return traceTelemetry.SeverityLevel != SeverityLevel.Verbose; } // 保留其他类型的遥测(如Dependency等) return true; }).ToList(); }; }); });
方案二:通过Activity处理器过滤
如果需要更细粒度的Activity控制,可以编写自定义处理器,在Activity结束时标记不导出:
using OpenTelemetry; using OpenTelemetry.Trace; public class VerboseTraceFilterProcessor : BaseProcessor<Activity> { public override void OnEnd(Activity activity) { // 示例:过滤ASP.NET Core生成的Server类型Activity(对应请求的Verbose Trace) if (activity.Source.Name == "Microsoft.AspNetCore" && activity.Kind == ActivityKind.Server) { // 禁用该Activity的导出 activity.IsAllDataRequested = false; } base.OnEnd(activity); } } // 在Program.cs中注册处理器 builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => { tracerProviderBuilder .AddAspNetCoreInstrumentation() .AddAzureMonitorTraceExporter() // 添加自定义处理器 .AddProcessor<VerboseTraceFilterProcessor>(); });
方案三:过滤ASP.NET Core Instrumentation的Activity
如果你不需要生成请求相关的Activity(会影响整个追踪链),可以直接在Instrumentation中过滤:
builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => { tracerProviderBuilder .AddAspNetCoreInstrumentation(options => { // 返回false则不生成该请求的Activity,也就不会导出为Trace遥测 options.Filter = (httpContext) => { // 可根据路径、请求方法等调整过滤规则 // 示例:过滤所有/api开头的请求 // return !httpContext.Request.Path.StartsWithSegments("/api"); return false; }; }) .AddAzureMonitorTraceExporter(); });
为什么之前的方法无效
- appsettings.json日志配置:仅控制ApplicationInsights日志提供者的输出级别,和OpenTelemetry的Trace导出器无关,因此无法过滤Trace类型遥测。
- AspNetCore Instrumentation Filter:如果代码逻辑不正确(如未正确返回过滤条件)会导致不生效;且该方法是控制Activity的生成,而非导出后的遥测级别过滤。
- BaseProcessor
:如果处理器未正确注册,或判断逻辑未命中目标Activity(如未识别出对应Verbose Trace的Activity特征),则无法生效。
内容的提问来源于stack exchange,提问作者Pooven
相关产品推荐
相关产品推荐

