Example #1
0
        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);
                }
            }
        }
Example #2
0
        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;
        }
Example #3
0
        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;
        }
Example #4
0
        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();
            }
        }
Example #5
0
 public void SaveItems(
     IPerformanceRecordData[] items,
     int itemCount
     )
 {
     //nothing to do
 }
Example #6
0
        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);
                }
            }
        }
Example #7
0
        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);
            }
        }
Example #8
0
        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);
                }
            }
        }
Example #9
0
        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
                );
        }
Example #10
0
        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;
        }
Example #11
0
        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
                        );
                }
            }

        }
Example #12
0
        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);
        }
Example #13
0
        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;
        }
Example #14
0
        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);
            }
        }
Example #15
0
        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();
                }
            }
        }