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 static void EnableDiagnosticSources(this OptionsConfigurer configurer) { if (configurer == null) { throw new ArgumentNullException(nameof(configurer)); } configurer.Decorate <IPipeline>(c => { var pipeline = c.Get <IPipeline>(); var injector = new PipelineStepInjector(pipeline); var outgoingStep = new OutgoingDiagnosticsStep(); injector.OnSend(outgoingStep, PipelineRelativePosition.Before, typeof(SendOutgoingMessageStep)); var incomingStep = new IncomingDiagnosticsStep(); var invokerWrapper = new IncomingDiagnosticsHandlerInvokerWrapper(); injector.OnReceive(invokerWrapper, PipelineRelativePosition.After, typeof(ActivateHandlersStep)); var concatenator = new PipelineStepConcatenator(injector); concatenator.OnReceive(incomingStep, PipelineAbsolutePosition.Front); return(concatenator); }); }
public static void EnableOpenTelemetry(this OptionsConfigurer configurer) { configurer.Decorate <IPipeline>(c => { var pipeline = c.Get <IPipeline>(); var step = new OutgoingDiagnosticsStep(); return(new PipelineStepInjector(pipeline).OnSend(step, PipelineRelativePosition.Before, typeof(SerializeOutgoingMessageStep))); }); configurer.Decorate <IPipeline>(c => { var pipeline = c.Get <IPipeline>(); var step = new IncomingDiagnosticsStep(); return(new PipelineStepInjector(pipeline).OnReceive(step, PipelineRelativePosition.Before, typeof(DeserializeIncomingMessageStep))); }); }
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); }