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

