public async Task StartsNoActivityIfThereIsNoCurrentActivity() { var step = new OutgoingDiagnosticsStep(); var headers = GetMessageHeaders("id", Headers.IntentOptions.PublishSubscribe); var message = new Message(headers, new object()); var transportMessage = new TransportMessage(headers, Array.Empty <byte>()); var destinations = new DestinationAddresses(new List <string> { "MyQueue" }); var context = new OutgoingStepContext(message, AmbientTransactionContext.Current, destinations); context.Save(transportMessage); var hadActivity = false; var callbackWasInvoked = false; await step.Process(context, () => { hadActivity = Activity.Current != null; callbackWasInvoked = true; return(Task.CompletedTask); }); Assert.That(hadActivity, Is.False); Assert.That(headers, Has.No.ContainKey(RebusDiagnosticConstants.TraceStateHeaderName)); Assert.That(callbackWasInvoked, Is.True); }
public async Task StartsNewActivityIfThereIsAlreadyAParentActivity() { Assume.That(RebusDiagnosticConstants.ActivitySource.HasListeners(), Is.True); var step = new OutgoingDiagnosticsStep(); var headers = GetMessageHeaders("id", Headers.IntentOptions.PublishSubscribe); var message = new Message(headers, new object()); var transportMessage = new TransportMessage(headers, Array.Empty <byte>()); var destinations = new DestinationAddresses(new List <string> { "MyQueue" }); var context = new OutgoingStepContext(message, AmbientTransactionContext.Current, destinations); context.Save(transportMessage); using var activity = new Activity("MyActivity"); activity.SetIdFormat(ActivityIdFormat.W3C); activity.Start(); Assume.That(activity, Is.SameAs(Activity.Current)); var hadActivity = false; var hadExpectedParent = false; await step.Process(context, () => { hadActivity = Activity.Current != null; hadExpectedParent = Activity.Current?.ParentSpanId == activity.SpanId; return(Task.CompletedTask); }); Assert.That(hadActivity, Is.True); Assert.That(hadExpectedParent, Is.True); Assert.That(transportMessage.Headers, Contains.Key(RebusDiagnosticConstants.TraceStateHeaderName)); Assert.That(transportMessage.Headers[RebusDiagnosticConstants.TraceStateHeaderName], Is.Not.Null.And.Not.Empty); }
/// <summary> /// Constructs the step context, initially stashing the given <see cref="Message"/>, list of <see cref="DestinationAddresses"/> and <see cref="ITransactionContext"/> into its bag of objects /// </summary> public OutgoingStepContext(Message logicalMessage, ITransactionContext transactionContext, DestinationAddresses destinationAddresses) { Save(logicalMessage); Save(destinationAddresses); Save(transactionContext); }
public void AddOutgoingMessage(string messageId, DestinationAddresses destinationAddresses, TransportMessage transportMessage) { IdempotencyData.AddOutgoingMessage(messageId, destinationAddresses, transportMessage); }