public TrackingMessage(TrackingRecord trackingRecord) { RecordType = trackingRecord.GetType().Name; InstanceId = trackingRecord.InstanceId.ToString(); RecordNumber = trackingRecord.RecordNumber; EventTime = trackingRecord.EventTime; Content = trackingRecord.ToString().Replace("<null>", "null"); if (trackingRecord is WorkflowInstanceRecord) { ActivityDefinitionId = ((WorkflowInstanceRecord)trackingRecord).ActivityDefinitionId; State = ((WorkflowInstanceRecord)trackingRecord).State; } if (trackingRecord is ActivityScheduledRecord) { Activity = ((ActivityScheduledRecord)trackingRecord).Activity.Name; ChildActivity = ((ActivityScheduledRecord)trackingRecord).Child.Name; } if (trackingRecord is ActivityStateRecord) { Activity = ((ActivityStateRecord)trackingRecord).Activity.Name; State = ((ActivityStateRecord)trackingRecord).State; Variables = ((ActivityStateRecord)trackingRecord).Variables.ToDictionary(kvp => kvp.Key, kvp => kvp.Value == null ? null : kvp.Value.ToString()); Arguments = ((ActivityStateRecord)trackingRecord).Arguments.ToDictionary(kvp => kvp.Key, kvp => kvp.Value == null ? null : kvp.Value.ToString()); } if (trackingRecord is CustomTrackingRecord) { Activity = ((CustomTrackingRecord)trackingRecord).Activity.Name; Name = ((CustomTrackingRecord)trackingRecord).Name; Data = string.Join(", ", ((CustomTrackingRecord)trackingRecord).Data.Select(kvp => string.Format("{0} = {1}", kvp.Key, kvp.Value))); } if (trackingRecord is WorkflowInstanceUnhandledExceptionRecord) { Activity = ((WorkflowInstanceUnhandledExceptionRecord)trackingRecord).FaultSource.Name; Data = ((WorkflowInstanceUnhandledExceptionRecord)trackingRecord).UnhandledException.ToString(); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { StringBuilder trackingContents = new StringBuilder(); trackingContents.AppendFormat(CultureInfo.InvariantCulture, "{0}: Level: {1}, RecordNumber: {2}", record.GetType().Name, record.Level, record.RecordNumber); if (record is WorkflowInstanceRecord) { trackingContents.AppendFormat(CultureInfo.InvariantCulture, " Workflow InstanceID: {0} Workflow instance state: {1}\n", record.InstanceId, ((WorkflowInstanceRecord)record).State); } else if (record is ActivityStateRecord) { ActivityStateRecord activityTrackingRecord = (ActivityStateRecord)record; IDictionary<String, object> variables = activityTrackingRecord.Variables; StringBuilder vars = new StringBuilder(); if (variables.Count > 0) { vars.AppendLine("\n\tVariables:"); foreach (KeyValuePair<string, object> variable in variables) { vars.AppendLine(String.Format( "\t\tName: {0} Value: {1}", variable.Key, variable.Value)); } } trackingContents.AppendFormat(CultureInfo.InvariantCulture, " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}\n", activityTrackingRecord.Activity.Name, activityTrackingRecord.State, ((variables.Count > 0) ? vars.ToString() : String.Empty)); } else if (record is ActivityScheduledRecord) { trackingContents.AppendFormat(CultureInfo.InvariantCulture, " :ChildActivity DisplayName: {0}\n", ((ActivityScheduledRecord)record).Child.Name); } else if (record is CustomTrackingRecord) { CustomTrackingRecord userTrackingRecord = (CustomTrackingRecord)record; if (userTrackingRecord.Data.Count > 0) { trackingContents.AppendFormat(CultureInfo.InvariantCulture, "\n\tUser Data:\n"); foreach (string data in userTrackingRecord.Data.Keys) { trackingContents.AppendFormat(CultureInfo.InvariantCulture, " \t\t {0} : {1}\n", data, userTrackingRecord.Data[data]); } } } this.writer.WriteLine(trackingContents); }
/// <summary> /// Retrieve each type of tracking record and perform the corresponding functionality. /// </summary> /// <param name="record">Represents the tracking record.</param> /// <param name="timeout">Time out for the tracking to be completed.</param> protected override void Track(TrackingRecord record, TimeSpan timeout) { Tracer.WriteMessage(String.Format(CultureInfo.InvariantCulture, "{0} Emitted trackRecord: {1} Level: {2}, RecordNumber: {3}", participantName, record.GetType().FullName, record.Level, record.RecordNumber)); WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord; if (workflowInstanceRecord != null) { if (_structuredTracer.IsEnabled) { if (string.Equals(WorkflowInstanceStates.Persisted, workflowInstanceRecord.State, StringComparison.OrdinalIgnoreCase)) { _structuredTracer.WorkflowPersisted(workflowInstanceRecord.InstanceId); } else if (string.Equals(WorkflowInstanceStates.UnhandledException, workflowInstanceRecord.State, StringComparison.OrdinalIgnoreCase)) { WorkflowInstanceUnhandledExceptionRecord unhandledRecord = workflowInstanceRecord as WorkflowInstanceUnhandledExceptionRecord; if (unhandledRecord != null) { _structuredTracer.WorkflowActivityExecutionFailed(unhandledRecord.InstanceId, unhandledRecord.FaultSource != null ? unhandledRecord.FaultSource.Name : unhandledRecord.ActivityDefinitionId, System.Management.Automation.Tracing.Tracer.GetExceptionString(unhandledRecord.UnhandledException)); } } } this.ProcessWorkflowInstanceRecord(workflowInstanceRecord); } ActivityStateRecord activityStateRecord = record as ActivityStateRecord; if (activityStateRecord != null) { if (_structuredTracer.IsEnabled) { ActivityInstanceState activityState = ActivityInstanceState.Executing; if (!string.IsNullOrEmpty(activityStateRecord.State) && Enum.TryParse<ActivityInstanceState>(activityStateRecord.State, out activityState)) { if (activityState == ActivityInstanceState.Executing) { _structuredTracer.ActivityExecutionQueued(activityStateRecord.InstanceId, activityStateRecord.Activity.Name); } } } this.ProcessActivityStateRecord(activityStateRecord); } CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord; if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0)) { this.ProcessCustomTrackingRecord(customTrackingRecord); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { // Log header information AddEvent(String.Format("Type: {0} Level: {1}, RecordNumber: {2}", record.GetType().Name, record.Level, record.RecordNumber)); // If this is a instance record WorkflowInstanceRecord instance = record as WorkflowInstanceRecord; if (instance != null) { AddEvent(String.Format(" InstanceID: {0} State: {1}",instance.InstanceId, instance.State)); } // If this is a bookmark record BookmarkResumptionRecord bookmark = record as BookmarkResumptionRecord; if (bookmark != null) { AddEvent(String.Format(" Bookmark {0} resumed",bookmark.BookmarkName)); } // If this is an activity record ActivityStateRecord activity = record as ActivityStateRecord; if (activity != null) { IDictionary<String, object> variables = activity.Variables; StringBuilder s = new StringBuilder(); if (variables.Count > 0) { s.AppendLine(" Variables:"); foreach (KeyValuePair<string, object> v in variables) { s.AppendLine(String.Format(" {0} Value: [{1}]",v.Key, v.Value)); } } AddEvent(String.Format(" Activity: {0} State: {1} {2}",activity.Activity.Name, activity.State, s.ToString())); } // If this is a user record CustomTrackingRecord user = record as CustomTrackingRecord; if ((user != null) && (user.Data.Count > 0)) { AddEvent(String.Format(" User Data: {0}", user.Name)); foreach (string data in user.Data.Keys) { AddEvent(String.Format(" {0} : {1}", data, user.Data[data])); } } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { Console.Write(String.Format(CultureInfo.InvariantCulture, "{0} emitted trackRecord: {1} Level: {2}, RecordNumber: {3}", participantName, record.GetType().FullName, record.Level, record.RecordNumber)); WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord; if (workflowInstanceRecord != null) { Console.WriteLine(String.Format(CultureInfo.InvariantCulture, " Workflow InstanceID: {0} Workflow instance state: {1}", record.InstanceId, workflowInstanceRecord.State)); } ActivityStateRecord activityStateRecord = record as ActivityStateRecord; if (activityStateRecord != null) { IDictionary<String, object> variables = activityStateRecord.Variables; StringBuilder vars = new StringBuilder(); if (variables.Count > 0) { vars.AppendLine("\n\tVariables:"); foreach (KeyValuePair<string, object> variable in variables) { vars.AppendLine(String.Format( "\t\tName: {0} Value: {1}", variable.Key, variable.Value)); } } Console.WriteLine(String.Format(CultureInfo.InvariantCulture, " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}", activityStateRecord.Activity.Name, activityStateRecord.State, ((variables.Count > 0) ? vars.ToString() : String.Empty))); } CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord; if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0)) { Console.WriteLine(String.Format(CultureInfo.InvariantCulture, "\n\tUser Data:")); foreach (string data in customTrackingRecord.Data.Keys) { Console.WriteLine(String.Format(CultureInfo.InvariantCulture, " \t\t {0} : {1}", data, customTrackingRecord.Data[data])); } } Console.WriteLine(); }
protected override void Track(TrackingRecord record, TimeSpan timeout) { Type recordType = record.GetType(); Writer.WriteLine("[" + record.RecordNumber + "] ({" + record.EventTime + "}) Instance: " + record.InstanceId); if (record.Annotations.Count > 0) { Writer.WriteLine("Annotations:"); foreach (string key in record.Annotations.Keys) { Writer.WriteLine("\t" + key + "\t" + record.Annotations[key]); } } if (recordType == typeof(WorkflowInstanceUnhandledExceptionRecord)) { WorkflowInstanceUnhandledExceptionRecord crecord = (WorkflowInstanceUnhandledExceptionRecord)record; RecordWriteLine(crecord, "-----------Exception"); RecordWriteLine(crecord, crecord.UnhandledException.ToString()); RecordWriteLine(crecord, "-----------End Exception"); } else if (recordType == typeof(WorkflowInstanceRecord)) { WorkflowInstanceRecord crecord = (WorkflowInstanceRecord)record; RecordWriteLine(crecord, "Workflow State: " + crecord.State); } else if (recordType == typeof(ActivityStateRecord)) { ActivityStateRecord crecord = (ActivityStateRecord)record; RecordWriteLine(crecord, "Activity, " + crecord.Activity.Name + ", entered state: " + crecord.State); if (crecord.Variables.Count > 0) { Writer.WriteLine("Variables:"); foreach (string key in crecord.Variables.Keys) { Writer.WriteLine("\t" + key + "\t" + crecord.Variables[key].ToString()); } } } }
// The track method is called whenever the workflow runtime emits a tracking record protected override void Track(TrackingRecord record, TimeSpan timeout) { try { using (FileStream fs = new FileStream(Environment.ExpandEnvironmentVariables(Path), FileMode.Append)) { XmlTextWriter writer = new XmlTextWriter(fs, ASCIIEncoding.ASCII) { Formatting = Formatting.Indented }; DataContractSerializer serializer = new DataContractSerializer(record.GetType()); serializer.WriteObject(writer, record); writer.WriteRaw(Environment.NewLine); writer.Flush(); fs.Flush(); } } catch (Exception e) { Trace.WriteLine(String.Format(CultureInfo.InvariantCulture, "Exception in track method {0}", e.Message)); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { LoggingEntry entry = null; var timeSpanValue = ExecutionTime?.GetTimeInfo(record); var commoninfo = $"{record.RecordNumber:00000} {timeSpanValue}"; if (IsSet(StateChangeRecords.ActivityState) && record is ActivityStateRecord) { var staterecord = (ActivityStateRecord) record; entry = new LoggingEntry($"{commoninfo} {record.GetType().Name} {staterecord.Activity.Name} ({staterecord.Activity.TypeName}) {staterecord.State}"); // add each variable/value to foreach (var valuePair in staterecord.Variables) { entry.AdditionalInformations.Add(new PropertyEntry() {Name = valuePair.Key, Value = valuePair.Value}); } } else if (IsSet(StateChangeRecords.ActivityScheduled) && record is ActivityScheduledRecord) { var scheduledrecord = (ActivityScheduledRecord) record; _writerAdapter.WriteLine($"{commoninfo} {scheduledrecord?.Activity?.Name} ({scheduledrecord?.Activity?.TypeName}) Child: {scheduledrecord.Child.Name}"); } else if (IsSet(StateChangeRecords.WorkflowInstance) && record is WorkflowInstanceRecord) { var instancerecord = (WorkflowInstanceRecord) record; _writerAdapter.WriteLine($"{commoninfo} State of workflow changed: {instancerecord.State}"); } else if (IsSet(StateChangeRecords.CancelRequested) && record is CancelRequestedRecord) { var cancelrecord = (CancelRequestedRecord) record; _writerAdapter.WriteLine($"{commoninfo} {record.GetType().Name} {cancelrecord.Activity?.Name}"); } else if (IsSet(StateChangeRecords.FaultPropagation) && record is FaultPropagationRecord) { var faultrecord = (FaultPropagationRecord) record; _writerAdapter.WriteLine($"{commoninfo} Fault {faultrecord?.Fault.Message}"); } if (record.Annotations.Any()) { Debug.WriteLine($"Anmerkungen bei {record.RecordNumber}"); } if (entry != null) { entry.Annotations.AddRange(record.Annotations.Values.ToList()); _writerAdapter.WriteEntry(entry); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { string name; object[] fullName = new object[4]; fullName[0] = "WorkflowTrackingParticipant"; fullName[1] = record.GetType().FullName; fullName[2] = record.Level; fullName[3] = record.RecordNumber; this.Tracer.WriteMessage(string.Format(CultureInfo.InvariantCulture, "{0} Emitted trackRecord: {1} Level: {2}, RecordNumber: {3}", fullName)); WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord; if (workflowInstanceRecord != null) { if (this._structuredTracer.IsEnabled) { if (!string.Equals("Persisted", workflowInstanceRecord.State, StringComparison.OrdinalIgnoreCase)) { if (string.Equals("UnhandledException", workflowInstanceRecord.State, StringComparison.OrdinalIgnoreCase)) { WorkflowInstanceUnhandledExceptionRecord workflowInstanceUnhandledExceptionRecord = workflowInstanceRecord as WorkflowInstanceUnhandledExceptionRecord; if (workflowInstanceUnhandledExceptionRecord != null) { Tracer tracer = this._structuredTracer; Guid instanceId = workflowInstanceUnhandledExceptionRecord.InstanceId; if (workflowInstanceUnhandledExceptionRecord.FaultSource != null) { name = workflowInstanceUnhandledExceptionRecord.FaultSource.Name; } else { name = workflowInstanceUnhandledExceptionRecord.ActivityDefinitionId; } tracer.WorkflowActivityExecutionFailed(instanceId, name, Tracer.GetExceptionString(workflowInstanceUnhandledExceptionRecord.UnhandledException)); } } } else { this._structuredTracer.WorkflowPersisted(workflowInstanceRecord.InstanceId); } } this.ProcessWorkflowInstanceRecord(workflowInstanceRecord); } ActivityStateRecord activityStateRecord = record as ActivityStateRecord; if (activityStateRecord != null) { if (this._structuredTracer.IsEnabled) { ActivityInstanceState activityInstanceState = ActivityInstanceState.Executing; if (!string.IsNullOrEmpty(activityStateRecord.State) && Enum.TryParse<ActivityInstanceState>(activityStateRecord.State, out activityInstanceState) && activityInstanceState == ActivityInstanceState.Executing) { this._structuredTracer.ActivityExecutionQueued(activityStateRecord.InstanceId, activityStateRecord.Activity.Name); } } this.ProcessActivityStateRecord(activityStateRecord); } CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord; if (customTrackingRecord != null && customTrackingRecord.Data.Count > 0) { this.ProcessCustomTrackingRecord(customTrackingRecord); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { Debug.WriteLine(string.Format("Workflow Id:{0} RecordType: {1} Record Details: {2}", record.InstanceId, record.GetType().Name, record.ToString())); }
/// <summary> /// When implemented in a derived class, used to synchronously process the tracking record. /// </summary> /// <param name="trackingRecord">The tracking record.</param> /// <param name="timeout">The time period after which the provider aborts the attempt.</param> protected override void Track(TrackingRecord trackingRecord, TimeSpan timeout) { if (trackingRecord.Level > TraceLevel) return; var type = trackingRecord.GetType(); if (type == typeof (WorkflowInstanceRecord) && WorkflowInstanceRecord != null) WorkflowInstanceRecord((WorkflowInstanceRecord) trackingRecord); else if (type == typeof (ActivityScheduledRecord) && ActivityScheduledRecord != null) ActivityScheduledRecord((ActivityScheduledRecord) trackingRecord); else if (type == typeof (ActivityStateRecord) && ActivityStateRecord != null) ActivityStateRecord((ActivityStateRecord) trackingRecord); else if (type == typeof (BookmarkResumptionRecord) && BookmarkResumptionRecord != null) BookmarkResumptionRecord((BookmarkResumptionRecord) trackingRecord); else if (type == typeof (CancelRequestedRecord) && CancelRequestedRecord != null) CancelRequestedRecord((CancelRequestedRecord) trackingRecord); else if (type == typeof (CustomTrackingRecord) && CustomTrackingRecord != null) CustomTrackingRecord((CustomTrackingRecord) trackingRecord); else if (type == typeof (FaultPropagationRecord) && FaultPropagationRecord != null) FaultPropagationRecord((FaultPropagationRecord) trackingRecord); else if (type == typeof (StateMachineStateRecord) && StateMachineStateRecord != null) StateMachineStateRecord((StateMachineStateRecord) trackingRecord); else if (type == typeof (ReceiveMessageRecord) && ReceiveMessageRecord != null) ReceiveMessageRecord((ReceiveMessageRecord) trackingRecord); else if (type == typeof (SendMessageRecord) && SendMessageRecord != null) SendMessageRecord((SendMessageRecord) trackingRecord); else if (type == typeof (WorkflowInstanceAbortedRecord) && WorkflowInstanceAbortedRecord != null) WorkflowInstanceAbortedRecord((WorkflowInstanceAbortedRecord) trackingRecord); else if (type == typeof (WorkflowInstanceSuspendedRecord) && WorkflowInstanceSuspendedRecord != null) WorkflowInstanceSuspendedRecord((WorkflowInstanceSuspendedRecord) trackingRecord); else if (type == typeof (WorkflowInstanceTerminatedRecord) && WorkflowInstanceTerminatedRecord != null) WorkflowInstanceTerminatedRecord((WorkflowInstanceTerminatedRecord) trackingRecord); else if (type == typeof (WorkflowInstanceUpdatedRecord) && WorkflowInstanceUpdatedRecord != null) WorkflowInstanceUpdatedRecord((WorkflowInstanceUpdatedRecord) trackingRecord); else if (type == typeof (WorkflowInstanceUnhandledExceptionRecord) && WorkflowInstanceUnhandledExceptionRecord != null) WorkflowInstanceUnhandledExceptionRecord((WorkflowInstanceUnhandledExceptionRecord) trackingRecord); }
/// <summary> /// When implemented in a derived class, used to synchronously process the tracking record. /// </summary> /// <param name="record"> /// The generated tracking record. /// </param> /// <param name="timeout"> /// The time period after which the provider aborts the attempt. /// </param> protected override void Track(TrackingRecord record, TimeSpan timeout) { if (record is ActivityStateRecord) { this.Track((ActivityStateRecord)record, timeout); } else if (record is ActivityScheduledRecord) { this.Track((ActivityScheduledRecord)record, timeout); } else if (record is BookmarkResumptionRecord) { this.Track((BookmarkResumptionRecord)record, timeout); } else if (record is CancelRequestedRecord) { this.Track((CancelRequestedRecord)record, timeout); } #if NET401_OR_GREATER else if (record is StateMachineStateRecord) { this.Track((StateMachineStateRecord)record, timeout); } #endif else if (record is ReceiveMessageRecord) { this.Track((ReceiveMessageRecord)record, timeout); } else if (record is SendMessageRecord) { this.Track((SendMessageRecord)record, timeout); } else if (record is CustomTrackingRecord) { this.Track((CustomTrackingRecord)record, timeout); } else if (record is FaultPropagationRecord) { this.Track((FaultPropagationRecord)record, timeout); } else if (record is WorkflowInstanceAbortedRecord) { this.Track((WorkflowInstanceAbortedRecord)record, timeout); } else if (record is WorkflowInstanceSuspendedRecord) { this.Track((WorkflowInstanceSuspendedRecord)record, timeout); } else if (record is WorkflowInstanceTerminatedRecord) { this.Track((WorkflowInstanceTerminatedRecord)record, timeout); } else if (record is WorkflowInstanceUnhandledExceptionRecord) { this.Track((WorkflowInstanceUnhandledExceptionRecord)record, timeout); } else if (record is WorkflowInstanceRecord) { this.Track((WorkflowInstanceRecord)record, timeout); } else { throw new NotImplementedException(string.Format("There is no track handler for type {0}", record.GetType().Name)); } }