/// <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; }
/// <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; }
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); }
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); }
/// <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; }
/// <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; }
/// <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);
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); }
/// <summary> /// Track the DependencyTelemetry /// </summary> /// <param name="context"></param> public static void TrackDepencencyTelemetry(TraceContextBase context) { Tracking(() => logger.Write(DependencyTrackEvent, context)); }
/// <summary> /// Track the RequestTelemetry /// </summary> /// <param name="context"></param> public static void TrackRequestTelemetry(TraceContextBase context) { Tracking(() => logger.Write(RequestTrackEvent, context)); }
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); }