コード例 #1
0
ファイル: TcpMessageSender.cs プロジェクト: unidal/cat.net
        private IMessageTree MergeTree(BlockingThreadSafeQueue <IMessageTree> trees)
        {
            int max = MAX_ATOMIC_MESSAGES - 1;
            DefaultTransaction tran = new DefaultTransaction("_CatMergeTree", "_CatMergeTree", null);

            tran.Status = CatConstants.SUCCESS;
            tran.SetCompleted(true);

            IMessageTree first;

            trees.TryPeek(out first, false);

            // Usually this should not happen, because it is in the same thread with ShouldMerge()
            if (first == null)
            {
                return(null);
            }

            // Set merge tree start time to the first massage's timestamp
            tran.Timestamp = first.Message.Timestamp;

            long lastTimestamp     = 0;
            long lastDuration      = 0;
            int  estimatedByteSize = 0;

            while (max >= 0)
            {
                IMessageTree tree;
                trees.TryDequeue(out tree, false);

                if (tree != null)
                {
                    tran.AddChild(tree.Message);
                    estimatedByteSize += tree.EstimatedByteSize;

                    if (first != tree)
                    {
                        _messageIdFactory.Reuse(tree.MessageId);
                    }

                    lastTimestamp = tree.Message.Timestamp;
                    if (tree.Message is DefaultTransaction)
                    {
                        lastDuration = ((DefaultTransaction)tree.Message).DurationInMillis;
                    }
                    else
                    {
                        lastDuration = 0;
                    }
                }

                if (tree == null || max == 0)
                {
                    // Set merge tree end time to the last massage's end time
                    tran.DurationInMillis = (lastTimestamp - tran.Timestamp + lastDuration);
                    break;
                }
                max--;
            }
            ((DefaultMessageTree)first).Message = tran;
            estimatedByteSize      += tran.EstimateByteSize();
            first.EstimatedByteSize = estimatedByteSize;
            return(first);
        }
コード例 #2
0
        protected internal IMessage DecodeLine(ChannelBuffer buf, ITransaction parent,
                                               Stack <ITransaction> stack, IMessageTree tree)
        {
            BufferHelper helper     = _mBufferHelper;
            byte         identifier = buf.ReadByte();
            String       timestamp  = helper.Read(buf, TAB);
            String       type       = helper.Read(buf, TAB);
            String       name       = helper.Read(buf, TAB);

            if (identifier == 'E')
            {
                IMessage evt    = new DefaultEvent(type, name);
                String   status = helper.Read(buf, TAB);
                String   data   = helper.ReadRaw(buf, TAB);

                helper.Read(buf, LF); // get rid of line feed
                evt.Timestamp = _mDateHelper.Parse(timestamp);
                evt.Status    = status;
                evt.AddData(data);

                if (parent != null)
                {
                    parent.AddChild(evt);
                    tree.EstimatedByteSize += evt.EstimateByteSize();
                    return(parent);
                }
                return(evt);
            }
            if (identifier == 'M')
            {
                DefaultMetric metric = new DefaultMetric(type, name);
                String        status = helper.Read(buf, TAB);
                String        data   = helper.ReadRaw(buf, TAB);

                helper.Read(buf, LF); // get rid of line feed
                metric.Timestamp = _mDateHelper.Parse(timestamp);
                metric.Status    = status;
                metric.AddData(data);

                if (parent != null)
                {
                    parent.AddChild(metric);
                    tree.EstimatedByteSize += metric.EstimateByteSize();
                    return(parent);
                }
                return(metric);
            }
            if (identifier == 'H')
            {
                IMessage heartbeat = new DefaultHeartbeat(type, name);
                String   status0   = helper.Read(buf, TAB);
                String   data1     = helper.ReadRaw(buf, TAB);

                helper.Read(buf, LF); // get rid of line feed
                heartbeat.Timestamp = _mDateHelper.Parse(timestamp);
                heartbeat.Status    = status0;
                heartbeat.AddData(data1);

                if (parent != null)
                {
                    parent.AddChild(heartbeat);
                    tree.EstimatedByteSize += heartbeat.EstimateByteSize();
                    return(parent);
                }
                return(heartbeat);
            }
            if (identifier == 't')
            {
                IMessage transaction = new DefaultTransaction(type, name,
                                                              null);

                helper.Read(buf, LF); // get rid of line feed
                transaction.Timestamp = _mDateHelper.Parse(timestamp);

                if (parent != null)
                {
                    parent.AddChild(transaction);
                    tree.EstimatedByteSize += transaction.EstimateByteSize();
                }

                stack.Push(parent);
                return(transaction);
            }
            if (identifier == 'A')
            {
                ITransaction transaction2 = new DefaultTransaction(type, name, null);
                String       status3      = helper.Read(buf, TAB);
                String       duration     = helper.Read(buf, TAB);
                String       data4        = helper.ReadRaw(buf, TAB);

                helper.Read(buf, LF); // get rid of line feed
                transaction2.Timestamp = _mDateHelper.Parse(timestamp);
                transaction2.Status    = status3;
                transaction2.AddData(data4);

                long d = Int64.Parse(duration.Substring(0, duration.Length - 2), NumberStyles.Integer);
                transaction2.DurationInMicros = d;

                if (parent != null)
                {
                    parent.AddChild(transaction2);
                    tree.EstimatedByteSize += transaction2.EstimateByteSize();
                    return(parent);
                }
                return(transaction2);
            }
            if (identifier == 'T')
            {
                String status5   = helper.Read(buf, TAB);
                String duration6 = helper.Read(buf, TAB);
                String data7     = helper.ReadRaw(buf, TAB);

                helper.Read(buf, LF); // get rid of line feed
                parent.Status = status5;
                parent.AddData(data7);

                long d8 = Int64.Parse(
                    duration6.Substring(0, duration6.Length - 2),
                    NumberStyles.Integer);
                parent.DurationInMicros = d8;

                return(stack.Pop());
            }
            Logger.Error("Unknown identifier(" + identifier + ") of message: " + buf);

            // unknown message, ignore it
            return(parent);
        }