/// <inheritdoc />
        public override void SetParentAndStart(TraceContextBase parentTraceContext)
        {
            if (this.CurrentActivity == null)
            {
                this.CurrentActivity = new Activity(this.OperationName);
                this.CurrentActivity.SetIdFormat(ActivityIdFormat.W3C);
            }

            if (parentTraceContext is W3CTraceContext)
            {
                var context = (W3CTraceContext)parentTraceContext;
                this.CurrentActivity.SetParentId(context.TraceParent);
                this.CurrentActivity.TraceStateString = context.TraceState;
                this.OrchestrationTraceContexts       = context.OrchestrationTraceContexts.Clone();
            }

            this.CurrentActivity.Start();

            this.StartTime    = this.CurrentActivity.StartTimeUtc;
            this.TraceParent  = this.CurrentActivity.Id;
            this.TraceState   = this.CurrentActivity.TraceStateString;
            this.ParentSpanId = this.CurrentActivity.ParentSpanId.ToHexString();

            CorrelationTraceContext.Current = this;
        }
Beispiel #2
0
        /// <inheritdoc />
        public override void SetParentAndStart(TraceContextBase parentTraceContext)
        {
            if (CurrentActivity == null)
            {
                CurrentActivity = new Activity(this.OperationName);
            }

            if (parentTraceContext is W3CTraceContext)
            {
                var context = (W3CTraceContext)parentTraceContext;
                CurrentActivity.SetTraceparent(context.TraceParent);
                CurrentActivity.SetTracestate(context.TraceState);
                OrchestrationTraceContexts = context.OrchestrationTraceContexts.Clone();
            }
            else   // In case of null object
            {
                CurrentActivity.GenerateW3CContext();
            }

            CurrentActivity.Start();

            StartTime    = CurrentActivity.StartTimeUtc;
            TraceParent  = CurrentActivity.GetTraceparent();
            TraceState   = CurrentActivity.GetTracestate();
            ParentSpanId = CurrentActivity.GetParentSpanId();

            CorrelationTraceContext.Current = this;
        }
Beispiel #3
0
        void CreateAndTrackDependencyTelemetry(TraceContextBase requestTraceContext)
        {
            TraceContextBase dependencyTraceContext = TraceContextFactory.Create(TraceConstants.Client);

            dependencyTraceContext.TelemetryType = TelemetryType.Dependency;
            dependencyTraceContext.SetParentAndStart(requestTraceContext);

            CorrelationTraceContext.Current = dependencyTraceContext;

            // Correlation
            CorrelationTraceClient.TrackDepencencyTelemetry(dependencyTraceContext);
            CorrelationTraceClient.TrackRequestTelemetry(requestTraceContext);
        }
Beispiel #4
0
        TraceContextBase CreateOrExtractRequestTraceContext(string eventName)
        {
            TraceContextBase requestTraceContext = null;

            if (Activity.Current == null) // It is possible that the caller already has an activity.
            {
                requestTraceContext = TraceContextFactory.Create($"{TraceConstants.Client}: {eventName}");
                requestTraceContext.StartAsNew();
            }
            else
            {
                requestTraceContext = TraceContextFactory.Create(Activity.Current);
            }

            return(requestTraceContext);
        }
Beispiel #5
0
        /// <inheritdoc />
        public override void SetParentAndStart(TraceContextBase parentTraceContext)
        {
            CurrentActivity = new Activity(this.OperationName);

            if (parentTraceContext is HttpCorrelationProtocolTraceContext)
            {
                var context = (HttpCorrelationProtocolTraceContext)parentTraceContext;
                CurrentActivity.SetParentId(context.ParentId); // TODO check if it is context.ParentId or context.CurrentActivity.Id
                OrchestrationTraceContexts = context.OrchestrationTraceContexts.Clone();
            }

            CurrentActivity.Start();

            ParentId       = CurrentActivity.Id;
            StartTime      = CurrentActivity.StartTimeUtc;
            ParentParentId = CurrentActivity.ParentId;

            CorrelationTraceContext.Current = this;
        }
Beispiel #6
0
        /// <inheritdoc />
        public override void SetParentAndStart(TraceContextBase parentTraceContext)
        {
            this.CurrentActivity = new Activity(this.OperationName);
            this.CurrentActivity.SetIdFormat(ActivityIdFormat.Hierarchical);

            if (parentTraceContext is HttpCorrelationProtocolTraceContext context)
            {
                this.CurrentActivity.SetParentId(context.ParentId); // TODO check if it is context.ParentId or context.CurrentActivity.Id
                this.OrchestrationTraceContexts = context.OrchestrationTraceContexts.Clone();
            }

            this.CurrentActivity.Start();

            this.ParentId       = this.CurrentActivity.Id;
            this.StartTime      = this.CurrentActivity.StartTimeUtc;
            this.ParentParentId = this.CurrentActivity.ParentId;

            CorrelationTraceContext.Current = this;
        }
Beispiel #7
0
 /// <inheritdoc />
 public override void SetParentAndStart(TraceContextBase parentTraceContext)
 {
 }
 /// <summary>
 /// Set Parent TraceContext and Start the context
 /// </summary>
 /// <param name="parentTraceContext"> Parent Trace</param>
 public abstract void SetParentAndStart(TraceContextBase parentTraceContext);
