Esempio n. 1
0
        public PerformanceTelemetryPayload(
            IErrorContext errorContext,
            ITelemetryLogger logger,
            IThreadIdProvider threadIdProvider,
            IPerformanceContainer container,
            string className,
            string methodName)
        {
            if (errorContext == null)
            {
                throw new ArgumentNullException("errorContext");
            }
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }
            if (threadIdProvider == null)
            {
                throw new ArgumentNullException("threadIdProvider");
            }
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            if (className == null)
            {
                throw new ArgumentNullException("className");
            }
            if (methodName == null)
            {
                throw new ArgumentNullException("methodName");
            }

            this._errorContext = errorContext;
            this._logger = logger;
            this._container = container;

            this._manageThreadId = threadIdProvider.GetCurrentThreadId();

            this._record = _container.OpenPerformanceSession(
                this._manageThreadId,
                className,
                methodName);
        }
Esempio n. 2
0
        /// <summary>
        /// Создать запись
        /// </summary>
        /// <param name="className">Имя класса в котором зафиксировано событие</param>
        /// <param name="methodName">Имя метода в котором зафиксировано событие</param>
        /// <param name="parent">Родительская запись, если null - создается КОРНЕВАЯ запись</param>
        public IPerformanceRecord CreateChildRecord(
            string className,
            string methodName,
            IPerformanceRecord parent)
        {
            if (className == null)
            {
                throw new ArgumentNullException("className");
            }
            if (methodName == null)
            {
                throw new ArgumentNullException("methodName");
            }

            return
                new PerformanceRecord(
                    className,
                    methodName,
                    this,
                    _timerFactory,
                    parent);
        }
Esempio n. 3
0
        public void ClosePerformanceSession(int threadId, IPerformanceRecord closingRecord)
        {
            try
            {
                if (closingRecord == null)
                {
                    throw new ArgumentNullException("closingRecord");
                }

                closingRecord.Close();

                //определяем, если это корень умер, то после помирания сохраняем его в файл и удаляем из хранилища
                IPerformanceRecord containerRecord;
                if (_activeRecordDict.TryGetValue(threadId, out containerRecord))
                {
                    if (ReferenceEquals(containerRecord, closingRecord)) //сравнение тупо по ссылке
                    {
                        //удаляем
                        IPerformanceRecord removedObjet;
                        _activeRecordDict.TryRemove(threadId, out removedObjet);

                        //сохраняем
                        _saver.Save(closingRecord.GetPerformanceData());
                    }
                }
            }
            catch (Exception excp)
            {
                _logger.LogHandledException(
                    this.GetType(),
                    "Ошибка закрытия сессии перформанса",
                    excp);

                //пофигу, если статистика сломается, хост-приложение должно работать
            }
        }
Esempio n. 4
0
        public PerformanceRecord(
            string className,
            string methodName,
            IPerformanceRecordFactory recordFactory,
            IPerformanceTimerFactory timerFactory,
            IPerformanceRecord parent)
        {
            if (className == null)
            {
                throw new ArgumentNullException("className");
            }
            if (methodName == null)
            {
                throw new ArgumentNullException("methodName");
            }
            if (recordFactory == null)
            {
                throw new ArgumentNullException("recordFactory");
            }
            if (timerFactory == null)
            {
                throw new ArgumentNullException("timerFactory");
            }

            //parent allowed to be null


            _className = className;
            _methodName = methodName;
            _recordFactory = recordFactory;
            _parent = parent;

            Active = true;
            _diedChildren = new List<IPerformanceRecord>();

            var creationStack = new StackTrace(1, true).ToString(); //единица подобрана так, чтобы "служебные" фреймы перформанса не попадали в стек
            _creationStack = string.IsInterned(creationStack) ?? creationStack; //memory economy

            //Запоминаем время
            _startTime = timerFactory.GetCurrentTime();
            _timer = timerFactory.CreatePerformanceTimer();
        }