如何停止向App Insights记录过多的ServiceBusReceiver.Receive依赖日志
问题背景
我有一个部署在Kubernetes上的Azure Functions(.NET6,v4版本)应用,目前ServiceBusReceiver.Receive的依赖调用日志量异常,每个实例每小时生成2000条日志。自定义代码中仅在TelemetryClient中使用了TrackEvent和TrackException方法,这些依赖日志并非自定义生成,无法定位来源,也无法直接禁用。尝试过调整相关包版本(与其他消息应用版本对齐、更新至最新版)均未解决,日志中也缺乏足够追踪信息。
SERVICEBUS ServiceBusReceiver.Receive 依赖属性
- Type: servicebus
- Call status: true
- Duration: 1.0 mins
- Name: ServiceBusReceiver.Receive
- Telemetry type: dependency
- Application version: 4.19.0.0
- SDK version dotnetc:2.21.0-429
- Sample rate: 1
- Performance: 1min-2min
- Base name: ServiceBusReceiver.Receive
已安装包及版本信息
- Sdk="Microsoft.NET.Sdk"
- net6.0
- AzureFunctionsVersion v4
- "AutoMapper.Extensions.Microsoft.DependencyInjection" Version="4.0.1"
- "Azure.Messaging.ServiceBus" Version="7.10.0"
- "Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.4.0"
- "Microsoft.Azure.WebJobs.Logging.ApplicationInsights" Version="3.0.33"
- "Microsoft.NET.Sdk.Functions" Version="4.0.1"
- "Microsoft.Azure.Functions.Extensions" Version="1.1.0"
- "Microsoft.Extensions.Azure" Version="1.2.0"
- "Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="5.1.0"
- "Microsoft.Extensions.Caching.Memory" Version="6.0.1"
- "Polly" Version="7.1.0"
- "Scrutor" Version="4.1.0"
排查与解决方法
1. 定位日志来源
这些依赖日志大概率来自Microsoft.Azure.WebJobs.Extensions.ServiceBus的自动遥测采集功能,Azure Functions的ServiceBus扩展会默认追踪ServiceBus操作的依赖信息,无需手动调用TrackDependency。
可以通过添加遥测处理器过滤日志的同时,打印额外信息确认来源:
public class ServiceBusDependencyFilter : ITelemetryProcessor { private readonly ITelemetryProcessor _next; public ServiceBusDependencyFilter(ITelemetryProcessor next) { _next = next; } public void Process(ITelemetry item) { if (item is DependencyTelemetry dependency && dependency.Name == "ServiceBusReceiver.Receive") { // 打印额外信息用于定位来源,生产环境可替换为日志组件输出 Console.WriteLine($"Dependency Operation: {dependency.Context.Operation.Name}, Properties: {System.Text.Json.JsonSerializer.Serialize(dependency.Properties)}"); // 若需直接过滤该日志,取消注释下方return语句 // return; } _next.Process(item); } }
在Startup类中注册处理器:
public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddApplicationInsightsTelemetryProcessor<ServiceBusDependencyFilter>(); } }
2. 禁用或调整ServiceBus自动遥测
方法一:直接禁用ServiceBus扩展的遥测
修改host.json,添加ServiceBus扩展的遥测禁用配置:
{ "extensions": { "serviceBus": { "telemetry": { "enabled": false } } } }
方法二:针对特定依赖调整采样率
若不想全局禁用依赖遥测,可在host.json中配置采样规则,降低ServiceBusReceiver.Receive的日志采样率:
{ "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "percentage": 10, // 仅采集10%的该类依赖日志,可按需调整 "dependencySampling": { "includedNames": [ "ServiceBusReceiver.Receive" ] } } } } }
3. 检查包版本兼容性
当前使用的Microsoft.Azure.WebJobs.Extensions.ServiceBus 5.4.0与Azure.Messaging.ServiceBus 7.10.0虽兼容,但版本较旧。建议升级至最新稳定版:
- 将
Microsoft.Azure.WebJobs.Extensions.ServiceBus升级至5.11.0+ - 将
Azure.Messaging.ServiceBus升级至7.17.0+ - 同步升级
Microsoft.Azure.WebJobs.Logging.ApplicationInsights至对应兼容版本(如3.0.48)
4. 优化ServiceBus接收配置
若使用长轮询模式,过高的轮询频率会导致日志量增加。检查ServiceBus触发器的配置参数:
- 调整
MaxAutoLockRenewalDuration,避免不必要的锁续期操作 - 合理设置
PrefetchCount,减少单次接收的调用频率 - 确认触发器的
MessageHandlerOptions配置,是否存在频繁的重试或轮询逻辑
内容的提问来源于stack exchange,提问作者6dev6il6

