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

.NET Isolated Azure Function中ITelemetryProcessor占5%CPU的优化咨询

问题描述

我实现了如下遥测处理器:

public class ExcludeInProcInvokeTelemetryProcessor(ITelemetryProcessor next) : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _next = next;

    public void Process(ITelemetry item)
    {
        if (item is DependencyTelemetry dependency && dependency.Type == "InProc" && dependency.Name == "Invoke")
            return;

        _next.Process(item);
    }
}

Visual Studio诊断工具显示该方法占用总CPU的5%,推测因每条遥测数据都会触发其调用。
我运行的是隔离进程模型的Azure Function,无法在主机层面过滤,请问是否有其他遥测过滤方式?也恳请提供性能优化建议!
整体来看5%CPU占用不算高,但该过滤器逻辑简单,这种消耗似乎没必要。我另有一个更复杂的过滤器,并未进入诊断工具的资源消耗Top方法列表。

解决方案与优化建议

替代遥测过滤方式

1. OpenTelemetry 内置过滤(推荐)

隔离进程模型下,Azure Functions支持通过OpenTelemetry配置直接过滤遥测,无需自定义ITelemetryProcessor:

  • 在Program.cs中配置时,直接对依赖类型遥测添加过滤规则:
using OpenTelemetry.Trace;

builder.Services.AddOpenTelemetry()
    .WithTracing(tracerProviderBuilder =>
    {
        tracerProviderBuilder
            .AddAzureFunctionsInstrumentation(options =>
            {
                options.Filter = activity =>
                {
                    if (activity.Kind == ActivityKind.Client &&
                        activity.TagObjects.Any(t => t.Key == "dependency.type" && t.Value.ToString() == "InProc") &&
                        activity.DisplayName == "Invoke")
                    {
                        return false;
                    }
                    return true;
                };
            });
    });

这种方式在遥测生成阶段直接过滤,避免了后续处理器链的调用开销。

2. Application Insights 采样规则过滤

在appsettings.json中配置采样规则,直接排除符合条件的遥测:

{
  "ApplicationInsights": {
    "Sampling": {
      "Settings": {
        "Rules": [
          {
            "Filter": "Dependency.Type == 'InProc' and Dependency.Name == 'Invoke'",
            "SamplingPercentage": 0
          }
        ]
      }
    }
  }
}

通过SamplingPercentage: 0直接丢弃目标遥测,由SDK底层处理,性能开销远低于自定义处理器。

性能优化建议

1. 优化自定义处理器逻辑

原代码可通过以下方式降低CPU消耗:

  • 缓存字符串常量,避免重复实例化;使用StringComparison.Ordinal提升字符串比较性能:
private const string _inProcType = "InProc";
private const string _invokeName = "Invoke";

public void Process(ITelemetry item)
{
    if (item is DependencyTelemetry dependency)
    {
        // 短路逻辑:先判断Type,不匹配则直接跳过Name检查
        if (string.Equals(dependency.Type, _inProcType, StringComparison.Ordinal) &&
            string.Equals(dependency.Name, _invokeName, StringComparison.Ordinal))
        {
            return;
        }
    }
    _next.Process(item);
}

2. 调整处理器链顺序

将这个简单过滤处理器放在处理器链的最前端,让不符合条件的遥测尽早被拦截,避免触发后续所有处理器的调用。

3. 复杂过滤器未上榜的原因分析

复杂过滤器未进入Top消耗列表,大概率是因为:

  • 它仅处理小部分特定类型的遥测,执行频率远低于当前过滤器;
  • 其内部逻辑虽复杂,但单次执行耗时占比极低,总CPU消耗未达到上榜阈值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:45:10