Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
SkyWalking
提交
701b6afa
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 搜索 >>
提交
701b6afa
编写于
7月 02, 2017
作者:
wu-sheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix operationName of entry span didn’t reset. And optimize interceptor initialization.
上级
b3fe61ae
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
65 addition
and
36 deletion
+65
-36
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java
...org/skywalking/apm/agent/core/context/TracingContext.java
+13
-2
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java
...ing/apm/agent/core/context/trace/AbstractTracingSpan.java
+10
-0
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java
.../plugin/interceptor/enhance/ClassEnhancePluginDefine.java
+2
-2
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java
...ent/core/plugin/interceptor/enhance/ConstructorInter.java
+10
-7
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java
...ent/core/plugin/interceptor/enhance/InstMethodsInter.java
+9
-8
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java
...interceptor/enhance/InstMethodsInterWithOverrideArgs.java
+9
-8
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/loader/InterceptorInstanceLoader.java
.../plugin/interceptor/loader/InterceptorInstanceLoader.java
+12
-9
未找到文件。
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java
浏览文件 @
701b6afa
...
...
@@ -95,7 +95,7 @@ public class TracingContext implements AbstractTracerContext {
@Override
public
AbstractSpan
createEntrySpan
(
final
String
operationName
)
{
AbstractTracingSpan
entrySpan
;
AbstractTracingSpan
parentSpan
=
peek
();
final
AbstractTracingSpan
parentSpan
=
peek
();
final
int
parentSpanId
=
parentSpan
==
null
?
-
1
:
parentSpan
.
getSpanId
();
if
(
parentSpan
==
null
)
{
entrySpan
=
(
AbstractTracingSpan
)
DictionaryManager
.
findOperationNameCodeSection
()
...
...
@@ -112,7 +112,18 @@ public class TracingContext implements AbstractTracerContext {
entrySpan
.
start
();
return
push
(
entrySpan
);
}
else
if
(
parentSpan
.
isEntry
())
{
return
parentSpan
.
start
();
entrySpan
=
(
AbstractTracingSpan
)
DictionaryManager
.
findOperationNameCodeSection
()
.
find
(
segment
.
getApplicationId
(),
operationName
)
.
doInCondition
(
new
PossibleFound
.
FoundAndObtain
()
{
@Override
public
Object
doProcess
(
int
operationId
)
{
return
parentSpan
.
setOperationId
(
operationId
);
}
},
new
PossibleFound
.
NotFoundAndObtain
()
{
@Override
public
Object
doProcess
()
{
return
parentSpan
.
setOperationName
(
operationName
);
}
});
return
entrySpan
.
start
();
}
else
{
throw
new
IllegalStateException
(
"The Entry Span can't be the child of Non-Entry Span"
);
}
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java
浏览文件 @
701b6afa
...
...
@@ -113,6 +113,16 @@ public abstract class AbstractTracingSpan implements AbstractSpan {
return
this
;
}
public
AbstractTracingSpan
setOperationName
(
String
operationName
)
{
this
.
operationName
=
operationName
;
return
this
;
}
public
AbstractTracingSpan
setOperationId
(
int
operationId
)
{
this
.
operationId
=
operationId
;
return
this
;
}
public
int
getSpanId
()
{
return
spanId
;
}
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java
浏览文件 @
701b6afa
...
...
@@ -104,7 +104,7 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi
for
(
ConstructorInterceptPoint
constructorInterceptPoint
:
constructorInterceptPoints
)
{
newClassBuilder
=
newClassBuilder
.
constructor
(
ElementMatchers
.<
MethodDescription
>
any
()).
intercept
(
SuperMethodCall
.
INSTANCE
.
andThen
(
MethodDelegation
.
withDefaultConfiguration
()
.
to
(
new
ConstructorInter
(
constructorInterceptPoint
.
getConstructorInterceptor
()))
.
to
(
new
ConstructorInter
(
constructorInterceptPoint
.
getConstructorInterceptor
()
,
classLoader
))
)
);
}
...
...
@@ -135,7 +135,7 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi
newClassBuilder
.
method
(
not
(
isStatic
()).
and
(
instanceMethodsInterceptPoint
.
getMethodsMatcher
()))
.
intercept
(
MethodDelegation
.
withDefaultConfiguration
()
.
to
(
new
InstMethodsInter
(
interceptor
))
.
to
(
new
InstMethodsInter
(
interceptor
,
classLoader
))
);
}
}
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ConstructorInter.java
浏览文件 @
701b6afa
package
org.skywalking.apm.agent.core.plugin.interceptor.enhance
;
import
java.lang.reflect.InvocationTargetException
;
import
net.bytebuddy.implementation.bind.annotation.AllArguments
;
import
net.bytebuddy.implementation.bind.annotation.FieldProxy
;
import
net.bytebuddy.implementation.bind.annotation.RuntimeType
;
import
net.bytebuddy.implementation.bind.annotation.This
;
import
org.skywalking.apm.agent.core.plugin.PluginException
;
import
org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader
;
import
org.skywalking.apm.logging.ILog
;
import
org.skywalking.apm.logging.LogManager
;
...
...
@@ -18,19 +20,21 @@ public class ConstructorInter {
private
static
final
ILog
logger
=
LogManager
.
getLogger
(
ConstructorInter
.
class
);
/**
* A
class full name, and instanceof
{@link InstanceConstructorInterceptor}
* A
n
{@link InstanceConstructorInterceptor}
* This name should only stay in {@link String}, the real {@link Class} type will trigger classloader failure.
* If you want to know more, please check on books about Classloader or Classloader appointment mechanism.
*/
private
String
constructorInterceptorClassName
;
private
InstanceConstructorInterceptor
interceptor
;
/**
* Set the name of {@link ConstructorInter#constructorInterceptorClassName}
*
* @param constructorInterceptorClassName class full name.
*/
public
ConstructorInter
(
String
constructorInterceptorClassName
)
{
this
.
constructorInterceptorClassName
=
constructorInterceptorClassName
;
public
ConstructorInter
(
String
constructorInterceptorClassName
,
ClassLoader
classLoader
)
throws
PluginException
{
try
{
interceptor
=
InterceptorInstanceLoader
.
load
(
constructorInterceptorClassName
,
classLoader
);
}
catch
(
Throwable
t
)
{
throw
new
PluginException
(
"Can't create InstanceConstructorInterceptor."
,
t
);
}
}
/**
...
...
@@ -43,7 +47,6 @@ public class ConstructorInter {
public
void
intercept
(
@This
Object
obj
,
@AllArguments
Object
[]
allArguments
)
{
try
{
InstanceConstructorInterceptor
interceptor
=
InterceptorInstanceLoader
.
load
(
constructorInterceptorClassName
,
obj
.
getClass
().
getClassLoader
());
EnhancedInstance
targetObject
=
(
EnhancedInstance
)
obj
;
interceptor
.
onConstruct
(
targetObject
,
allArguments
);
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInter.java
浏览文件 @
701b6afa
package
org.skywalking.apm.agent.core.plugin.interceptor.enhance
;
import
net.bytebuddy.implementation.bind.annotation.*
;
import
org.skywalking.apm.agent.core.plugin.PluginException
;
import
org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader
;
import
org.skywalking.apm.logging.ILog
;
import
org.skywalking.apm.logging.LogManager
;
...
...
@@ -18,19 +19,21 @@ public class InstMethodsInter {
private
static
final
ILog
logger
=
LogManager
.
getLogger
(
InstMethodsInter
.
class
);
/**
* A
class full name, and instanceof
{@link InstanceMethodsAroundInterceptor}
* A
n
{@link InstanceMethodsAroundInterceptor}
* This name should only stay in {@link String}, the real {@link Class} type will trigger classloader failure.
* If you want to know more, please check on books about Classloader or Classloader appointment mechanism.
*/
private
String
instanceMethodsAroundInterceptorClassName
;
private
InstanceMethodsAroundInterceptor
interceptor
;
/**
* Set the name of {@link InstMethodsInter#instanceMethodsAroundInterceptorClassName}
*
* @param instanceMethodsAroundInterceptorClassName class full name.
*/
public
InstMethodsInter
(
String
instanceMethodsAroundInterceptorClassName
)
{
this
.
instanceMethodsAroundInterceptorClassName
=
instanceMethodsAroundInterceptorClassName
;
public
InstMethodsInter
(
String
instanceMethodsAroundInterceptorClassName
,
ClassLoader
classLoader
)
{
try
{
interceptor
=
InterceptorInstanceLoader
.
load
(
instanceMethodsAroundInterceptorClassName
,
classLoader
);
}
catch
(
Throwable
t
)
{
throw
new
PluginException
(
"Can't create InstanceMethodsAroundInterceptor."
,
t
);
}
}
/**
...
...
@@ -50,8 +53,6 @@ public class InstMethodsInter {
@SuperCall
Callable
<?>
zuper
,
@Origin
Method
method
)
throws
Throwable
{
InstanceMethodsAroundInterceptor
interceptor
=
InterceptorInstanceLoader
.
load
(
instanceMethodsAroundInterceptorClassName
,
obj
.
getClass
().
getClassLoader
());
EnhancedInstance
targetObject
=
(
EnhancedInstance
)
obj
;
MethodInterceptResult
result
=
new
MethodInterceptResult
();
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/InstMethodsInterWithOverrideArgs.java
浏览文件 @
701b6afa
...
...
@@ -7,6 +7,7 @@ import net.bytebuddy.implementation.bind.annotation.Morph;
import
net.bytebuddy.implementation.bind.annotation.Origin
;
import
net.bytebuddy.implementation.bind.annotation.RuntimeType
;
import
net.bytebuddy.implementation.bind.annotation.This
;
import
org.skywalking.apm.agent.core.plugin.PluginException
;
import
org.skywalking.apm.agent.core.plugin.interceptor.loader.InterceptorInstanceLoader
;
import
org.skywalking.apm.logging.ILog
;
import
org.skywalking.apm.logging.LogManager
;
...
...
@@ -21,19 +22,21 @@ public class InstMethodsInterWithOverrideArgs {
private
static
final
ILog
logger
=
LogManager
.
getLogger
(
InstMethodsInterWithOverrideArgs
.
class
);
/**
* A
class full name, and instanceof
{@link InstanceMethodsAroundInterceptor}
* A
n
{@link InstanceMethodsAroundInterceptor}
* This name should only stay in {@link String}, the real {@link Class} type will trigger classloader failure.
* If you want to know more, please check on books about Classloader or Classloader appointment mechanism.
*/
private
String
instanceMethodsAroundInterceptorClassName
;
private
InstanceMethodsAroundInterceptor
interceptor
;
/**
* Set the name of {@link InstMethodsInterWithOverrideArgs#instanceMethodsAroundInterceptorClassName}
*
* @param instanceMethodsAroundInterceptorClassName class full name.
*/
public
InstMethodsInterWithOverrideArgs
(
String
instanceMethodsAroundInterceptorClassName
)
{
this
.
instanceMethodsAroundInterceptorClassName
=
instanceMethodsAroundInterceptorClassName
;
public
InstMethodsInterWithOverrideArgs
(
String
instanceMethodsAroundInterceptorClassName
,
ClassLoader
classLoader
)
{
try
{
interceptor
=
InterceptorInstanceLoader
.
load
(
instanceMethodsAroundInterceptorClassName
,
classLoader
);
}
catch
(
Throwable
t
)
{
throw
new
PluginException
(
"Can't create InstanceMethodsAroundInterceptor."
,
t
);
}
}
/**
...
...
@@ -53,8 +56,6 @@ public class InstMethodsInterWithOverrideArgs {
@Origin
Method
method
,
@Morph
(
defaultMethod
=
true
)
OverrideCallable
zuper
)
throws
Throwable
{
InstanceMethodsAroundInterceptor
interceptor
=
InterceptorInstanceLoader
.
load
(
instanceMethodsAroundInterceptorClassName
,
obj
.
getClass
().
getClassLoader
());
EnhancedInstance
targetObject
=
(
EnhancedInstance
)
obj
;
MethodInterceptResult
result
=
new
MethodInterceptResult
();
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/loader/InterceptorInstanceLoader.java
浏览文件 @
701b6afa
...
...
@@ -38,6 +38,9 @@ public class InterceptorInstanceLoader {
public
static
<
T
>
T
load
(
String
className
,
ClassLoader
targetClassLoader
)
throws
InvocationTargetException
,
IllegalAccessException
,
InstantiationException
,
ClassNotFoundException
{
if
(
targetClassLoader
==
null
)
{
targetClassLoader
=
InterceptorInstanceLoader
.
class
.
getClassLoader
();
}
String
instanceKey
=
className
+
"_OF_"
+
targetClassLoader
.
getClass
().
getName
()
+
"@"
+
Integer
.
toHexString
(
targetClassLoader
.
hashCode
());
Object
inst
=
INSTANCE_CACHE
.
get
(
instanceKey
);
if
(
inst
==
null
)
{
...
...
@@ -66,14 +69,14 @@ public class InterceptorInstanceLoader {
}
}
return
(
T
)
inst
;
return
(
T
)
inst
;
}
/**
* load class from class binary files.
* Most likely all the interceptor implementations should be loaded by this.
*
* @param className
interceptor class name.
* @param className interceptor class name.
* @param targetClassLoader the classloader, which should load the interceptor.
* @param <T>
* @return interceptor instance.
...
...
@@ -82,7 +85,7 @@ public class InterceptorInstanceLoader {
* @throws InstantiationException
*/
private
static
<
T
>
T
loadBinary
(
String
className
,
ClassLoader
targetClassLoader
)
throws
InvocationTargetException
,
IllegalAccessException
,
InstantiationException
{
ClassLoader
targetClassLoader
)
throws
InvocationTargetException
,
IllegalAccessException
,
InstantiationException
{
String
path
=
"/"
+
className
.
replace
(
'.'
,
'/'
).
concat
(
".class"
);
byte
[]
data
=
null
;
BufferedInputStream
is
=
null
;
...
...
@@ -122,21 +125,21 @@ public class InterceptorInstanceLoader {
}
defineClassMethod
.
setAccessible
(
true
);
logger
.
debug
(
"load binary code of {} to classloader {}"
,
className
,
targetClassLoader
);
Class
<?>
type
=
(
Class
<?>)
defineClassMethod
.
invoke
(
targetClassLoader
,
className
,
data
,
0
,
data
.
length
,
null
);
return
(
T
)
type
.
newInstance
();
Class
<?>
type
=
(
Class
<?>)
defineClassMethod
.
invoke
(
targetClassLoader
,
className
,
data
,
0
,
data
.
length
,
null
);
return
(
T
)
type
.
newInstance
();
}
/**
* Find loaded class in the current classloader.
* Just in case some classes have already been loaded for some reason.
*
* @param className
interceptor class name.
* @param className interceptor class name.
* @param targetClassLoader the classloader, which should load the interceptor.
* @param <T>
* @return interceptor instance.
*/
private
static
<
T
>
T
findLoadedClass
(
String
className
,
ClassLoader
targetClassLoader
)
throws
InvocationTargetException
,
IllegalAccessException
,
InstantiationException
{
ClassLoader
targetClassLoader
)
throws
InvocationTargetException
,
IllegalAccessException
,
InstantiationException
{
Method
defineClassMethod
=
null
;
Class
<?>
targetClassLoaderType
=
targetClassLoader
.
getClass
();
while
(
defineClassMethod
==
null
&&
targetClassLoaderType
!=
null
)
{
...
...
@@ -147,10 +150,10 @@ public class InterceptorInstanceLoader {
}
}
defineClassMethod
.
setAccessible
(
true
);
Class
<?>
type
=
(
Class
<?>)
defineClassMethod
.
invoke
(
targetClassLoader
,
className
);
Class
<?>
type
=
(
Class
<?>)
defineClassMethod
.
invoke
(
targetClassLoader
,
className
);
if
(
type
==
null
)
{
return
null
;
}
return
(
T
)
type
.
newInstance
();
return
(
T
)
type
.
newInstance
();
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录