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); }
/// <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); }
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); //пофигу, если статистика сломается, хост-приложение должно работать } }
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(); }