void AuditSaga(ActiveSagaInstance activeSagaInstance, IInvokeHandlerContext context)
    {
        var saga = activeSagaInstance.Instance;

        if (saga.Entity == null)
        {
            if (context.IsTimeoutMessage())
            {
                //Receiving a timeout for a saga that has completed
                return;
            }
            throw new Exception("Expected saga.Entity to contain a value.");
        }
        if (!context.Headers.TryGetValue(Headers.MessageId, out var messageId))
        {
            return;
        }

        var headers             = context.Headers;
        var originatingMachine  = headers["NServiceBus.OriginatingMachine"];
        var originatingEndpoint = headers[Headers.OriginatingEndpoint];
        var intent = context.MessageIntent();

        var initiator = new SagaChangeInitiator
        {
            IsSagaTimeoutMessage = context.IsTimeoutMessage(),
            InitiatingMessageId  = messageId,
            OriginatingMachine   = originatingMachine,
            OriginatingEndpoint  = originatingEndpoint,
            MessageType          = context.MessageMetadata.MessageType.FullName,
            TimeSent             = context.TimeSent(),
            Intent = intent
        };

        sagaAudit.IsNew       = activeSagaInstance.IsNew;
        sagaAudit.IsCompleted = saga.Completed;
        sagaAudit.SagaId      = saga.Entity.Id;

        AssignSagaStateChangeCausedByMessage(context);

        logger.WriteInfo(
            messageTemplate: messageTemplate,
            properties: new[]
        {
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
            new LogEventProperty("SagaId", new ScalarValue(sagaAudit.SagaId)),
            new LogEventProperty("StartTime", new ScalarValue(sagaAudit.StartTime)),
            new LogEventProperty("FinishTime", new ScalarValue(sagaAudit.FinishTime)),
            new LogEventProperty("IsCompleted", new ScalarValue(sagaAudit.IsCompleted)),
            new LogEventProperty("IsNew", new ScalarValue(sagaAudit.IsNew)),
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
            logger.BindProperty("Initiator", initiator),
            logger.BindProperty("ResultingMessages", sagaAudit.ResultingMessages),
            logger.BindProperty("Entity", saga.Entity),
        });
    }
 static InitiatingMessage CreateInitiatingMessage(SagaChangeInitiator initiator)
 {
     return(new InitiatingMessage
     {
         MessageId = initiator.InitiatingMessageId,
         IsSagaTimeoutMessage = initiator.IsSagaTimeoutMessage,
         OriginatingEndpoint = initiator.OriginatingEndpoint,
         OriginatingMachine = initiator.OriginatingMachine,
         TimeSent = initiator.TimeSent,
         MessageType = initiator.MessageType,
         Intent = initiator.Intent,
     });
 }
Example #3
0
    void AuditSaga(ActiveSagaInstance activeSagaInstance, IInvokeHandlerContext context)
    {
        var saga = activeSagaInstance.Instance;

        if (saga.Entity == null)
        {
            if (context.IsTimeoutMessage())
            {
                //Receiving a timeout for a saga that has completed
                return;
            }

            throw new Exception("Expected saga.Entity to contain a value.");
        }

        var headers = context.Headers;

        if (!headers.TryGetValue(Headers.MessageId, out var messageId))
        {
            return;
        }

        var intent = context.MessageIntent();

        var initiator = new SagaChangeInitiator
        {
            IsSagaTimeoutMessage = context.IsTimeoutMessage(),
            InitiatingMessageId  = messageId,
            OriginatingMachine   = context.OriginatingMachine(),
            OriginatingEndpoint  = context.OriginatingEndpoint(),
            MessageType          = context.MessageName(),
            TimeSent             = context.TimeSent(),
            Intent = intent
        };

        sagaAudit.IsNew       = activeSagaInstance.IsNew;
        sagaAudit.IsCompleted = saga.Completed;
        sagaAudit.SagaId      = saga.Entity.Id;

        AssignSagaStateChangeCausedByMessage(context);

        var properties = new List <LogEventProperty>
        {
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
            new LogEventProperty("SagaId", new ScalarValue(sagaAudit.SagaId)),
            new LogEventProperty("StartTime", new ScalarValue(sagaAudit.StartTime)),
            new LogEventProperty("FinishTime", new ScalarValue(sagaAudit.FinishTime)),
            new LogEventProperty("IsCompleted", new ScalarValue(sagaAudit.IsCompleted)),
            new LogEventProperty("IsNew", new ScalarValue(sagaAudit.IsNew)),
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
        };

        var logger = context.Logger();

        if (logger.BindProperty("Initiator", initiator, out var initiatorProperty))
        {
            properties.Add(initiatorProperty);
        }

        if (logger.BindProperty("ResultingMessages", sagaAudit.ResultingMessages, out var resultingMessagesProperty))
        {
            properties.Add(resultingMessagesProperty);
        }

        if (logger.BindProperty("Entity", saga.Entity, out var sagaEntityProperty))
        {
            properties.Add(sagaEntityProperty);
        }

        logger.WriteInfo(messageTemplate, properties);
    }
    void AuditSaga(ActiveSagaInstance activeSagaInstance, IInvokeHandlerContext context, SagaUpdatedMessage sagaAudit)
    {
        var saga = activeSagaInstance.Instance;

        if (saga.Entity == null)
        {
            //this can happen if it is a timeout or for invoking "saga not found" logic
            return;
        }

        var headers = context.Headers;

        if (!headers.TryGetValue(Headers.MessageId, out var messageId))
        {
            return;
        }

        var intent = context.MessageIntent();

        var initiator = new SagaChangeInitiator
                        (
            isSagaTimeoutMessage: context.IsTimeoutMessage(),
            initiatingMessageId: messageId,
            originatingMachine: context.OriginatingMachine(),
            originatingEndpoint: context.OriginatingEndpoint(),
            messageType: context.MessageType(),
            timeSent: context.TimeSent(),
            intent: intent
                        );

        sagaAudit.IsNew       = activeSagaInstance.IsNew;
        sagaAudit.IsCompleted = saga.Completed;
        sagaAudit.SagaId      = saga.Entity.Id;

        AssignSagaStateChangeCausedByMessage(context, sagaAudit);

        var properties = new List <LogEventProperty>
        {
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
            new LogEventProperty("SagaId", new ScalarValue(sagaAudit.SagaId)),
            new LogEventProperty("StartTime", new ScalarValue(sagaAudit.StartTime)),
            new LogEventProperty("FinishTime", new ScalarValue(sagaAudit.FinishTime)),
            new LogEventProperty("IsCompleted", new ScalarValue(sagaAudit.IsCompleted)),
            new LogEventProperty("IsNew", new ScalarValue(sagaAudit.IsNew)),
            new LogEventProperty("SagaType", new ScalarValue(sagaAudit.SagaType)),
        };

        var logger = context.Logger();

        if (logger.BindProperty("Initiator", initiator, out var initiatorProperty))
        {
            properties.Add(initiatorProperty);
        }

        if (logger.BindProperty("ResultingMessages", sagaAudit.ResultingMessages, out var resultingMessagesProperty))
        {
            properties.Add(resultingMessagesProperty);
        }

        if (logger.BindProperty("Entity", saga.Entity, out var sagaEntityProperty))
        {
            properties.Add(sagaEntityProperty);
        }

        logger.WriteInfo(messageTemplate, properties);
    }