来自服务总线消息的masstransit访问活动

时间:2019-08-19 17:27:39

标签: azure-application-insights masstransit

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

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

有什么提示吗?

2 个答案:

答案 0 :(得分:0)

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

此处提供了文档:

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

我认为,根据我对DiagnosticSource的经验,您仍然可以从任何地方访问Activity.Current。不过,对于AppInsights来说可能有所不同。

答案 1 :(得分:0)

几个月的时间和我实施的解决方案被证明是一个很好的解决方案。 我创建了实现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是一个了不起的工具,没有其他选择。但是文档非常差。