private void WriteItemLeveled( int level, IPerformanceRecordData item ) { var prior = new string(' ', level * 2); _output( "{0}[{1} - {2}] takes {3} msec, created at {4} {5}", new object[] { prior, item.StartTime.ToString("dd.MM.yyyy HH:mm:ss.fff"), DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss.fff"), item.TimeInterval, item.CreationStack, item.Exception != null ? "[" + item.Exception.Message + "]" : string.Empty }); var children = item.GetChildren(); if (children != null && children.Count > 0) { foreach (var citem in children) { WriteItemLeveled(level + 1, citem); } } }
public StringBuilder PrepareXml(IPerformanceRecordData item) { if (item == null) { throw new ArgumentNullException("item"); } var result = new StringBuilder(); //сначала внутренние рекорды var innerXml = new StringBuilder(); var children = item.GetChildren(); if (children != null && children.Count > 0) { foreach (var citem in children) { var childXml = PrepareXml(citem); innerXml.Append(childXml); } } //потом стек ексцепшенов //формируем строку xml var record0 = new StringBuilder(RecordXml); var record1 = record0.Replace( "{_ClassNameBase64_}", HttpUtility.UrlEncode(item.ClassName)); var record2 = record1.Replace( "{_MethodName_}", item.MethodName); var record3 = record2.Replace( "{_StartDate_}", item.StartTime.ToString("yyyyMMdd HH:mm:ss.fff")); var record4 = record3.Replace( "{_LogDate_}", DateTime.Now.ToString("yyyyMMdd HH:mm:ss.fff")); var record5 = record4.Replace( "{_TimeInterval_}", item.TimeInterval.ToString(CultureInfo.InvariantCulture)); var record6 = record5.Replace( "{_CreationStackBase64_}", HttpUtility.UrlEncode(item.CreationStack)); var record7 = record6.Replace( "{_IsException_}", item.Exception != null ? "True" : "False"); var record8 = record7.Replace( "{_Exception_}", item.Exception != null ? PrepareExceptionXml(item.Exception).ToString() : string.Empty); var record9 = record8.Replace( "{_Children_}", innerXml.ToString()); result.Append(record9); return result; }
public int AddIfNecessaryAndReturnId( IPerformanceRecordData item, Func<string, IPerformanceRecordData, int> storeStackFunc ) { if (item == null) { throw new ArgumentNullException("item"); } if (storeStackFunc == null) { throw new ArgumentNullException("storeStackFunc"); } int index; var key = GenerateKey(item.ClassName, item.MethodName); if (!_dict0.TryGetValue(key, out index)) { index = storeStackFunc(key, item); ForceAdd(key, index); } return index; }
public void Save( IPerformanceRecordData record ) { if (record == null) { throw new ArgumentNullException("record"); } //проверяем, не переполнилась ли очередь //при ливне событий, мы можем не успевать записывать if (_recordQueue.Count < MaximumQueueLength) { //очередь не переполнилась //если еще не стартовали - стартуем if (Interlocked.CompareExchange(ref _started, 1, 0) == 0) { this.WorkStart(); } _recordQueue.Enqueue(record); _newRecord.Set(); } }
public void SaveItems( IPerformanceRecordData[] items, int itemCount ) { //nothing to do }
private void SaveItem( IPerformanceRecordData item ) { if (item == null) { throw new ArgumentNullException("item"); } //готовим xml var xmlString = _xmlPreparator.PrepareXml(item); //сохраняем в сейверы foreach (var saver in _savers) { try { saver.Save(xmlString); } catch (Exception excp) { _logger.LogHandledException( this.GetType(), string.Format( "Ошибка работы сейвера {0}; его пропускаем", saver.GetType().Name), excp); } } }
public void SaveItems( IPerformanceRecordData[] items, int itemCount ) { if (items == null) { throw new ArgumentNullException("items"); } for (var cc = 0; cc < itemCount; cc++) { var item = items[cc]; SaveItem(item); } }
public void SaveItems( IPerformanceRecordData[] items, int itemCount ) { if (items == null) { throw new ArgumentNullException("items"); } lock (_locker) { for (var cc = 0; cc < itemCount; cc++) { var item = items[cc]; WriteItemLeveled(0, item); } } }
private void SaveItem( IPerformanceRecordData item ) { if (item == null) { throw new ArgumentNullException("item"); } var children = item.GetChildren(); Console.WriteLine( "[{0} - {1}] {2}.{3} || {4} || Children count = {5}", item.StartTime.ToString("yyyyMMdd HH:mm:ss.fff"), item.StartTime.AddSeconds(item.TimeInterval).ToString("yyyyMMdd HH:mm:ss.fff"), item.ClassName, item.MethodName, item.Exception != null ? item.Exception.Message : "-= NO EXCEPTION =-", children.Count ); }
private int InsertNewStackIfNecessary( IPerformanceRecordData item ) { if (item == null) { throw new ArgumentNullException("item"); } var stackId = _stackIdContainer.AddIfNecessaryAndReturnId( item, (itemKey, workItem) => { //такого стека нет, вставл¤ем _insertStackCommand.Parameters["class_name"].Value = CutOff(workItem.ClassName, SqlHelper.ClassNameMaxLength); _insertStackCommand.Parameters["method_name"].Value = CutOff(workItem.MethodName, SqlHelper.MethodNameMaxLength); _insertStackCommand.Parameters["creation_stack"].Value = workItem.CreationStack; _insertStackCommand.Parameters["key"].Value = itemKey; var workStackId = (int)_insertStackCommand.ExecuteScalar(); return workStackId; } ); return stackId; }
private void ConvertItem( List<DataRow> rows, long? parentId, IPerformanceRecordData item ) { if (rows == null) { throw new ArgumentNullException("rows"); } if (item == null) { throw new ArgumentNullException("item"); } //вставл¤ем стек, если необходимо var stackId = InsertNewStackIfNecessary(item); var exceptionMessage = item.Exception != null ? (object)CutOff(item.Exception.Message, SqlHelper.ExceptionMessageMaxLength) : null; var exceptionStack = item.Exception != null ? (object)item.Exception.StackTrace : null; var exceptionFullText = item.Exception != null ? (object)Exception2StringHelper.ToFullString(item.Exception) : null; var itemId = _lastRowIdContainer.GetIdForNewRow(); //!!! сделать индексы интовые, а не строковые var row = _targetTable.NewRow(); row["id"] = itemId; row["date_commit"] = DateTime.Now; row["id_parent"] = (object)parentId ?? DBNull.Value; row["start_time"] = item.StartTime; row["exception_message"] = exceptionMessage; row["exception_stack"] = exceptionStack; row["time_interval"] = item.TimeInterval; row["id_stack"] = stackId; row["exception_full_text"] = exceptionFullText; rows.Add(row); var children = item.GetChildren(); if (children != null) { foreach (var child in children) { ConvertItem( rows, itemId, child ); } } }
public void SaveItems( IPerformanceRecordData[] items, int itemCount ) { if (items == null) { throw new ArgumentNullException("items"); } //провер¤ем не настала ли пора удал¤ть старье CheckAndPerformCleanupIfNecessary(); //преобразуем итемы var rows = new List<DataRow>(itemCount); for (var cc = 0; cc < itemCount; cc++) { var item = items[cc]; ConvertItem( rows, null, item ); } //сохран¤ем итемы _copier.WriteToServer(rows.ToArray()); //инкрементим сколько скопировали Interlocked.Add(ref _processedItemCountSinceCleanup, itemCount); }
private long SaveItem( long? parentId, IPerformanceRecordData item ) { if (item == null) { throw new ArgumentNullException("item"); } //проверяем и вставляем стек, если необходимо var stackId = _stackIdContainer.AddIfNecessaryAndReturnId( item, (itemKey, workItem) => { //такого стека нет, вставляем _insertStackCommand.Parameters["class_name"].Value = CutOff(workItem.ClassName, SqlHelper.ClassNameMaxLength); _insertStackCommand.Parameters["method_name"].Value = CutOff(workItem.MethodName, SqlHelper.MethodNameMaxLength); _insertStackCommand.Parameters["creation_stack"].Value = workItem.CreationStack; _insertStackCommand.Parameters["key"].Value = itemKey; var workStackId = (int)_insertStackCommand.ExecuteScalar(); return workStackId; } ); var itemId = _lastRowIdContainer.GetIdForNewRow(); //вставляем остальные данные var exceptionMessage = item.Exception != null ? (object)CutOff(item.Exception.Message, SqlHelper.ExceptionMessageMaxLength) : null; var exceptionStack = item.Exception != null ? (object) item.Exception.StackTrace : null; var exceptionFullText = item.Exception != null ? (object) Exception2StringHelper.ToFullString(item.Exception) : null; _insertItemCommand.Parameters["id"].Value = itemId; _insertItemCommand.Parameters["id_parent"].Value = (object)parentId ?? DBNull.Value; _insertItemCommand.Parameters["start_time"].Value = item.StartTime; _insertItemCommand.Parameters["exception_message"].Value = exceptionMessage ?? DBNull.Value; _insertItemCommand.Parameters["exception_stack"].Value = exceptionStack ?? DBNull.Value; _insertItemCommand.Parameters["time_interval"].Value = item.TimeInterval; _insertItemCommand.Parameters["id_stack"].Value = stackId; _insertItemCommand.Parameters["exception_full_text"].Value = exceptionFullText ?? DBNull.Value; _insertItemCommand.ExecuteNonQuery(); var children = item.GetChildren(); if (children != null) { foreach (var child in children) { SaveItem(itemId, child); } } return itemId; }
public void SaveItems( IPerformanceRecordData[] items, int itemCount ) { if (items == null) { throw new ArgumentNullException("items"); } //проверяем не настала ли пора удалять старье CheckAndPerformCleanupIfNecessary(); //сохраняем итемы for (var cc = 0; cc < itemCount; cc++) { var item = items[cc]; if (item == null) { throw new InvalidOperationException("item"); } this.SaveItem( null, item ); Interlocked.Increment(ref _processedItemCountSinceCleanup); } }
public void Save( IPerformanceRecordData record ) { if (record == null) { throw new ArgumentNullException("record"); } //проверяем, не переполнилась ли очередь //при ливне событий, мы можем не успевать записывать var rc = _recordQueue.Count; if (rc < MaximumQueueLength) { //очередь не переполнилась //если еще не стартовали - стартуем if (Interlocked.CompareExchange(ref _started, 1, 0) == 0) { this.WorkStart(); } _recordQueue.Enqueue(record); if (rc + 1 >= BatchSize) { //итемов набралось на батч _doProcess.Set(); } } }