Exemplo n.º 1
0
        internal Activity(
            string activityName,
            ActivityLogLevel logLevel,
            string activityId,
            Activity root,
            Activity parent,
            string distributedTracingParentOperationId,
            string distributedTracingGlobalOperationId,
            LogicalExecutionStack logicalExecutionStack)
        {
            this.LogicalExecutionStack = Util.EnsureNotNull(logicalExecutionStack, nameof(logicalExecutionStack));

            this.Name     = Util.EnsureNotNullOrEmpty(activityName, nameof(activityName));
            this.LogLevel = logLevel;
            this.Status   = ActivityStatus.Running;

            this.ActivityId     = Util.EnsureNotNullOrEmpty(activityId, nameof(activityId));
            this.RootActivity   = root ?? this;
            this.ParentActivity = parent;

            this.DistributedTracingParentOperationId = distributedTracingParentOperationId;  // may be null
            this.DistributedTracingGlobalOperationId = distributedTracingGlobalOperationId;  // may be null

            this.StartTime = DateTimeOffset.Now;
            this.EndTime   = default(DateTimeOffset);

            this.FaultException       = null;
            this.FaultMessage         = null;
            this.InitialFaultActivity = null;
            this.FaultId = null;
        }
        public Activity StartNewActivity(string activityName, ActivityLogLevel logLevel)
        {
            activityName = ValidateActivityName(activityName);

            string parentOperationId, globalOperationId;

            TryGetDistributedTracingContext(out parentOperationId, out globalOperationId);

            LogicalExecutionStack currentLogicalStack = GetOrCreateCurrentLogicalStack();

            lock (currentLogicalStack)
            {
                Activity parent = currentLogicalStack.Peek(); // may be null

                var activity = new Activity(
                    activityName,
                    logLevel,
                    Util.CreateRandomId(),
                    parent?.RootActivity,
                    parent,
                    parentOperationId,
                    globalOperationId,
                    currentLogicalStack);

                currentLogicalStack.Push(activity);

                return(activity);
            }
        }
        private void FailActivity(Activity activity, Exception exception, string failureMessage)
        {
            DateTimeOffset now = DateTimeOffset.Now;

            LogicalExecutionStack logicalStack = _logicalExecutionThread.Value;

            if (logicalStack == null)
            {
                throw new InvalidOperationException(ExceptionMsg_ActivityStartEndMismatch);
            }

            if (logicalStack != activity.LogicalExecutionStack)
            {
                throw new InvalidOperationException(ExceptionMsg_ActivityStacksMismatch);
            }

            var faultedActivities = new List <Activity>();

            lock (logicalStack)
            {
                Activity poppedActivity;
                do
                {
                    poppedActivity = logicalStack.Pop();
                    faultedActivities.Add(poppedActivity);
                }while (poppedActivity != activity);

                if (logicalStack.Count == 0)
                {
                    _logicalExecutionThread.Value = logicalStack.ParentStack;
                }
            }

            string faultId = Util.CreateRandomId();

            for (int i = 0; i < faultedActivities.Count; i++)
            {
                Activity    faultedActivity     = faultedActivities[i];
                IDisposable associatedOperation = faultedActivity.AssociatedOperation;

                faultedActivity.TransitionToFaulted(exception, now, failureMessage, activity, faultId);
                _pipeline.ProcessAndSend(faultedActivity);

                if (associatedOperation != null)
                {
                    var telemetry = associatedOperation as OperationTelemetry;
                    if (telemetry != null)
                    {
                        telemetry.Success = true;
                    }

                    associatedOperation.Dispose();
                }
            }
        }
        private Activity PeekCurrentActivityToUseProperties()
        {
            LogicalExecutionStack logicalStack = _logicalExecutionThread.Value;

            if (logicalStack == null)
            {
                throw new InvalidOperationException(ExceptionMsg_CannotAccessActivityToUseProperties);
            }

            lock (logicalStack)
            {
                Activity activity = logicalStack.Peek();
                return(activity);
            }
        }
        private void FailCurrentActivity(Exception exception, string failureMessage)
        {
            DateTimeOffset now = DateTimeOffset.Now;

            LogicalExecutionStack logicalStack = _logicalExecutionThread.Value;

            if (logicalStack == null)
            {
                throw new InvalidOperationException(ExceptionMsg_ActivityStartEndMismatch);
            }

            Activity activity;

            lock (logicalStack)
            {
                activity = logicalStack.Pop();

                if (logicalStack.Count == 0)
                {
                    _logicalExecutionThread.Value = logicalStack.ParentStack;
                }
            }

            IDisposable associatedOperation = activity.AssociatedOperation;

            activity.TransitionToFaulted(exception, now, failureMessage, activity, Util.CreateRandomId());
            _pipeline.ProcessAndSend(activity);

            if (associatedOperation != null)
            {
                var telemetry = associatedOperation as OperationTelemetry;
                if (telemetry != null)
                {
                    telemetry.Success = true;
                }

                associatedOperation.Dispose();
            }
        }
        public void CompleteActivity()
        {
            DateTimeOffset now = DateTimeOffset.Now;

            LogicalExecutionStack logicalStack = _logicalExecutionThread.Value;

            if (logicalStack == null)
            {
                throw new InvalidOperationException(ExceptionMsg_ActivityStartEndMismatch);
            }

            Activity activity;

            lock (logicalStack)
            {
                activity = logicalStack.Pop();

                if (logicalStack.Count == 0)
                {
                    _logicalExecutionThread.Value = logicalStack.ParentStack;
                }
            }

            IDisposable associatedOperation = activity.AssociatedOperation;

            activity.TransitionToComplete(now);
            _pipeline.ProcessAndSend(activity);

            if (associatedOperation != null)
            {
                var telemetry = associatedOperation as OperationTelemetry;
                if (telemetry != null)
                {
                    telemetry.Success = true;
                }

                associatedOperation.Dispose();
            }
        }
        private LogicalExecutionStack GetOrCreateCurrentLogicalStack()
        {
            LogicalExecutionStack currentLogicalStack = _logicalExecutionThread.Value;

            if (currentLogicalStack != null)
            {
                return(currentLogicalStack);
            }

            LogicalExecutionStack newLogicalStack = new LogicalExecutionStack(parentStack: null);

            lock (_logicalExecutionThread)
            {
                currentLogicalStack = _logicalExecutionThread.Value;
                if (currentLogicalStack != null)
                {
                    return(currentLogicalStack);
                }

                _logicalExecutionThread.Value = newLogicalStack;
                return(newLogicalStack);
            }
        }
        public Activity StartNewLogicalActivityThread(string activityName, ActivityLogLevel logLevel)
        {
            activityName = ValidateActivityName(activityName);

            string parentOperationId, globalOperationId;

            TryGetDistributedTracingContext(out parentOperationId, out globalOperationId);

            LogicalExecutionStack currentLogicalStack = _logicalExecutionThread.Value;

            object lockScope = currentLogicalStack;

            lockScope = lockScope ?? _logicalExecutionThread;

            lock (lockScope)
            {
                Activity parent = currentLogicalStack?.Peek();  // may be null

                var newLogicalStack = new LogicalExecutionStack(currentLogicalStack);

                var activity = new Activity(
                    activityName,
                    logLevel,
                    Util.CreateRandomId(),
                    parent?.RootActivity,
                    parent,
                    parentOperationId,
                    globalOperationId,
                    newLogicalStack);

                newLogicalStack.Push(activity);

                _logicalExecutionThread.Value = newLogicalStack;

                return(activity);
            }
        }
 public LogicalExecutionStack(LogicalExecutionStack parentStack)
 {
     this.ParentStack = parentStack;
 }