Example #1
0
        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);
            });
        }
Example #3
0
        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)));
            });
        }
Example #4
0
        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);
        }