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); }
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(); }
public static String Serialize(TrackingRecord tr) { if (tr == null) { return(String.Empty); } XElement root = new XElement(tr.GetType().Name); XDocument xml = new XDocument(root); SerializeObject(root, tr); return(xml.ToString()); }
public 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(ActivityTrackingRecord)) { ActivityTrackingRecord crecord = (ActivityTrackingRecord)record; RecordWriteLine(crecord, "Activity, " + crecord.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)); } }
/// <summary> /// Constructs a tracking message /// </summary> /// <param name="trackingRecord">The message to track</param> public CustomTrackingMessage(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 = new CustomActivityMessage(((ActivityScheduledRecord)trackingRecord).Activity); ChildActivity = new CustomActivityMessage(((ActivityScheduledRecord)trackingRecord).Child); } if (trackingRecord is ActivityStateRecord) { Activity = new CustomActivityMessage(((ActivityStateRecord)trackingRecord).Activity); 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 = new CustomActivityMessage(((CustomTrackingRecord)trackingRecord).Activity); 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 = new CustomActivityMessage(((WorkflowInstanceUnhandledExceptionRecord)trackingRecord).FaultSource); Data = ((WorkflowInstanceUnhandledExceptionRecord)trackingRecord).UnhandledException.ToString(); } }
protected override void Track(TrackingRecord record, TimeSpan timeout) { try { TestTraceManager.OptionalLogTrace("[InMemoryTrackingParticipant]Track()::InMemory tracking participant = {0} ; Tracking record type = {1} ; Record Details = {2}", this.Name, record.GetType(), record.ToString()); TestTraceManager.OptionalLogTrace("[InMemoryTrackingParticipant]TestTraceManager.IsDefaultTrackingConfiguration = {0}", TestTraceManager.IsDefaultTrackingConfiguration.ToString()); bool IsPushDataToTraceManager = true; ActualTrace _trace = this.GetActualTrackingData(record.InstanceId); if (record is WorkflowInstanceRecord) { TrackWorkflowInstanceRecord(record as WorkflowInstanceRecord, _trace); } else if (record is ActivityStateRecord) { IsPushDataToTraceManager = TrackActivityStateRecord(record as ActivityStateRecord, _trace); } else if (record is ActivityScheduledRecord) { TrackActivityScheduledRecord(record as ActivityScheduledRecord, _trace); } else if (record is BookmarkResumptionRecord) { TrackBookmarkResumptionRecord(record as BookmarkResumptionRecord, _trace); } else if (record is CancelRequestedRecord) { TrackCancelRequestedRecord(record as CancelRequestedRecord, _trace); } else if (record is FaultPropagationRecord) { TrackFaultPropagationRecord(record as FaultPropagationRecord, _trace); } if (IsPushDataToTraceManager) { PushDataToTraceManager(record); } } //This exception will be eaten by the product tracking code and not available for review //So the only chance we have to see it is if we log it. catch (Exception e) { //Log.WarnInternal("Exception thrown in Track() method\n" + e.ToString()); throw; } }
/// <summary> /// Retreive each type of tracking record and perform the corresponding fucntionality. /// </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) { if (record is ActivityStateRecord) { TrackActivityRecord((ActivityStateRecord)record); } else if (record is WorkflowInstanceRecord) { TrackWorkflowRecord((WorkflowInstanceRecord)record); } else if (record is BookmarkResumptionRecord) { TrackBookmarkRecord((BookmarkResumptionRecord)record); } else if (record is ActivityScheduledRecord) { TrackActivityScheduledRecord((ActivityScheduledRecord)record); } else if (record is CancelRequestedRecord) { TrackCancelRequestedRecord((CancelRequestedRecord)record); } else if (record is FaultPropagationRecord) { TrackFaultPropagationRecord((FaultPropagationRecord)record); } else if (record is CustomTrackingRecord) { TrackCustomRecord((CustomTrackingRecord)record); } else { throw new PlatformNotSupportedException(Resources.UnrecognizedTrackingRecord(record?.GetType().Name)); } }
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); } }