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

如何避免OpenTelemetry将自身服务的所有依赖导出到Azure Monitor

排除OpenTelemetry自身导出至Azure Monitor的依赖项追踪记录

要过滤掉OpenTelemetry向Azure Monitor发送数据时产生的内部依赖项记录,可以通过以下几种方式实现:

1. 使用OpenTelemetry Trace过滤器直接排除

在配置OpenTelemetry时,通过AddFilter方法过滤掉符合特征的Activity(即依赖项追踪记录):

public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder)
    where TBuilder : IHostApplicationBuilder
{
    builder.Logging.AddOpenTelemetry(logging =>
    {
        logging.IncludeFormattedMessage = true;
        logging.IncludeScopes = true;
    });
    builder.Logging.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Information);

    if (!string.IsNullOrEmpty(builder.Configuration[ServiceNames.AppInsightsEnvironmentVariable]))
    {
        builder.Services.AddOpenTelemetry()
            .WithTracing(tracing =>
            {
                // 保留业务需要的仪器(如AspNetCore、HttpClient等)
                tracing.AddAspNetCore();
                tracing.AddHttpClient();
                
                // 添加过滤器排除Azure Monitor导出的依赖项
                tracing.AddFilter((activity) =>
                {
                    // 识别特征:客户端类型、DisplayName包含Azure Monitor,或目标地址是Azure Monitor ingestion端点
                    bool isAzureMonitorExport = activity.Kind == ActivityKind.Client && 
                        (activity.DisplayName.Contains("Azure Monitor") || 
                         activity.Tags.Any(tag => tag.Key == "net.peer.name" && tag.Value.Contains("ingestion.azure.com")));
                    
                    return !isAzureMonitorExport;
                });
            })
            .UseAzureMonitor();
    }

    return builder;
}

2. 自定义Trace处理器进行过滤

如果需要更灵活的过滤逻辑,可以自定义BaseProcessor<Activity>拦截并标记不需要的记录:

首先定义处理器类:

public class AzureMonitorExporterDependencyFilter : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        // 匹配Azure Monitor导出的依赖项特征
        if (activity.Kind == ActivityKind.Client &&
            activity.Tags.TryGetValue("net.peer.name", out var peerName) &&
            peerName.Contains("ingestion.azure.com"))
        {
            // 设置IsAllDataRequested为false,阻止该记录被导出
            activity.IsAllDataRequested = false;
        }

        base.OnEnd(activity);
    }
}

然后在配置中添加该处理器:

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddAspNetCore();
        tracing.AddHttpClient();
        // 添加自定义处理器
        tracing.AddProcessor<AzureMonitorExporterDependencyFilter>();
    })
    .UseAzureMonitor();

3. 排除特定HttpClient的仪器追踪

如果这些依赖项由OpenTelemetry导出器使用的HttpClient产生,可以直接过滤目标请求:

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddHttpClient(options =>
        {
            options.FilterHttpRequestMessage = (msg) =>
            {
                // 排除目标地址为Azure Monitor ingestion的请求
                return !msg.RequestUri.Host.Contains("ingestion.azure.com");
            };
        });
    });

注意事项

  • 不同版本的OpenTelemetry Azure Monitor导出器可能有不同的Activity命名或标签特征,可先在Application Insights中查看这些依赖项的详细属性(如DisplayName、net.peer.name),调整过滤条件匹配实际情况。
  • 确保保留业务所需的其他依赖项追踪,避免误过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:41:12