void HandleActivityEvent(ActivityEventBase evt, ActivityType type, string activityMatchingId = null) { var eventInfo = new EventInfo(evt, currentTimeOffsets); SetOrigin(eventInfo); if (evt.Type == ActivityEventType.Begin || evt.Type == ActivityEventType.PotentialBegin) { var activity = new StartedActivity() { begin = eventInfo, beginOwner = currentPostprocessorOutput, type = type, activityMatchingId = activityMatchingId, milestones = new List <ActivityMilestone>(), phases = new List <ActivityPhase>(), mayLackEnd = evt.Type == ActivityEventType.PotentialBegin }; startedActivities[evt.ActivityId] = activity; if (activity.status == ActivityStatus.Unspecified) { activity.status = evt.Status; } AddPhases(activity, evt); } else if (evt.Type == ActivityEventType.End) { StartedActivity startedActivity; if (startedActivities.TryGetValue(evt.ActivityId, out startedActivity)) { AddPhases(startedActivity, evt); if (startedActivity.status == ActivityStatus.Unspecified) { startedActivity.status = evt.Status; } YieldActivity(startedActivity, eventInfo, currentPostprocessorOutput, allowTakingEndsDisplayName: true); startedActivities.Remove(evt.ActivityId); } } else if (evt.Type == ActivityEventType.Milestone) { StartedActivity startedActivity; if (startedActivities.TryGetValue(evt.ActivityId, out startedActivity)) { startedActivity.milestones.Add(new ActivityMilestone( null, currentPostprocessorOutput, eventInfo.timestamp - origin, evt.DisplayName, evt.Trigger )); AddPhases(startedActivity, evt); } } }
void UpdateStatus(StartedActivity activity, ActivityStatus eventStatus) { if (activity.status == ActivityStatus.Unspecified) { activity.status = eventStatus; } else if (eventStatus == ActivityStatus.Error) { activity.status = eventStatus; } }
void AddPhases(StartedActivity startedActivity, ActivityEventBase evt) { if (evt.Phases != null && evt.Phases.Count > 0 && startedActivity.phases.Count == 0) { startedActivity.phases.AddRange(evt.Phases.Select(ph => new ActivityPhase( null, currentPostprocessorOutput, startedActivity.begin.timestamp - origin + ph.Begin, startedActivity.begin.timestamp - origin + ph.End, ph.Type, ph.DisplayName ))); } }
void YieldActivity(StartedActivity startedActivity, EventInfo endEvtInfo, ITimelinePostprocessorOutput endOwner, bool allowTakingEndsDisplayName) { var begin = startedActivity.begin; activities.Add(new ActivityImpl( startedActivity.beginOwner, endOwner, begin.timestamp - origin, endEvtInfo.timestamp - origin, (startedActivity.type == ActivityType.Lifespan && allowTakingEndsDisplayName && endEvtInfo.evt.DisplayName.Length > begin.evt.DisplayName.Length) ? endEvtInfo.evt.DisplayName : // for lifespans get End's display name because it may be more specific than Begin's one begin.evt.DisplayName, startedActivity.activityMatchingId, startedActivity.type, begin.evt.Trigger, endEvtInfo.evt.Trigger, startedActivity.milestones, startedActivity.begin.evt.Tags.Concat(endEvtInfo.evt.Tags) )); }
void YieldActivity(StartedActivity startedActivity, EventInfo endEvtInfo, ITimelinePostprocessorOutput endOwner, bool isEndedForcefully) { var begin = startedActivity.begin; activities.Add(new ActivityImpl( startedActivity.beginOwner, endOwner, begin.timestamp - origin, endEvtInfo.timestamp - origin, (startedActivity.type == ActivityType.Lifespan && !isEndedForcefully && endEvtInfo.evt.DisplayName.Length > begin.evt.DisplayName.Length) ? endEvtInfo.evt.DisplayName : // for lifespans get End's display name because it may be more specific than Begin's one begin.evt.DisplayName, startedActivity.activityMatchingId, startedActivity.type, begin.evt.Trigger, endEvtInfo.evt.Trigger, startedActivity.milestones, startedActivity.phases, startedActivity.begin.evt.Tags.Concat(endEvtInfo.evt.Tags), isError: startedActivity.status == ActivityStatus.Error, isEndedForcefully: isEndedForcefully )); }