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

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();
    });

为什么之前的方法无效

  1. appsettings.json日志配置:仅控制ApplicationInsights日志提供者的输出级别,和OpenTelemetry的Trace导出器无关,因此无法过滤Trace类型遥测。
  2. AspNetCore Instrumentation Filter:如果代码逻辑不正确(如未正确返回过滤条件)会导致不生效;且该方法是控制Activity的生成,而非导出后的遥测级别过滤。
  3. BaseProcessor:如果处理器未正确注册,或判断逻辑未命中目标Activity(如未识别出对应Verbose Trace的Activity特征),则无法生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:01:03