Beispiel #1
0
 /// <summary>
 ///   添加Event和Heartbeat
 /// </summary>
 /// <param name="manager"> </param>
 /// <param name="message"> </param>
 public void Add(DefaultMessageManager manager, IMessage message)
 {
     if ((_mStack.Count == 0))
     {
         var tree = _mTree.Copy();
         tree.MessageId = manager.NextMessageId();
         tree.Message   = message;
         manager.Flush(tree);
     }
     else
     {
         var entry = _mStack.Peek();
         entry.AddChild(message);
     }
 }
            public void TruncateAndFlush(Context ctx, long timestamp)
            {
                IMessageTree tree = ctx.Tree;
                ThreadSafeStack <ITransaction> stack = ctx.Stack;
                IMessage message = tree.Message;

                if (message is DefaultTransaction)
                {
                    string             id      = tree.MessageId;
                    string             rootId  = tree.RootMessageId;
                    string             childId = _mManager.NextMessageId();
                    DefaultTransaction source  = (DefaultTransaction)message;
                    DefaultTransaction target  = new DefaultTransaction(source.Type, source.Name, _mManager);

                    target.Timestamp        = source.Timestamp;
                    target.DurationInMicros = source.DurationInMicros;
                    target.AddData(source.Data);
                    target.Status = CatConstants.SUCCESS;

                    MigrateMessage(stack, source, target, 1);

                    int reducedByteSize = 0;
                    foreach (ITransaction transaction in stack)
                    {
                        DefaultTransaction tran = (DefaultTransaction)transaction;
                        tran.Timestamp   = timestamp;
                        reducedByteSize += transaction.EstimateByteSize();
                    }

                    DefaultEvent next = new DefaultEvent("RemoteCall", "Next");
                    next.AddData(childId);
                    next.Status = CatConstants.SUCCESS;
                    target.AddChild(next);

                    IMessageTree t = tree.Copy();

                    t.Message = target;

                    ctx.Tree.MessageId       = childId;
                    ctx.Tree.ParentMessageId = id;

                    ctx.Tree.RootMessageId = (rootId != null ? rootId : id);

                    ctx._mLength = stack.Count;
                    // Update estimated byte size of the truncated tree to be the total size of all on-stack transactions.
                    ctx.Tree.EstimatedByteSize = reducedByteSize;

                    ctx._mTotalDurationInMicros = ctx._mTotalDurationInMicros + target.DurationInMicros;
                    _mManager.Flush(t);
                }
            }
            /// <summary>
            ///   添加Event和Heartbeat
            /// </summary>
            /// <param name="manager"> </param>
            /// <param name="message"> </param>
            public void Add(IMessage message)
            {
                if ((_mStack.Count == 0))
                {
                    IMessageTree tree = _mTree.Copy();

                    if (String.IsNullOrWhiteSpace(tree.MessageId))
                    {
                        tree.MessageId = _mManager.NextMessageId();
                    }

                    tree.Message             = message;
                    tree.EstimatedByteSize   = message.EstimateByteSize();
                    _mTree.EstimatedByteSize = 0;
                    _mManager.Flush(tree);
                }
                else
                {
                    ITransaction parent = _mStack.Peek();
                    AddTransactionChild(message, parent);
                }
                Tree.EstimatedByteSize += message.EstimateByteSize();
            }
            private void TruncateAndFlush(DefaultMessageManager manager, long timestamp)
            {
                IMessageTree         tree    = _mTree;
                Stack <ITransaction> stack   = _mStack;
                IMessage             message = tree.Message;

                if (message is DefaultTransaction)
                {
                    if (tree.MessageId == null)
                    {
                        tree.MessageId = manager.NextMessageId();
                    }

                    string rootId  = tree.RootMessageId;
                    string childId = manager.NextMessageId();

                    DefaultTransaction source = message as DefaultTransaction;
                    DefaultTransaction target = new DefaultTransaction(source.Type, source.Name, manager);
                    target.Timestamp        = source.Timestamp;
                    target.DurationInMicros = source.DurationInMicros;
                    target.AddData(source.Data);
                    target.Status = PureCatConstants.SUCCESS;

                    MigrateMessage(manager, stack, source, target, 1);

                    var list = stack.ToList();

                    for (int i = list.Count - 1; i >= 0; i--)
                    {
                        DefaultTransaction tran = list[i] as DefaultTransaction;
                        tran.Timestamp        = timestamp;
                        tran.DurationInMicros = -1;
                    }

                    IEvent next = new DefaultEvent(PureCatConstants.TYPE_REMOTE_CALL, "Next");
                    next.AddData(childId);
                    next.Status = PureCatConstants.SUCCESS;
                    target.AddChild(next);

                    IMessageTree t = tree.Copy();

                    t.Message = target;

                    _mTree.MessageId       = childId;
                    _mTree.ParentMessageId = tree.MessageId;
                    _mTree.RootMessageId   = rootId ?? tree.MessageId;

                    manager.Flush(t);
                }
            }