【问题标题】:masstransit access Activity from service bus message来自服务总线消息的公共交通访问活动
【发布时间】:2019-12-24 19:16:47
【问题描述】:

我正在使用 Masstransit 在两个服务之间通过服务总线发送请求/响应(不要问为什么)。

我想设置自定义应用洞察遥测。我知道 ServiceBus 消息添加了诊断元数据,因此消费者可以提取它并使用它来添加服务之间的关联。但是我无法在 MassTransit 中访问它,或者至少我不知道如何访问它。

有什么建议吗?

【问题讨论】:

    标签: azure-application-insights masstransit


    【解决方案1】:

    您可以将 Application Insights 与 MassTransit 一起使用,有一个包可以直接写入指标。

    文档可在此处获得:

    http://masstransit-project.com/MassTransit/usage/monitoring/applications-insights.html

    此外,根据我在 DiagnosticSource 方面的经验,我认为无论如何您都可以访问 Activity.Current。不过,AppInsights 可能会有所不同。

    【讨论】:

    • 感谢您的评论。我尝试使用该扩展,但它没有连接应用程序地图上的 2 个服务。我有服务 A 确实请求服务 B。我希望能够通过服务 B(Windows 服务)上的自动依赖跟踪模块看到它。 --- 我当然可以访问服务 B 上的 Activity.Current,但我需要访问服务 A 上的服务总线“发送”的 dependencyTelemetry id 并将其发送到服务 B 以将其设置为 RequestTelemetry.ParentId
    • 嘿,克里斯,有没有办法拦截 MassTransit 从服务 A 发送的 serviceBus 消息?或者,什么会更有用 - 我能以某种方式在消费者端接收 ServiceBus 消息,服务 B - 使用 ServiceBus.Message .ExtractActivity() 的扩展方法 - 它会为我做所有的魔法。
    • 您可能会在 MT 的 Gitter 频道上询问,该软件包的作者在那里闲逛。我不确定,但我认为它使用消息头来传输活动标识符以在 AppInsights 中显示所有服务交互的嵌套图。
    【解决方案2】:

    几个月过去了,我实施的解决方案被证明是一个很好的解决方案。 我创建了实现 IReceiveObserver 的类。在 PreReceive 上,我能够访问 (ServiceBusReceiveContext) 上下文并启动具有正确父 ID 的遥测操作。所以它看起来像这样:

        public Task PreReceive(ReceiveContext context)
        {
            var serviceBusContext = (ServiceBusReceiveContext)context;
            var requestActivity = new Activity("Process");
            requestActivity.SetParentId(serviceBusContext.Properties["Diagnostic-Id"].ToString());
            IOperationHolder<RequestTelemetry> operation = _telemetryClient.StartOperation<RequestTelemetry>(requestActivity);
            operation.Telemetry.Success = true;
            serviceBusContext.Properties.Add(TelemetryOperationKey, operation);
    
            return Task.CompletedTask;
        }
    

    在 PostReceive 上我可以停止操作:

        public Task PostReceive(ReceiveContext context)
        {
            var serviceBusContext = (ServiceBusReceiveContext)context;
            var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
            operation.Dispose();
    
            return Task.CompletedTask;
        }
    

    当异常发生时我也会做一些魔术:

        public Task ReceiveFault(ReceiveContext context, Exception exception)
        {
            _telemetryClient.TrackException(exception);
            var serviceBusContext = (ServiceBusReceiveContext)context;
            var operation = (IOperationHolder<RequestTelemetry>)serviceBusContext.Properties[TelemetryOperationKey];
            operation.Telemetry.ResponseCode = "Fail";
            operation.Telemetry.Success = false;
            operation.Dispose();
    
            return Task.CompletedTask;
        }
    

    通过阅读 MassTransit 文档很难找到此解决方案。我想说,MassTransit 在某些情况下是一个很棒的工具,没有其他选择。但是文档很差。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 2019-05-27
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2021-08-16
      相关资源
      最近更新 更多