private static Activity?StartActivity(OutgoingStepContext context)
        {
            var parentActivity = Activity.Current;

            if (parentActivity == null)
            {
                return(null);
            }

            Activity?activity = null;

            if (RebusDiagnosticConstants.ActivitySource.HasListeners())
            {
                var message     = context.Load <TransportMessage>();
                var messageType = message.GetMessageType();

                var messageWrapper = new TransportMessageWrapper(message);


                var activityKind = messageWrapper.GetIntentOption() == Headers.IntentOptions.PublishSubscribe
                    ? ActivityKind.Producer
                    : ActivityKind.Client;

                var activityName = $"{messageType} send";

                var initialTags = TagHelper.ExtractInitialTags(messageWrapper);

                // Per the spec on how to handle array types: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/common.md#attributes
                var destinationAddresses = context.Load <DestinationAddresses>();
                initialTags.Add("messaging.destination", JsonConvert.SerializeObject(destinationAddresses.ToList()));

                // TODO: Transport specific tags, like rabbitmq routing key

                activity = RebusDiagnosticConstants.ActivitySource.StartActivity(activityName, activityKind,
                                                                                 parentActivity.Context, initialTags);

                TagHelper.CopyBaggage(parentActivity, activity);

                // TODO: Figure out if this is actually needed now
                // DiagnosticListener.OnActivityImport(activity, context);
            }

            SendBeforeSendEvent(context);

            return(activity);
        }
Ejemplo n.º 2
0
        private static Activity?StartActivity(IncomingStepContext context)
        {
            Activity?activity = null;

            if (RebusDiagnosticConstants.ActivitySource.HasListeners())
            {
                var message = context.Load <TransportMessage>();

                var headers = message.Headers;

                var messageType = message.GetMessageType();

                var messageWrapper = new TransportMessageWrapper(message);

                var initialTags = TagHelper.ExtractInitialTags(messageWrapper);
                initialTags.Add("messaging.operation", "receive");

                var activityKind = messageWrapper.GetIntentOption() == Headers.IntentOptions.PublishSubscribe
                    ? ActivityKind.Consumer
                    : ActivityKind.Server;

                var activityName = $"{messageType} receive";
                if (!headers.TryGetValue(RebusDiagnosticConstants.TraceStateHeaderName, out var traceState))
                {
                    activity = RebusDiagnosticConstants.ActivitySource.StartActivity(activityName, activityKind, default(ActivityContext), initialTags);
                }
                else
                {
                    activity = RebusDiagnosticConstants.ActivitySource.StartActivity(activityName, activityKind,
                                                                                     traceState, initialTags);
                }

                if (activity != null)
                {
                    CopyBaggage(headers, activity);
                }

                // TODO: Not sure if this is still needed
                // DiagnosticListener.OnActivityImport(activity, context);
            }

            SendBeforeProcessEvent(context, activity);

            return(activity);
        }