如何关联两个通过NServiceBus通信的AppInsights服务资源?
NServiceBus 通信服务 Application Map 关联解决方案
1. 发送端遥测配置
- 发送NSB消息时,不要使用通用
TrackXXX方法,需明确构造DependencyTelemetry对象,固定类型为Queue Message DependencyTelemetry.Target字段必须填写接收方服务在Application Map中展示的 exact 服务名称,不要填RabbitMQ地址或队列名- 发送端通过
Activity.DefaultId获取当前W3C格式Trace上下文,连同Activity.Current?.TraceStateString一起作为自定义头附加到NSB消息中,不要使用自定义的父ID字段 - 确保依赖遥测的
Success属性设为true,OperationId与当前服务链路的操作ID保持一致
2. 接收端遥测配置
- 处理NSB消息前,先从消息头提取发送端传入的Trace上下文
- 手动初始化新的
Activity,强制指定Activity.IdFormat = ActivityIdFormat.W3C,调用Activity.SetParentId(提取的父ActivityId),存在TraceState时同步赋值 - 启动Activity后构造
RequestTelemetry跟踪消息处理,固定类型为Queue Message,RequestTelemetry.Source字段填写发送方服务在Application Map中展示的 exact 服务名称 - 确保接收端请求遥测的
OperationId与发送端依赖遥测的OperationId完全一致,接收端请求的ParentId与发送端依赖的Id完全一致
3. 全局遥测初始化器补充(可选但推荐)
- 实现自定义
ITelemetryInitializer,全局处理所有NSB相关遥测的字段补全,避免业务代码重复配置:public class NsbTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { // 处理NSB发送的依赖遥测 if (telemetry is DependencyTelemetry dt && dt.Type == "Queue Message" && dt.Properties.ContainsKey("IsNsbMessage")) { dt.Target = dt.Properties["TargetServiceName"]; } // 处理NSB接收的请求遥测 if (telemetry is RequestTelemetry rt && rt.Type == "Queue Message" && rt.Properties.ContainsKey("IsNsbMessage")) { rt.Source = rt.Properties["SourceServiceName"]; } } } - 在Startup中注册初始化器:
services.AddSingleton<ITelemetryInitializer, NsbTelemetryInitializer>();
4. 验证逻辑
- 到Application Insights事务搜索中,按任意NSB消息的Trace ID检索,确认能同时查到发送端的依赖遥测和接收端的请求遥测
- 核对两个遥测的
operation_id完全相同、发送端依赖的id等于接收端请求的parent_id、依赖的target等于接收服务名、请求的source等于发送服务名,四个条件满足时Application Map会自动绘制两个服务之间的连线
内容的提问来源于stack exchange,提问作者Kevin Everett
相关产品推荐
相关产品推荐

