Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
SkyWalking
提交
3006c7fa
S
SkyWalking
项目概览
apache
/
SkyWalking
上一次同步 1 年多
通知
302
Star
21345
Fork
6091
代码
文件
提交
分支
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,体验更适合开发者的 AI 搜索 >>
提交
3006c7fa
编写于
3月 02, 2016
作者:
wu-sheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.修改cid的生成规则。增加userId为算子。增加年-月作为cid前缀
2.为虚拟节点创建一个明文的token(方便识别)
上级
0131a35d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
232 addition
and
184 deletion
+232
-184
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildMapper.java
...loud/skywalking/analysis/chainbuild/ChainBuildMapper.java
+1
-1
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java
.../skywalking/analysis/chainbuild/entity/TraceSpanTree.java
+222
-182
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java
...lking/analysis/chainbuild/entity/VisualTraceSpanNode.java
+9
-1
未找到文件。
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/ChainBuildMapper.java
浏览文件 @
3006c7fa
...
@@ -45,7 +45,7 @@ public class ChainBuildMapper extends TableMapper<Text, TraceSpanTree> {
...
@@ -45,7 +45,7 @@ public class ChainBuildMapper extends TableMapper<Text, TraceSpanTree> {
TraceSpanTree
tree
=
new
TraceSpanTree
();
TraceSpanTree
tree
=
new
TraceSpanTree
();
tree
.
build
(
spanList
);
tree
.
build
(
spanList
);
context
.
write
(
new
Text
(
tree
.
get
TreeRoot
().
getNodeRefToken
()),
tree
);
context
.
write
(
new
Text
(
tree
.
get
Cid
()),
tree
);
}
catch
(
Throwable
e
)
{
}
catch
(
Throwable
e
)
{
logger
.
error
(
"Failed to mapper call chain["
+
key
.
toString
()
+
"]"
,
logger
.
error
(
"Failed to mapper call chain["
+
key
.
toString
()
+
"]"
,
e
);
e
);
...
...
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/TraceSpanTree.java
浏览文件 @
3006c7fa
...
@@ -4,13 +4,16 @@ import java.io.DataInput;
...
@@ -4,13 +4,16 @@ import java.io.DataInput;
import
java.io.DataOutput
;
import
java.io.DataOutput
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Collections
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
org.apache.hadoop.io.Writable
;
import
org.apache.hadoop.io.Writable
;
import
org.mortbay.log.Log
;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
...
@@ -28,186 +31,223 @@ import com.google.gson.annotations.Expose;
...
@@ -28,186 +31,223 @@ import com.google.gson.annotations.Expose;
import
com.google.gson.reflect.TypeToken
;
import
com.google.gson.reflect.TypeToken
;
public
class
TraceSpanTree
implements
Writable
{
public
class
TraceSpanTree
implements
Writable
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
TraceSpanTree
.
class
);
private
Logger
logger
=
LoggerFactory
.
getLogger
(
TraceSpanTree
.
class
);
@Expose
@Expose
private
String
userId
=
null
;
private
String
userId
=
null
;
@Expose
@Expose
private
String
cid
;
private
String
cid
;
@Expose
@Expose
private
TraceSpanNode
treeRoot
;
private
TraceSpanNode
treeRoot
;
@Expose
@Expose
private
List
<
TraceSpanNode
>
spanContainer
=
new
ArrayList
<
TraceSpanNode
>();
private
List
<
TraceSpanNode
>
spanContainer
=
new
ArrayList
<
TraceSpanNode
>();
private
Map
<
String
,
TraceSpanNode
>
traceSpanNodeMap
=
new
HashMap
<
String
,
TraceSpanNode
>();
private
Map
<
String
,
TraceSpanNode
>
traceSpanNodeMap
=
new
HashMap
<
String
,
TraceSpanNode
>();
public
TraceSpanTree
()
{
public
TraceSpanTree
()
{
}
}
public
String
build
(
List
<
Span
>
spanList
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
public
String
build
(
List
<
Span
>
spanList
)
if
(
spanList
.
size
()
==
0
)
{
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
throw
new
BuildTraceSpanTreeException
(
"spanList is empty."
);
if
(
spanList
.
size
()
==
0
)
{
}
throw
new
BuildTraceSpanTreeException
(
"spanList is empty."
);
}
Collections
.
sort
(
spanList
,
new
Comparator
<
Span
>()
{
@Override
Collections
.
sort
(
spanList
,
new
Comparator
<
Span
>()
{
public
int
compare
(
Span
span1
,
Span
span2
)
{
@Override
String
span1TraceLevel
=
span1
.
getParentLevel
()
+
"."
public
int
compare
(
Span
span1
,
Span
span2
)
{
+
span1
.
getLevelId
();
String
span1TraceLevel
=
span1
.
getParentLevel
()
+
"."
String
span2TraceLevel
=
span2
.
getParentLevel
()
+
"."
+
span1
.
getLevelId
();
+
span2
.
getLevelId
();
String
span2TraceLevel
=
span2
.
getParentLevel
()
+
"."
return
span1TraceLevel
.
compareTo
(
span2TraceLevel
);
+
span2
.
getLevelId
();
}
return
span1TraceLevel
.
compareTo
(
span2TraceLevel
);
});
}
cid
=
generateChainToken
(
spanList
.
get
(
0
));
});
treeRoot
=
new
TraceSpanNode
(
null
,
null
,
null
,
null
,
spanList
.
get
(
0
),
spanContainer
);
Span
span
=
spanList
.
get
(
0
);
if
(
spanList
.
size
()
>
1
)
{
if
(!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
for
(
int
i
=
1
;
i
<
spanList
.
size
();
i
++)
{
userId
=
span
.
getUserId
();
this
.
build
(
spanList
.
get
(
i
));
}
else
{
}
throw
new
BuildTraceSpanTreeException
(
}
"spanList[0] 's userId is null"
);
}
return
cid
;
cid
=
generateCID
(
spanList
.
get
(
0
));
}
treeRoot
=
new
TraceSpanNode
(
null
,
null
,
null
,
null
,
spanList
.
get
(
0
),
spanContainer
);
private
void
build
(
Span
span
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
spanList
.
size
()
>
1
)
{
if
(
userId
==
null
&&
span
.
getUserId
()
!=
null
)
{
for
(
int
i
=
1
;
i
<
spanList
.
size
();
i
++)
{
userId
=
span
.
getUserId
();
this
.
build
(
spanList
.
get
(
i
));
}
}
}
TraceSpanNode
clientOrServerNode
=
findNodeAndCreateVisualNodeIfNess
(
span
.
getParentLevel
(),
span
.
getLevelId
());
return
cid
;
if
(
clientOrServerNode
!=
null
)
{
}
clientOrServerNode
.
mergeSpan
(
span
);
}
private
void
build
(
Span
span
)
throws
BuildTraceSpanTreeException
,
TraceSpanTreeNotFountException
{
if
(
span
.
getLevelId
()
>
0
)
{
if
(
userId
==
null
&&
!
StringUtil
.
isBlank
(
span
.
getUserId
()))
{
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
userId
=
span
.
getUserId
();
span
.
getParentLevel
(),
span
.
getLevelId
()
-
1
);
}
/**
* Create node between foundNode and foundNode.next(maybe foundNode.next == null)
TraceSpanNode
clientOrServerNode
=
findNodeAndCreateVisualNodeIfNess
(
*/
span
.
getParentLevel
(),
span
.
getLevelId
());
new
TraceSpanNode
(
null
,
null
,
foundNode
,
foundNode
.
next
(
this
),
span
,
spanContainer
);
if
(
clientOrServerNode
!=
null
)
{
}
else
{
clientOrServerNode
.
mergeSpan
(
span
);
/**
}
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
* find node[parentLevelId=0.0,levelId=1]
if
(
span
.
getLevelId
()
>
0
)
{
*/
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
String
parentLevel
=
span
.
getParentLevel
();
span
.
getParentLevel
(),
span
.
getLevelId
()
-
1
);
int
idx
=
parentLevel
.
lastIndexOf
(
"\\."
);
/**
if
(
idx
<
0
)
{
* Create node between foundNode and foundNode.next(maybe
throw
new
BuildTraceSpanTreeException
(
"parentLevel="
* foundNode.next == null)
+
parentLevel
+
" is unexpected."
);
*/
}
new
TraceSpanNode
(
null
,
null
,
foundNode
,
foundNode
.
next
(
this
),
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
span
,
spanContainer
);
parentLevel
.
substring
(
0
,
idx
),
}
else
{
Integer
.
parseInt
(
parentLevel
.
substring
(
idx
+
1
)));
/**
/**
* levelId=0 find for parent level if parentLevelId = 0.0.1 then
* Create sub node of using span data. FoundNode is parent node.
* find node[parentLevelId=0.0,levelId=1]
*/
*/
new
TraceSpanNode
(
foundNode
,
null
,
null
,
null
,
span
,
spanContainer
);
String
parentLevel
=
span
.
getParentLevel
();
int
idx
=
parentLevel
.
lastIndexOf
(
"\\."
);
}
if
(
idx
<
0
)
{
}
throw
new
BuildTraceSpanTreeException
(
"parentLevel="
+
parentLevel
+
" is unexpected."
);
private
TraceSpanNode
findNodeAndCreateVisualNodeIfNess
(
}
String
parentLevelId
,
int
levelId
)
throws
TraceSpanTreeNotFountException
{
TraceSpanNode
foundNode
=
findNodeAndCreateVisualNodeIfNess
(
String
levelDesc
=
StringUtil
.
isBlank
(
parentLevelId
)
?
(
levelId
+
""
)
parentLevel
.
substring
(
0
,
idx
),
:
(
parentLevelId
+
"."
+
levelId
);
Integer
.
parseInt
(
parentLevel
.
substring
(
idx
+
1
)));
String
[]
levelArray
=
levelDesc
.
split
(
"\\."
);
/**
* Create sub node of using span data. FoundNode is parent node.
TraceSpanNode
currentNode
=
treeRoot
;
*/
String
contextParentLevelId
=
""
;
new
TraceSpanNode
(
foundNode
,
null
,
null
,
null
,
span
,
spanContainer
);
for
(
String
currentLevel
:
levelArray
)
{
int
currentLevelInt
=
Integer
.
parseInt
(
currentLevel
);
}
for
(
int
i
=
0
;
i
<
currentLevelInt
;
i
++)
{
}
if
(
currentNode
.
hasNext
())
{
currentNode
=
currentNode
.
next
(
this
);
private
TraceSpanNode
findNodeAndCreateVisualNodeIfNess
(
}
else
{
String
parentLevelId
,
int
levelId
)
// create visual next node
throws
TraceSpanTreeNotFountException
{
currentNode
=
new
VisualTraceSpanNode
(
null
,
null
,
String
levelDesc
=
StringUtil
.
isBlank
(
parentLevelId
)
?
(
levelId
+
""
)
currentNode
,
null
,
contextParentLevelId
,
i
,
spanContainer
);
:
(
parentLevelId
+
"."
+
levelId
);
}
String
[]
levelArray
=
levelDesc
.
split
(
"\\."
);
}
contextParentLevelId
=
contextParentLevelId
==
""
?
(
""
+
currentLevelInt
)
TraceSpanNode
currentNode
=
treeRoot
;
:
(
contextParentLevelId
+
"."
+
currentLevelInt
);
String
contextParentLevelId
=
""
;
if
(
currentNode
.
hasSub
())
{
for
(
String
currentLevel
:
levelArray
)
{
currentNode
=
currentNode
.
sub
(
this
);
int
currentLevelInt
=
Integer
.
parseInt
(
currentLevel
);
}
else
{
for
(
int
i
=
0
;
i
<
currentLevelInt
;
i
++)
{
// create visual sub node
if
(
currentNode
.
hasNext
())
{
currentNode
=
new
VisualTraceSpanNode
(
currentNode
,
null
,
null
,
currentNode
=
currentNode
.
next
(
this
);
null
,
contextParentLevelId
,
0
,
spanContainer
);
}
else
{
}
// create visual next node
}
currentNode
=
new
VisualTraceSpanNode
(
null
,
null
,
currentNode
,
null
,
contextParentLevelId
,
i
,
return
currentNode
;
spanContainer
);
}
}
}
private
String
generateChainToken
(
Span
level0Span
)
contextParentLevelId
=
contextParentLevelId
==
""
?
(
""
+
currentLevelInt
)
throws
BuildTraceSpanTreeException
{
:
(
contextParentLevelId
+
"."
+
currentLevelInt
);
if
(
StringUtil
.
isBlank
(
level0Span
.
getParentLevel
())
if
(
currentNode
.
hasSub
())
{
&&
level0Span
.
getLevelId
()
==
0
)
{
currentNode
=
currentNode
.
sub
(
this
);
StringBuilder
chainTokenDesc
=
new
StringBuilder
();
}
else
{
chainTokenDesc
.
append
(
level0Span
.
getViewPointId
());
// create visual sub node
return
TokenGenerator
.
generateCID
(
chainTokenDesc
.
toString
());
currentNode
=
new
VisualTraceSpanNode
(
currentNode
,
null
,
null
,
}
else
{
null
,
contextParentLevelId
,
0
,
spanContainer
);
throw
new
BuildTraceSpanTreeException
(
"tid:"
}
+
level0Span
.
getTraceId
()
+
" level0 span data is illegal"
);
}
}
}
return
currentNode
;
}
private
void
beforeSerialize
()
throws
TraceSpanTreeSerializeException
{
private
String
generateCID
(
Span
level0Span
)
for
(
TraceSpanNode
treeNode
:
spanContainer
)
{
throws
BuildTraceSpanTreeException
{
treeNode
.
serializeRef
();
if
(
StringUtil
.
isBlank
(
level0Span
.
getParentLevel
())
}
&&
level0Span
.
getLevelId
()
==
0
)
{
}
StringBuilder
chainTokenDesc
=
new
StringBuilder
();
chainTokenDesc
.
append
(
userId
).
append
(
"_"
);
public
String
serialize
()
throws
TraceSpanTreeSerializeException
{
chainTokenDesc
.
append
(
level0Span
.
getViewPointId
());
beforeSerialize
();
return
getTSBySpanTraceId
(
level0Span
)
+
"_"
+
TokenGenerator
.
generateCID
(
chainTokenDesc
.
toString
());
return
new
GsonBuilder
().
excludeFieldsWithoutExposeAnnotation
().
create
().
toJson
(
this
);
}
else
{
}
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
level0Span
.
getTraceId
()
+
" level0 span data is illegal"
);
TraceSpanNode
findNode
(
String
nodeRefToken
)
throws
TraceSpanTreeNotFountException
{
}
if
(
traceSpanNodeMap
.
containsKey
(
nodeRefToken
)){
}
return
traceSpanNodeMap
.
get
(
nodeRefToken
);
}
else
{
private
static
String
getTSBySpanTraceId
(
Span
span
)
throw
new
TraceSpanTreeNotFountException
(
"nodeRefToken="
+
nodeRefToken
+
" not found."
);
throws
BuildTraceSpanTreeException
{
}
try
{
}
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
new
Date
(
Long
.
parseLong
(
span
.
getTraceId
().
split
(
@Override
"\\."
)[
2
])));
public
void
write
(
DataOutput
out
)
throws
IOException
{
return
calendar
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
calendar
.
get
(
Calendar
.
MONTH
)
+
1
);
try
{
}
catch
(
Throwable
t
)
{
out
.
write
(
serialize
().
getBytes
());
throw
new
BuildTraceSpanTreeException
(
"tid:"
+
span
.
getTraceId
()
}
catch
(
TraceSpanTreeSerializeException
e
)
{
+
" is illegal."
);
logger
.
error
(
"Failed to serialize Chain Id["
+
cid
+
"]"
,
e
);
}
}
}
}
private
void
beforeSerialize
()
throws
TraceSpanTreeSerializeException
{
@Override
for
(
TraceSpanNode
treeNode
:
spanContainer
)
{
public
void
readFields
(
DataInput
in
)
throws
IOException
{
treeNode
.
serializeRef
();
String
value
=
in
.
readLine
();
}
try
{
}
JsonObject
jsonObject
=
(
JsonObject
)
new
JsonParser
().
parse
(
value
);
userId
=
jsonObject
.
get
(
"userId"
).
getAsString
();
public
String
serialize
()
throws
TraceSpanTreeSerializeException
{
cid
=
jsonObject
.
get
(
"cid"
).
getAsString
();
beforeSerialize
();
treeRoot
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"treeRoot"
),
TraceSpanNode
.
class
);
return
new
GsonBuilder
().
excludeFieldsWithoutExposeAnnotation
()
spanContainer
=
new
Gson
().
fromJson
(
jsonObject
.
get
(
"spanContainer"
),
.
create
().
toJson
(
this
);
new
TypeToken
<
List
<
TraceSpanNode
>>()
{
}
}.
getType
());
for
(
TraceSpanNode
node
:
spanContainer
){
TraceSpanNode
findNode
(
String
nodeRefToken
)
traceSpanNodeMap
.
put
(
node
.
getNodeRefToken
(),
node
);
throws
TraceSpanTreeNotFountException
{
}
if
(
traceSpanNodeMap
.
containsKey
(
nodeRefToken
))
{
}
catch
(
Exception
e
)
{
return
traceSpanNodeMap
.
get
(
nodeRefToken
);
logger
.
error
(
"Failed to parse the value["
+
value
+
"] to TraceSpanTree Object"
,
e
);
}
else
{
}
throw
new
TraceSpanTreeNotFountException
(
"nodeRefToken="
}
+
nodeRefToken
+
" not found."
);
}
public
TraceSpanNode
getTreeRoot
()
{
}
return
treeRoot
;
}
@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
;
}
}
}
skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/chainbuild/entity/VisualTraceSpanNode.java
浏览文件 @
3006c7fa
...
@@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity;
...
@@ -2,6 +2,8 @@ package com.ai.cloud.skywalking.analysis.chainbuild.entity;
import
java.util.List
;
import
java.util.List
;
import
com.ai.cloud.skywalking.analysis.chainbuild.util.StringUtil
;
public
class
VisualTraceSpanNode
extends
TraceSpanNode
{
public
class
VisualTraceSpanNode
extends
TraceSpanNode
{
protected
VisualTraceSpanNode
(
TraceSpanNode
parent
,
TraceSpanNode
sub
,
protected
VisualTraceSpanNode
(
TraceSpanNode
parent
,
TraceSpanNode
sub
,
...
@@ -9,7 +11,13 @@ public class VisualTraceSpanNode extends TraceSpanNode {
...
@@ -9,7 +11,13 @@ public class VisualTraceSpanNode extends TraceSpanNode {
int
levelId
,
List
<
TraceSpanNode
>
spanContainer
)
{
int
levelId
,
List
<
TraceSpanNode
>
spanContainer
)
{
super
(
parent
,
sub
,
prev
,
next
,
parentLevelId
,
levelId
,
spanContainer
);
super
(
parent
,
sub
,
prev
,
next
,
parentLevelId
,
levelId
,
spanContainer
);
//TODO: to set nodeToken
/**set visual node token.<br/>
* for example: <br/>
* VisualNode[0.0]<br/>
* VisualNode[0.0.1]<br/>
* etc.<br/>
*/
nodeRefToken
=
"VisualNode["
+
(
StringUtil
.
isBlank
(
parentLevelId
)
?
""
:
nodeRefToken
+
"."
)
+
levelId
+
"]"
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录