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()));
 }
Example #11
0
        /// <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));
            }
        }