Beispiel #9
0
        async Task <OrchestrationInstance> InternalCreateOrchestrationInstanceWithRaisedEventAsync(
            string orchestrationName,
            string orchestrationVersion,
            string orchestrationInstanceId,
            object orchestrationInput,
            IDictionary <string, string> orchestrationTags,
            OrchestrationStatus[] dedupeStatuses,
            string eventName,
            object eventData,
            DateTime?startAt = null)
        {
            TraceContextBase requestTraceContext = null;

            // correlation
            CorrelationTraceClient.Propagate(() => { requestTraceContext = this.CreateOrExtractRequestTraceContext(eventName); });

            if (string.IsNullOrWhiteSpace(orchestrationInstanceId))
            {
                orchestrationInstanceId = Guid.NewGuid().ToString("N");
            }

            var orchestrationInstance = new OrchestrationInstance
            {
                InstanceId  = orchestrationInstanceId,
                ExecutionId = Guid.NewGuid().ToString("N"),
            };

            string serializedOrchestrationData = this.defaultConverter.Serialize(orchestrationInput);
            var    startedEvent = new ExecutionStartedEvent(-1, serializedOrchestrationData)
            {
                Tags    = orchestrationTags,
                Name    = orchestrationName,
                Version = orchestrationVersion,
                OrchestrationInstance = orchestrationInstance,
                ScheduledStartTime    = startAt
            };

            var startMessage = new TaskMessage
            {
                OrchestrationInstance = orchestrationInstance,
                Event = startedEvent
            };

            this.logHelper.SchedulingOrchestration(startedEvent);

            CorrelationTraceClient.Propagate(() => this.CreateAndTrackDependencyTelemetry(requestTraceContext));

            // Raised events and create orchestration calls use different methods so get handled separately
            await this.ServiceClient.CreateTaskOrchestrationAsync(startMessage, dedupeStatuses);

            if (eventData != null)
            {
                string serializedEventData = this.defaultConverter.Serialize(eventData);
                var    eventRaisedEvent    = new EventRaisedEvent(-1, serializedEventData)
                {
                    Name = eventName
                };
                this.logHelper.RaisingEvent(orchestrationInstance, eventRaisedEvent);

                var eventMessage = new TaskMessage
                {
                    OrchestrationInstance = new OrchestrationInstance
                    {
                        InstanceId = orchestrationInstanceId,

                        // to ensure that the event gets raised on the running
                        // orchestration instance, null the execution id
                        // so that it will find out which execution
                        // it should use for processing
                        ExecutionId = null
                    },
                    Event = eventRaisedEvent,
                };

                await this.ServiceClient.SendTaskOrchestrationMessageAsync(eventMessage);
            }


            return(orchestrationInstance);
        }
Beispiel #10
0
 /// <summary>
 /// Track the DependencyTelemetry
 /// </summary>
 /// <param name="context"></param>
 public static void TrackDepencencyTelemetry(TraceContextBase context)
 {
     Tracking(() => logger.Write(DependencyTrackEvent, context));
 }
Beispiel #11
0
 /// <summary>
 /// Track the RequestTelemetry
 /// </summary>
 /// <param name="context"></param>
 public static void TrackRequestTelemetry(TraceContextBase context)
 {
     Tracking(() => logger.Write(RequestTrackEvent, context));
 }
Beispiel #12
0
        async Task <OrchestrationInstance> InternalCreateOrchestrationInstanceWithRaisedEventAsync(
            string orchestrationName,
            string orchestrationVersion,
            string orchestrationInstanceId,
            object orchestrationInput,
            IDictionary <string, string> orchestrationTags,
            OrchestrationStatus[] dedupeStatuses,
            string eventName,
            object eventData)
        {
            TraceContextBase requestTraceContext = null;

            // correlation
            CorrelationTraceClient.Propagate(() => { requestTraceContext = CreateOrExtractRequestTraceContext(eventName); });

            if (string.IsNullOrWhiteSpace(orchestrationInstanceId))
            {
                orchestrationInstanceId = Guid.NewGuid().ToString("N");
            }

            var orchestrationInstance = new OrchestrationInstance
            {
                InstanceId  = orchestrationInstanceId,
                ExecutionId = Guid.NewGuid().ToString("N"),
            };

            string serializedOrchestrationData = this.defaultConverter.Serialize(orchestrationInput);
            var    startedEvent = new ExecutionStartedEvent(-1, serializedOrchestrationData)
            {
                Tags    = orchestrationTags,
                Name    = orchestrationName,
                Version = orchestrationVersion,
                OrchestrationInstance = orchestrationInstance
            };

            var taskMessages = new List <TaskMessage>
            {
                new TaskMessage
                {
                    OrchestrationInstance = orchestrationInstance,
                    Event = startedEvent
                }
            };

            if (eventData != null)
            {
                string serializedEventData = this.defaultConverter.Serialize(eventData);
                taskMessages.Add(new TaskMessage
                {
                    OrchestrationInstance = new OrchestrationInstance
                    {
                        InstanceId = orchestrationInstanceId,

                        // to ensure that the event gets raised on the running
                        // orchestration instance, null the execution id
                        // so that it will find out which execution
                        // it should use for processing
                        ExecutionId = null
                    },
                    Event = new EventRaisedEvent(-1, serializedEventData)
                    {
                        Name = eventName
                    }
                });
            }

            CorrelationTraceClient.Propagate(() => CreateAndTrackDependencyTelemetry(requestTraceContext));

            // Raised events and create orchestration calls use different methods so get handled separately
            await Task.WhenAll(taskMessages.Where(t => !(t.Event is EventRaisedEvent)).Select(sEvent => ServiceClient.CreateTaskOrchestrationAsync(sEvent, dedupeStatuses)));

            await ServiceClient.SendTaskOrchestrationMessageBatchAsync(taskMessages.Where(t => (t.Event is EventRaisedEvent)).ToArray());

            return(orchestrationInstance);
        }