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

Azure OpenTelemetry:应用闲置15分钟后Activity对象为空

问题分析与解决方案

针对你遇到的.NET Framework 4.6.1 Windows服务处理Azure Service Bus消息时,闲置15分钟后ActivitySource有效但无法创建Activity的问题,以下是具体分析和解决思路:

核心原因推测

  1. ActivityListener被GC回收:.NET Framework 4.6.1中,ActivitySource的订阅依赖ActivityListener实例。如果ActivityListener是弱引用或未被强持有,闲置期间可能被GC清理,导致CreateActivity/StartActivity返回null——这是最常见的原因。
  2. Azure Service Bus客户端闲置重建连接:服务总线客户端闲置超时后会重建连接,但遥测上下文未重新绑定,导致新消息处理时无法创建Activity。
  3. DI组件生命周期配置错误:如果ActivitySource或遥测相关处理器不是单例注册,闲置后重新实例化的组件可能未正确初始化订阅。

具体解决步骤

1. 强制保持ActivityListener的强引用

在服务启动代码中,将ActivityListener存储为静态变量,避免被GC回收:

// 静态变量持有ActivityListener,防止GC回收
private static ActivityListener _telemetryActivityListener;

private void InitializeTelemetry()
{
    _telemetryActivityListener = new ActivityListener
    {
        ShouldListenTo = source => source.Name.Equals("你的ActivitySource名称"),
        Sample = (ref ActivityCreationOptions<ActivityContext> options) => ActivitySamplingResult.AllData,
        // 按需添加ActivityStarted/ActivityStopped处理逻辑
    };
    ActivitySource.AddActivityListener(_telemetryActivityListener);
}

2. 调整Azure Service Bus客户端闲置设置

修改ServiceBusClient的连接配置,延长闲置超时时间,避免频繁重建连接:

var clientOptions = new ServiceBusClientOptions
{
    ConnectionIdleTimeout = TimeSpan.FromMinutes(30), // 延长闲置超时
    RetryOptions = new ServiceBusRetryOptions
    {
        MaxRetryDelay = TimeSpan.FromSeconds(10),
        Mode = ServiceBusRetryMode.Exponential
    }
};

var serviceBusClient = new ServiceBusClient("你的连接字符串", clientOptions);

3. 验证DI注册的生命周期

在Windsor DI配置中,确保ActivitySource和遥测相关组件注册为单例:

container.Register(
    Component.For<ActivitySource>()
             .Instance(new ActivitySource("你的ActivitySource名称"))
             .LifestyleSingleton(),
    Component.For<ITelemetryProcessor>()
             .ImplementedBy<YourTelemetryProcessor>()
             .LifestyleSingleton()
);

4. 升级相关NuGet包

如果使用OpenTelemetry或Azure Service Bus SDK,升级到支持.NET Framework 4.6.1的最新稳定版本,修复已知的闲置和GC相关bug:

  • Azure.Messaging.ServiceBus:确保版本≥7.14.0(支持.NET Framework 4.6.1的稳定版)
  • OpenTelemetry相关包:如OpenTelemetry、OpenTelemetry.Exporter.ApplicationInsights等,升级到对应兼容版本

5. 排查订阅状态

在日志中添加ActivitySource.HasListeners的打印,闲置前后对比:

// 消息处理前打印订阅状态
_logger.Info($"ActivitySource Has Listeners: {_activitySource.HasListeners}");
var handleMessageActivity = _activitySource.StartActivity("HandleServiceBusMessage");

如果闲置后HasListeners为false,说明ActivityListener被GC回收,需回到步骤1调整引用方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:42:22