Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
月轩居士
SkyWalking
提交
235ec75c
S
SkyWalking
项目概览
月轩居士
/
SkyWalking
与 Fork 源项目一致
Fork自
apache / SkyWalking
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SkyWalking
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
235ec75c
编写于
3月 03, 2016
作者:
A
ascrutae
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.添加分支节点对象
2.完成merge的功能
上级
3006c7fa
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
349 addition
and
236 deletion
+349
-236
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/BranchTraceSpanNode.java
...lking/analysis/chainbuild/entity/BranchTraceSpanNode.java
+39
-0
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java
.../skywalking/analysis/chainbuild/entity/TraceSpanNode.java
+17
-0
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java
.../skywalking/analysis/chainbuild/entity/TraceSpanTree.java
+293
-236
未找到文件。
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/BranchTraceSpanNode.java
0 → 100644
浏览文件 @
235ec75c
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
;
}
}
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanNode.java
浏览文件 @
235ec75c
...
...
@@ -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
;
}
}
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java
浏览文件 @
235ec75c
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,225 +12,299 @@ 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
);
@Expose
private
String
userId
=
null
;
@Expose
private
String
cid
;
@Expose
private
TraceSpanNode
treeRoot
;
@Expose
private
List
<
TraceSpanNode
>
spanContainer
=
new
ArrayList
<
TraceSpanNode
>();
private
Map
<
String
,
TraceSpanNode
>
traceSpanNodeMap
=
new
HashMap
<
String
,
TraceSpanNode
>();
public
TraceSpanTree
()
{
}
public
String
build
(
List
<
Span
>
spanList
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
spanList
.
size
()
==
0
)
{
throw
new
BuildTraceSpanTreeException
(
"spanList is empty."
);
}
Collections
.
sort
(
spanList
,
new
Comparator
<
Span
>()
{
@Override
public
int
compare
(
Span
span1
,
Span
span2
)
{
String
span1TraceLevel
=
span1
.
getParentLevel
()
+
"."
+
span1
.
getLevelId
();
String
span2TraceLevel
=
span2
.
getParentLevel
()
+
"."
+
span2
.
getLevelId
();
return
span1TraceLevel
.
compareTo
(
span2TraceLevel
);
}
});
Span
span
=
spanList
.
get
(
0
);
if
(!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
userId
=
span
.
getUserId
();
}
else
{
throw
new
BuildTraceSpanTreeException
(
"spanList[0] 's userId is null"
);
}
cid
=
generateCID
(
spanList
.
get
(
0
));
treeRoot
=
new
TraceSpanNode
(
null
,
null
,
null
,
null
,
spanList
.
get
(
0
),
spanContainer
);
if
(
spanList
.
size
()
>
1
)
{
for
(
int
i
=
1
;
i
<
spanList
.
size
();
i
++)
{
this
.
build
(
spanList
.
get
(
i
));
}
}
return
cid
;
}
private
void
build
(
Span
span
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
userId
==
null
&&
!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
userId
=
span
.
getUserId
();
}
TraceSpanNode
clientOrServerNode
=
findNodeAndCreateVisualNodeIfNess
(
span
.
getParentLevel
(),
span
.
getLevelId
());
if
(
clientOrServerNode
!=
null
)
{
clientOrServerNode
.
mergeSpan
(
span
);
}
if
(
span
.
getLevelId
()
>
0
)
{
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
span
.
getParentLevel
(),
span
.
getLevelId
()
-
1
);
/**
* Create node between foundNode and foundNode.next(maybe
* foundNode.next == null)
*/
new
TraceSpanNode
(
null
,
null
,
foundNode
,
foundNode
.
next
(
this
),
span
,
spanContainer
);
}
else
{
/**
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
* find node[parentLevelId=0.0,levelId=1]
*/
String
parentLevel
=
span
.
getParentLevel
();
int
idx
=
parentLevel
.
lastIndexOf
(
"\\."
);
if
(
idx
<
0
)
{
throw
new
BuildTraceSpanTreeException
(
"parentLevel="
+
parentLevel
+
" is unexpected."
);
}
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
parentLevel
.
substring
(
0
,
idx
),
Integer
.
parseInt
(
parentLevel
.
substring
(
idx
+
1
)));
/**
* Create sub node of using span data. FoundNode is parent node.
*/
new
TraceSpanNode
(
foundNode
,
null
,
null
,
null
,
span
,
spanContainer
);
}
}
private
TraceSpanNode
findNodeAndCreateVisualNodeIfNess
(
String
parentLevelId
,
int
levelId
)
throws
TraceSpanTreeNotFountException
{
String
levelDesc
=
StringUtil
.
isBlank
(
parentLevelId
)
?
(
levelId
+
""
)
:
(
parentLevelId
+
"."
+
levelId
);
String
[]
levelArray
=
levelDesc
.
split
(
"\\."
);
TraceSpanNode
currentNode
=
treeRoot
;
String
contextParentLevelId
=
""
;
for
(
String
currentLevel
:
levelArray
)
{
int
currentLevelInt
=
Integer
.
parseInt
(
currentLevel
);
for
(
int
i
=
0
;
i
<
currentLevelInt
;
i
++)
{
if
(
currentNode
.
hasNext
())
{
currentNode
=
currentNode
.
next
(
this
);
}
else
{
// create visual next node
currentNode
=
new
VisualTraceSpanNode
(
null
,
null
,
currentNode
,
null
,
contextParentLevelId
,
i
,
spanContainer
);
}
}
contextParentLevelId
=
contextParentLevelId
==
""
?
(
""
+
currentLevelInt
)
:
(
contextParentLevelId
+
"."
+
currentLevelInt
);
if
(
currentNode
.
hasSub
())
{
currentNode
=
currentNode
.
sub
(
this
);
}
else
{
// create visual sub node
currentNode
=
new
VisualTraceSpanNode
(
currentNode
,
null
,
null
,
null
,
contextParentLevelId
,
0
,
spanContainer
);
}
}
return
currentNode
;
}
private
String
generateCID
(
Span
level0Span
)
throws
BuildTraceSpanTreeException
{
if
(
StringUtil
.
isBlank
(
level0Span
.
getParentLevel
())
&&
level0Span
.
getLevelId
()
==
0
)
{
StringBuilder
chainTokenDesc
=
new
StringBuilder
();
chainTokenDesc
.
append
(
userId
).
append
(
"_"
);
chainTokenDesc
.
append
(
level0Span
.
getViewPointId
());
return
getTSBySpanTraceId
(
level0Span
)
+
"_"
+
TokenGenerator
.
generateCID
(
chainTokenDesc
.
toString
());
}
else
{
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
level0Span
.
getTraceId
()
+
" level0 span data is illegal"
);
}
}
private
static
String
getTSBySpanTraceId
(
Span
span
)
throws
BuildTraceSpanTreeException
{
try
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
new
Date
(
Long
.
parseLong
(
span
.
getTraceId
().
split
(
"\\."
)[
2
])));
return
calendar
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
calendar
.
get
(
Calendar
.
MONTH
)
+
1
);
}
catch
(
Throwable
t
)
{
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
span
.
getTraceId
()
+
" is illegal."
);
}
}
private
void
beforeSerialize
()
throws
TraceSpanTreeSerializeException
{
for
(
TraceSpanNode
treeNode
:
spanContainer
)
{
treeNode
.
serializeRef
();
}
}
public
String
serialize
()
throws
TraceSpanTreeSerializeException
{
beforeSerialize
();
return
new
GsonBuilder
().
excludeFieldsWithoutExposeAnnotation
()
.
create
().
toJson
(
this
);
}
TraceSpanNode
findNode
(
String
nodeRefToken
)
throws
TraceSpanTreeNotFountException
{
if
(
traceSpanNodeMap
.
containsKey
(
nodeRefToken
))
{
return
traceSpanNodeMap
.
get
(
nodeRefToken
);
}
else
{
throw
new
TraceSpanTreeNotFountException
(
"nodeRefToken="
+
nodeRefToken
+
" not found."
);
}
}
@Override
public
void
write
(
DataOutput
out
)
throws
IOException
{
try
{
out
.
write
(
serialize
().
getBytes
());
}
catch
(
TraceSpanTreeSerializeException
e
)
{
logger
.
error
(
"Failed to serialize Chain Id["
+
cid
+
"]"
,
e
);
}
}
@Override
public
void
readFields
(
DataInput
in
)
throws
IOException
{
String
value
=
in
.
readLine
();
try
{
JsonObject
jsonObject
=
(
JsonObject
)
new
JsonParser
().
parse
(
value
);
userId
=
jsonObject
.
get
(
"userId"
).
getAsString
();
cid
=
jsonObject
.
get
(
"cid"
).
getAsString
();
treeRoot
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"treeRoot"
),
TraceSpanNode
.
class
);
spanContainer
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"spanContainer"
),
new
TypeToken
<
List
<
TraceSpanNode
>>()
{
}.
getType
());
for
(
TraceSpanNode
node
:
spanContainer
)
{
traceSpanNodeMap
.
put
(
node
.
getNodeRefToken
(),
node
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"Failed to parse the value["
+
value
+
"] to TraceSpanTree Object"
,
e
);
}
}
public
TraceSpanNode
getTreeRoot
()
{
return
treeRoot
;
}
public
String
getCid
()
{
return
cid
;
}
private
Logger
logger
=
LoggerFactory
.
getLogger
(
TraceSpanTree
.
class
);
@Expose
private
String
userId
=
null
;
@Expose
private
String
cid
;
@Expose
private
TraceSpanNode
treeRoot
;
@Expose
private
List
<
TraceSpanNode
>
spanContainer
=
new
ArrayList
<
TraceSpanNode
>();
private
Map
<
String
,
TraceSpanNode
>
traceSpanNodeMap
=
new
HashMap
<
String
,
TraceSpanNode
>();
public
TraceSpanTree
()
{
}
public
String
build
(
List
<
Span
>
spanList
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
spanList
.
size
()
==
0
)
{
throw
new
BuildTraceSpanTreeException
(
"spanList is empty."
);
}
Collections
.
sort
(
spanList
,
new
Comparator
<
Span
>()
{
@Override
public
int
compare
(
Span
span1
,
Span
span2
)
{
String
span1TraceLevel
=
span1
.
getParentLevel
()
+
"."
+
span1
.
getLevelId
();
String
span2TraceLevel
=
span2
.
getParentLevel
()
+
"."
+
span2
.
getLevelId
();
return
span1TraceLevel
.
compareTo
(
span2TraceLevel
);
}
});
Span
span
=
spanList
.
get
(
0
);
if
(!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
userId
=
span
.
getUserId
();
}
else
{
throw
new
BuildTraceSpanTreeException
(
"spanList[0] 's userId is null"
);
}
cid
=
generateCID
(
spanList
.
get
(
0
));
treeRoot
=
new
TraceSpanNode
(
null
,
null
,
null
,
null
,
spanList
.
get
(
0
),
spanContainer
);
if
(
spanList
.
size
()
>
1
)
{
for
(
int
i
=
1
;
i
<
spanList
.
size
();
i
++)
{
this
.
build
(
spanList
.
get
(
i
));
}
}
return
cid
;
}
private
void
build
(
Span
span
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
userId
==
null
&&
!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
userId
=
span
.
getUserId
();
}
TraceSpanNode
clientOrServerNode
=
findNodeAndCreateVisualNodeIfNess
(
span
.
getParentLevel
(),
span
.
getLevelId
());
if
(
clientOrServerNode
!=
null
)
{
clientOrServerNode
.
mergeSpan
(
span
);
}
if
(
span
.
getLevelId
()
>
0
)
{
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
span
.
getParentLevel
(),
span
.
getLevelId
()
-
1
);
/**
* Create node between foundNode and foundNode.next(maybe
* foundNode.next == null)
*/
new
TraceSpanNode
(
null
,
null
,
foundNode
,
foundNode
.
next
(
this
),
span
,
spanContainer
);
}
else
{
/**
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
* find node[parentLevelId=0.0,levelId=1]
*/
String
parentLevel
=
span
.
getParentLevel
();
int
idx
=
parentLevel
.
lastIndexOf
(
"\\."
);
if
(
idx
<
0
)
{
throw
new
BuildTraceSpanTreeException
(
"parentLevel="
+
parentLevel
+
" is unexpected."
);
}
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
parentLevel
.
substring
(
0
,
idx
),
Integer
.
parseInt
(
parentLevel
.
substring
(
idx
+
1
)));
/**
* Create sub node of using span data. FoundNode is parent node.
*/
new
TraceSpanNode
(
foundNode
,
null
,
null
,
null
,
span
,
spanContainer
);
}
}
private
TraceSpanNode
findNodeAndCreateVisualNodeIfNess
(
String
parentLevelId
,
int
levelId
)
throws
TraceSpanTreeNotFountException
{
String
levelDesc
=
StringUtil
.
isBlank
(
parentLevelId
)
?
(
levelId
+
""
)
:
(
parentLevelId
+
"."
+
levelId
);
String
[]
levelArray
=
levelDesc
.
split
(
"\\."
);
TraceSpanNode
currentNode
=
treeRoot
;
String
contextParentLevelId
=
""
;
for
(
String
currentLevel
:
levelArray
)
{
int
currentLevelInt
=
Integer
.
parseInt
(
currentLevel
);
for
(
int
i
=
0
;
i
<
currentLevelInt
;
i
++)
{
if
(
currentNode
.
hasNext
())
{
currentNode
=
currentNode
.
next
(
this
);
}
else
{
// create visual next node
currentNode
=
new
VisualTraceSpanNode
(
null
,
null
,
currentNode
,
null
,
contextParentLevelId
,
i
,
spanContainer
);
}
}
contextParentLevelId
=
contextParentLevelId
==
""
?
(
""
+
currentLevelInt
)
:
(
contextParentLevelId
+
"."
+
currentLevelInt
);
if
(
currentNode
.
hasSub
())
{
currentNode
=
currentNode
.
sub
(
this
);
}
else
{
// create visual sub node
currentNode
=
new
VisualTraceSpanNode
(
currentNode
,
null
,
null
,
null
,
contextParentLevelId
,
0
,
spanContainer
);
}
}
return
currentNode
;
}
private
String
generateCID
(
Span
level0Span
)
throws
BuildTraceSpanTreeException
{
if
(
StringUtil
.
isBlank
(
level0Span
.
getParentLevel
())
&&
level0Span
.
getLevelId
()
==
0
)
{
StringBuilder
chainTokenDesc
=
new
StringBuilder
();
chainTokenDesc
.
append
(
userId
).
append
(
"_"
);
chainTokenDesc
.
append
(
level0Span
.
getViewPointId
());
return
getTSBySpanTraceId
(
level0Span
)
+
"_"
+
TokenGenerator
.
generateCID
(
chainTokenDesc
.
toString
());
}
else
{
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
level0Span
.
getTraceId
()
+
" level0 span data is illegal"
);
}
}
private
static
String
getTSBySpanTraceId
(
Span
span
)
throws
BuildTraceSpanTreeException
{
try
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
new
Date
(
Long
.
parseLong
(
span
.
getTraceId
().
split
(
"\\."
)[
2
])));
return
calendar
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
calendar
.
get
(
Calendar
.
MONTH
)
+
1
);
}
catch
(
Throwable
t
)
{
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
span
.
getTraceId
()
+
" is illegal."
);
}
}
private
void
beforeSerialize
()
throws
TraceSpanTreeSerializeException
{
for
(
TraceSpanNode
treeNode
:
spanContainer
)
{
treeNode
.
serializeRef
();
}
}
public
String
serialize
()
throws
TraceSpanTreeSerializeException
{
beforeSerialize
();
return
new
GsonBuilder
().
excludeFieldsWithoutExposeAnnotation
()
.
create
().
toJson
(
this
);
}
TraceSpanNode
findNode
(
String
nodeRefToken
)
throws
TraceSpanTreeNotFountException
{
if
(
traceSpanNodeMap
.
containsKey
(
nodeRefToken
))
{
return
traceSpanNodeMap
.
get
(
nodeRefToken
);
}
else
{
throw
new
TraceSpanTreeNotFountException
(
"nodeRefToken="
+
nodeRefToken
+
" not found."
);
}
}
@Override
public
void
write
(
DataOutput
out
)
throws
IOException
{
try
{
out
.
write
(
serialize
().
getBytes
());
}
catch
(
TraceSpanTreeSerializeException
e
)
{
logger
.
error
(
"Failed to serialize Chain Id["
+
cid
+
"]"
,
e
);
}
}
@Override
public
void
readFields
(
DataInput
in
)
throws
IOException
{
String
value
=
in
.
readLine
();
try
{
JsonObject
jsonObject
=
(
JsonObject
)
new
JsonParser
().
parse
(
value
);
userId
=
jsonObject
.
get
(
"userId"
).
getAsString
();
cid
=
jsonObject
.
get
(
"cid"
).
getAsString
();
treeRoot
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"treeRoot"
),
TraceSpanNode
.
class
);
spanContainer
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"spanContainer"
),
new
TypeToken
<
List
<
TraceSpanNode
>>()
{
}.
getType
());
for
(
TraceSpanNode
node
:
spanContainer
)
{
traceSpanNodeMap
.
put
(
node
.
getNodeRefToken
(),
node
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"Failed to parse the value["
+
value
+
"] to TraceSpanTree Object"
,
e
);
}
}
public
TraceSpanNode
getTreeRoot
()
{
return
treeRoot
;
}
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
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录