Commit 235ec75c authored by ascrutae's avatar ascrutae
Browse files

1.添加分支节点对象

2.完成merge的功能
parent 3006c7fa
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
package com.ai.cloud.skywalking.analysis.chainbuild.entity;

import java.util.List;

public class BranchTraceSpanNode extends TraceSpanNode {


    protected BranchTraceSpanNode(TraceSpanNode origin, TraceSpanNode dest,
                                  List<TraceSpanNode> spanContainer) {

        setNextBranchNode(dest);
        dest.parent = this;

        dest.setNextBranchNode(origin);
        origin.parent = this;

        this.setParent(dest.parent);
        this.branchNode = true;
        spanContainer.add(this);
    }

    public boolean hasNextBranch() {
        return nextBranchNode != null;
    }

    public TraceSpanNode nextBranch() {
        return nextBranchNode;
    }

    public void addBranch(TraceSpanNode branch) {
        TraceSpanNode lastBranchNode = null;
        while (hasNextBranch()) {
            lastBranchNode = nextBranchNode;
        }

        lastBranchNode.nextBranchNode = branch;
        branch.parent = this;
    }
}
+17 −0
Original line number Diff line number Diff line
@@ -89,6 +89,15 @@ public class TraceSpanNode {
    @Expose
    protected String applicationId = "";

    /**
     * 是否为分支节点
     */
    @Expose
    protected boolean branchNode;

    @Expose
    protected TraceSpanNode nextBranchNode;

    /**
     * Warning: call this constructor ONLY by gson for deserialize
     */
@@ -234,6 +243,10 @@ public class TraceSpanNode {
        this.parent = parent;
    }

    public void setNextBranchNode(TraceSpanNode nextBranchNode){
        this.nextBranchNode = nextBranchNode;
    }

    public void setSub(TraceSpanNode sub) {
        this.sub = sub;
    }
@@ -303,4 +316,8 @@ public class TraceSpanNode {
            subNodeRefToken = sub.getNodeRefToken();
        }
    }

    public boolean isBranchNode() {
        return branchNode;
    }
}
+293 −236
Original line number Diff line number Diff line
package com.ai.cloud.skywalking.analysis.chainbuild.entity;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.io.Writable;
import org.mortbay.log.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ai.cloud.skywalking.analysis.chainbuild.exception.BuildTraceSpanTreeException;
import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeNotFountException;
import com.ai.cloud.skywalking.analysis.chainbuild.exception.TraceSpanTreeSerializeException;
@@ -29,6 +12,14 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.annotations.Expose;
import com.google.gson.reflect.TypeToken;
import org.apache.hadoop.io.Writable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.*;

public class TraceSpanTree implements Writable {
    private Logger logger = LoggerFactory.getLogger(TraceSpanTree.class);
@@ -250,4 +241,70 @@ public class TraceSpanTree implements Writable {
    public String getCid() {
        return cid;
    }

    public void merge(TraceSpanTree spanTree) {
        if (spanTree.getTreeRoot().hasNext()) {
            SpanTreeMerger.merge(spanTree.getTreeRoot().next, treeRoot.next, spanContainer);
        }

        if (spanTree.getTreeRoot().hasSub()) {
            SpanTreeMerger.merge(spanTree.getTreeRoot().sub, treeRoot.sub, spanContainer);
        }
    }

    private static class SpanTreeMerger {
        public static boolean merge(TraceSpanNode origin, TraceSpanNode dest, List<TraceSpanNode> spanContainer) {
            boolean flag = false;
            if (origin == null || dest == null) {
                if (origin != null && dest == null) {
                    dest.parent.sub = origin;
                    origin.parent = dest.parent;
                    return true;
                }
                return true;
            }

            if (dest.isBranchNode()) {
                BranchTraceSpanNode branchTraceSpanNode = (BranchTraceSpanNode) dest;
                boolean branchFlag = false;
                while (branchTraceSpanNode.hasNextBranch()) {
                    branchFlag = merge(origin, branchTraceSpanNode.nextBranch(), spanContainer);
                    if (branchFlag) {
                        break;
                    }
                }

                if (branchFlag) {
                    return true;
                } else {
                    branchTraceSpanNode.addBranch(origin);
                    return false;
                }
            }

            if (origin.isVisualNode() || dest.isVisualNode()) {
                boolean nextFlag = merge(origin.next, dest.next, spanContainer);
                boolean subFlag = merge(origin.sub, dest.sub, spanContainer);

                if (subFlag && nextFlag) {
                    // 合并子树数据
                } else {
                    new BranchTraceSpanNode(origin, dest, spanContainer);
                }
                flag = nextFlag && nextFlag;
            } else {
                if (origin.nodeRefToken.equals(dest.nodeRefToken)) {
                    // 合并子树数据
                    flag = true;
                } else {
                    new BranchTraceSpanNode(origin, dest, spanContainer);
                    flag = false;
                }
                flag = flag && merge(origin.next, dest.next, spanContainer);
                flag = flag && merge(origin.sub, dest.sub, spanContainer);
            }

            return flag;
        }
    }
}