MassTransit 8.0.1.0版本缺失MassTransit.Transport.Send操作名咨询
MassTransit v8.0.1.0 诊断事件变更根因
MassTransit v8 版本对内置的System.Diagnostics诊断链路埋点做了非兼容性重构,是原有SkyWalking采集逻辑失效的直接原因:
- 原v7及更早版本中统一的传输层操作名命名规则全部废弃,
MassTransit.Transport.*前缀的事件名不再触发 - 原
MassTransit.Transport.Send被拆分为三类细分事件,分别对应不同的消息投递行为:- 普通点对点发送(调用
IBus.Send/ISendEndpoint.Send)触发MassTransit.Diagnostics.Send.Send - 广播发布事件(调用
IPublishEndpoint.Publish)触发MassTransit.Diagnostics.Publish.Publish - 消费者内响应请求触发
MassTransit.Diagnostics.Respond.Respond
- 普通点对点发送(调用
- 事件携带的负载结构同步调整,原直接挂载在事件参数上的
DestinationAddress、MessageId、SourceAddress等字段,全部封装到对应的SendContext/PublishContext/ReceiveContext实例中,原有直接读取顶层属性的逻辑会拿到空值。 - 接收端原
MassTransit.Transport.Receive操作名同步变更为MassTransit.Diagnostics.Receive.Receive。
适配方案
按以下步骤调整SkyWalking的诊断采集逻辑即可恢复链路追踪:
- 替换操作名匹配规则
删除原有硬编码匹配MassTransit.Transport.Send的判断逻辑,改为匹配MassTransit.Diagnostics.Send、MassTransit.Diagnostics.Publish前缀的事件作为消息发送出口Span,匹配MassTransTransit.Diagnostics.Receive前缀的事件作为消息接收入口Span。如果需要和历史SkyWalking链路数据保持兼容,创建Span时可以手动将OperationName设置为原有值MassTransit.Transport.Send,避免仪表盘、告警规则失效。 - 调整上下文属性读取逻辑
事件触发后不再直接从事件参数顶层读取链路属性,改为先取出对应的Context实例,再从实例中读取所需字段,参考适配代码如下:// 发送端适配示例 public void OnEventWritten(string eventName, object eventPayload) { if (eventName is "MassTransit.Diagnostics.Send.Send" or "MassTransit.Diagnostics.Publish.Publish") { // 取出对应上下文实例 var context = eventPayload.GetType().GetProperty("SendContext")?.GetValue(eventPayload) ?? eventPayload.GetType().GetProperty("PublishContext")?.GetValue(eventPayload); if (context == null) return; // 读取链路所需字段 var destinationAddress = context.GetType().GetProperty("DestinationAddress")?.GetValue(context)?.ToString(); var messageId = context.GetType().GetProperty("MessageId")?.GetValue(context)?.ToString(); var sourceAddress = context.GetType().GetProperty("SourceAddress")?.GetValue(context)?.ToString(); // 原有创建Span、注入Trace头的逻辑保持不变 var span = SkyWalkingAgent.Tracer.CreateExitSpan("MassTransit.Transport.Send", destinationAddress, headerInjector); span.SetComponent("MassTransit"); // 其他标签设置逻辑... } } - 多版本兼容处理
如果业务环境中同时存在MassTransit v7、v8版本的服务,可以在采集逻辑初始化时读取当前加载的MassTransit程序集版本号,版本号大于等于8.0.0.0时走上述新逻辑,低于该版本时保留原有MassTransit.Transport.*的匹配逻辑,避免跨版本调用时链路断裂。
注意:v8版本中诊断事件的触发时机调整为消息序列化完成、进入传输管道前触发,此时读取Context属性不会出现序列化相关的空值问题,不需要额外做延迟读取处理。
内容的提问来源于stack exchange,提问作者dingsongjie
相关产品推荐
相关产品推荐

