private void AddTrackingRecord(InfoOfActivity info)
        {
            if (TrackingSource == null || info == null)
            {
                return;
            }

            TrackingSource.Activities.Add(info);

            if (MaxCount > 0)
            {
                while (TrackingSource.Activities.Count > MaxCount)
                {
                    TrackingSource.Activities.RemoveAt(0);
                }
            }
        }
예제 #2
0
        private string GetActivitiesStack(ActivityContext context)
        {
            if (!IsActivitiesStackIncluded.Get(context))
            {
                return(null);
            }

            var ext = ActivityHelpers.GetTraceExtension(context);

            if (ext == null || ext.NotUseActivityStackTrace)
            {
                return(null);
            }

            var activityStackTrace = ext.Get <ActivityStackTrace>(TraceExtension.ActivityTrackingSourcePropertyName);

            if (activityStackTrace == null)
            {
                return(null);
            }

            const string format   = "   {0} {1}";
            const string instr    = "in";
            const string errorstr = "error " + instr;
            var          ast      = new StringBuilder();

            var isFaultSource  = activityStackTrace.FaultSource == null;
            var isFaultHandler = activityStackTrace.FaultHandler == null;

            //Добавляем в stack текущую activity
            var carrentActivityInfo = new InfoOfActivity(name: DisplayName, id: Id,
                                                         instanceId: context.ActivityInstanceId,
                                                         typeName: GetType().FullName);

            if (activityStackTrace.Activities.All(a => a.CompareTo(carrentActivityInfo) != 0))
            {
                ast.AppendLine(string.Format(format, instr, carrentActivityInfo));
            }

            var count = activityStackTrace.Activities.Count;

            for (var i = count - 1; i >= 0; i--)
            {
                var a = activityStackTrace.Activities[i];
                if (!isFaultSource && activityStackTrace.FaultSource.CompareTo(a) == 0)
                {
                    isFaultSource = true;
                    ast.AppendLine(string.Format(format, errorstr, a));
                    continue;
                }

                if (!isFaultHandler && activityStackTrace.FaultHandler.CompareTo(a) == 0)
                {
                    isFaultHandler = true;
                }

                ast.AppendLine(string.Format(format, instr, a));
            }

            if (!isFaultSource)
            {
                ast.AppendLine(string.Format(format, "? -> " + errorstr, activityStackTrace.FaultSource));
            }

            if (!isFaultHandler)
            {
                if (count > 0)
                {
                    ast.AppendLine(string.Format(format, "...", null));
                }
                ast.AppendLine(string.Format(format, instr, activityStackTrace.FaultHandler));
            }

            if (ast.Length > 0)
            {
                ast.Append("--- End of stack trace activities ---");
            }
            var result = ast.ToString();

            //Чистим ошибку
            activityStackTrace.ClearFault();
            return(result);
        }