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

如何在Azure ServiceBus发消息时向Application Insights当前ITelemetry上下文添加属性?

解决方案:在发送Azure ServiceBus消息时向Application Insights遥测上下文添加自定义属性

方法1:基于AsyncLocal+自定义ITelemetryInitializer实现

你可以复用ITelemetryInitializer的思路,但不用依赖IHttpContextAccessor,而是通过AsyncLocal在异步上下文间传递唯一ID,让初始化器给ServiceBus的依赖遥测自动附加属性,不会新增额外事务记录。

具体步骤:

  1. 定义静态类存储异步上下文的唯一ID:
    public static class TelemetryContextHelper
    {
        public static AsyncLocal<string> CurrentUniqueDataId = new AsyncLocal<string>();
    }
    
  2. 创建自定义遥测初始化器:
    public class ServiceBusUniqueIdInitializer : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            var uniqueId = TelemetryContextHelper.CurrentUniqueDataId.Value;
            if (!string.IsNullOrEmpty(uniqueId) && telemetry is DependencyTelemetry depTelemetry)
            {
                // 仅给ServiceBus相关的依赖遥测添加属性
                if (depTelemetry.Type == "Azure Service Bus" && !depTelemetry.Properties.ContainsKey("UniqueDataId"))
                {
                    depTelemetry.Properties.Add("UniqueDataId", uniqueId);
                }
            }
        }
    }
    
  3. 在服务注册时添加初始化器:
    builder.Services.AddSingleton<ITelemetryInitializer, ServiceBusUniqueIdInitializer>();
    
  4. 发送ServiceBus消息时设置并清理上下文ID:
    try
    {
        TelemetryContextHelper.CurrentUniqueDataId.Value = incomingData.UniqueId;
        await _serviceBusSender.SendMessageAsync(message);
    }
    finally
    {
        // 清理上下文,避免跨请求污染
        TelemetryContextHelper.CurrentUniqueDataId.Value = null;
    }
    

方法2:直接修改当前活动追踪上下文

如果代码运行在已有的分布式追踪活动中(比如Web请求上下文里),可以直接操作Activity.Current添加标签,Application Insights会自动将标签同步到遥测属性中,无需额外初始化器。

代码示例:

var currentActivity = Activity.Current;
if (currentActivity != null)
{
    // 添加自定义标签,App Insights会自动捕获为遥测属性
    currentActivity.AddTag("UniqueDataId", incomingData.UniqueId);
}

// 发送ServiceBus消息
await _serviceBusSender.SendMessageAsync(message);

注意事项

  • 方法1中必须在finally块清理AsyncLocal的值,防止异步上下文泄漏。
  • 方法2依赖Activity.Current不为null,Web请求场景下默认会自动创建追踪活动;如果是后台任务,需手动关联父追踪上下文或改用方法1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:04:59