Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
SkyWalking
提交
6e3ad02d
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 搜索 >>
提交
6e3ad02d
编写于
9月 30, 2017
作者:
wu-sheng
提交者:
GitHub
9月 30, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #478 from wu-sheng/feature/multi-enhance
Support multi plugin defines targeting the same class.
上级
223ee8a2
991c031f
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
80 addition
and
21 deletion
+80
-21
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java
...m/agent/core/plugin/AbstractClassEnhancePluginDefine.java
+4
-3
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/EnhanceContext.java
.../org/skywalking/apm/agent/core/plugin/EnhanceContext.java
+34
-0
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java
...va/org/skywalking/apm/agent/core/plugin/PluginFinder.java
+12
-6
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java
.../plugin/interceptor/enhance/ClassEnhancePluginDefine.java
+15
-7
apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
...c/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
+15
-5
未找到文件。
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/AbstractClassEnhancePluginDefine.java
浏览文件 @
6e3ad02d
...
...
@@ -26,7 +26,7 @@ public abstract class AbstractClassEnhancePluginDefine {
* @throws PluginException, when set builder failure.
*/
public
DynamicType
.
Builder
<?>
define
(
String
transformClassName
,
DynamicType
.
Builder
<?>
builder
,
ClassLoader
classLoader
)
throws
PluginException
{
DynamicType
.
Builder
<?>
builder
,
ClassLoader
classLoader
,
EnhanceContext
context
)
throws
PluginException
{
String
interceptorDefineClassName
=
this
.
getClass
().
getName
();
if
(
StringUtil
.
isEmpty
(
transformClassName
))
{
...
...
@@ -53,15 +53,16 @@ public abstract class AbstractClassEnhancePluginDefine {
/**
* find origin class source code for interceptor
*/
DynamicType
.
Builder
<?>
newClassBuilder
=
this
.
enhance
(
transformClassName
,
builder
,
classLoader
);
DynamicType
.
Builder
<?>
newClassBuilder
=
this
.
enhance
(
transformClassName
,
builder
,
classLoader
,
context
);
context
.
initializationStageCompleted
();
logger
.
debug
(
"enhance class {} by {} completely."
,
transformClassName
,
interceptorDefineClassName
);
return
newClassBuilder
;
}
protected
abstract
DynamicType
.
Builder
<?>
enhance
(
String
enhanceOriginClassName
,
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
)
throws
PluginException
;
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
,
EnhanceContext
context
)
throws
PluginException
;
/**
* Define the {@link ClassMatch} for filtering class.
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/EnhanceContext.java
0 → 100644
浏览文件 @
6e3ad02d
package
org.skywalking.apm.agent.core.plugin
;
/**
* The <code>EnhanceContext</code> represents the context or status for processing a class.
*
* Based on this context, the plugin core {@link org.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassEnhancePluginDefine}
* knows how to process the specific steps for every particular plugin.
*
* @author wusheng
*/
public
class
EnhanceContext
{
private
boolean
isEnhanced
=
false
;
/**
* The object has already been enhanced or extended.
* e.g. added the new field, or implemented the new interface
*/
private
boolean
objectExtended
=
false
;
public
boolean
isEnhanced
()
{
return
isEnhanced
;
}
public
void
initializationStageCompleted
()
{
isEnhanced
=
true
;
}
public
boolean
isObjectExtended
()
{
return
objectExtended
;
}
public
void
extendObjectCompleted
()
{
objectExtended
=
true
;
}
}
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/PluginFinder.java
浏览文件 @
6e3ad02d
...
...
@@ -22,7 +22,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
* @author wusheng
*/
public
class
PluginFinder
{
private
final
Map
<
String
,
AbstractClassEnhancePluginDefine
>
nameMatchDefine
=
new
HashMap
<
String
,
AbstractClassEnhancePluginDefine
>();
private
final
Map
<
String
,
LinkedList
<
AbstractClassEnhancePluginDefine
>>
nameMatchDefine
=
new
HashMap
<
String
,
LinkedList
<
AbstractClassEnhancePluginDefine
>
>();
private
final
List
<
AbstractClassEnhancePluginDefine
>
signatureMatchDefine
=
new
LinkedList
<
AbstractClassEnhancePluginDefine
>();
public
PluginFinder
(
List
<
AbstractClassEnhancePluginDefine
>
plugins
)
{
...
...
@@ -35,28 +35,34 @@ public class PluginFinder {
if
(
match
instanceof
NameMatch
)
{
NameMatch
nameMatch
=
(
NameMatch
)
match
;
nameMatchDefine
.
put
(
nameMatch
.
getClassName
(),
plugin
);
LinkedList
<
AbstractClassEnhancePluginDefine
>
pluginDefines
=
nameMatchDefine
.
get
(
nameMatch
.
getClassName
());
if
(
pluginDefines
==
null
)
{
pluginDefines
=
new
LinkedList
<
AbstractClassEnhancePluginDefine
>();
nameMatchDefine
.
put
(
nameMatch
.
getClassName
(),
pluginDefines
);
}
pluginDefines
.
add
(
plugin
);
}
else
{
signatureMatchDefine
.
add
(
plugin
);
}
}
}
public
AbstractClassEnhancePluginDefine
find
(
TypeDescription
typeDescription
,
public
List
<
AbstractClassEnhancePluginDefine
>
find
(
TypeDescription
typeDescription
,
ClassLoader
classLoader
)
{
List
<
AbstractClassEnhancePluginDefine
>
matchedPlugins
=
new
LinkedList
<
AbstractClassEnhancePluginDefine
>();
String
typeName
=
typeDescription
.
getTypeName
();
if
(
nameMatchDefine
.
containsKey
(
typeName
))
{
return
nameMatchDefine
.
get
(
typeName
);
matchedPlugins
.
addAll
(
nameMatchDefine
.
get
(
typeName
)
);
}
for
(
AbstractClassEnhancePluginDefine
pluginDefine
:
signatureMatchDefine
)
{
IndirectMatch
match
=
(
IndirectMatch
)
pluginDefine
.
enhanceClass
();
if
(
match
.
isMatch
(
typeDescription
))
{
return
pluginDefine
;
matchedPlugins
.
add
(
pluginDefine
)
;
}
}
return
null
;
return
matchedPlugins
;
}
public
ElementMatcher
<?
super
TypeDescription
>
buildMatch
()
{
...
...
apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/plugin/interceptor/enhance/ClassEnhancePluginDefine.java
浏览文件 @
6e3ad02d
...
...
@@ -6,6 +6,7 @@ import net.bytebuddy.implementation.MethodDelegation;
import
net.bytebuddy.implementation.SuperMethodCall
;
import
net.bytebuddy.implementation.bind.annotation.Morph
;
import
org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
;
import
org.skywalking.apm.agent.core.plugin.EnhanceContext
;
import
org.skywalking.apm.agent.core.plugin.PluginException
;
import
org.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint
;
import
org.skywalking.apm.agent.core.plugin.interceptor.EnhanceException
;
...
...
@@ -46,10 +47,11 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi
*/
@Override
protected
DynamicType
.
Builder
<?>
enhance
(
String
enhanceOriginClassName
,
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
)
throws
PluginException
{
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
,
EnhanceContext
context
)
throws
PluginException
{
newClassBuilder
=
this
.
enhanceClass
(
enhanceOriginClassName
,
newClassBuilder
,
classLoader
);
newClassBuilder
=
this
.
enhanceInstance
(
enhanceOriginClassName
,
newClassBuilder
,
classLoader
);
newClassBuilder
=
this
.
enhanceInstance
(
enhanceOriginClassName
,
newClassBuilder
,
classLoader
,
context
);
return
newClassBuilder
;
}
...
...
@@ -62,7 +64,8 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi
* @return new byte-buddy's builder for further manipulation.
*/
private
DynamicType
.
Builder
<?>
enhanceInstance
(
String
enhanceOriginClassName
,
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
)
throws
PluginException
{
DynamicType
.
Builder
<?>
newClassBuilder
,
ClassLoader
classLoader
,
EnhanceContext
context
)
throws
PluginException
{
ConstructorInterceptPoint
[]
constructorInterceptPoints
=
getConstructorsInterceptPoints
();
InstanceMethodsInterceptPoint
[]
instanceMethodsInterceptPoints
=
getInstanceMethodsInterceptPoints
();
...
...
@@ -83,16 +86,21 @@ public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePlugi
}
/**
*
alter
class source code.<br/>
*
Manipulate
class source code.<br/>
*
* new class need:<br/>
* 1.Add field, name {@link #CONTEXT_ATTR_NAME}.
* 2.Add a field accessor for this field.
*
* And make sure the source codes manipulation only occurs once.
*
*/
newClassBuilder
=
newClassBuilder
.
defineField
(
CONTEXT_ATTR_NAME
,
Object
.
class
,
ACC_PRIVATE
)
.
implement
(
EnhancedInstance
.
class
)
.
intercept
(
FieldAccessor
.
ofField
(
CONTEXT_ATTR_NAME
));
if
(!
context
.
isObjectExtended
())
{
newClassBuilder
=
newClassBuilder
.
defineField
(
CONTEXT_ATTR_NAME
,
Object
.
class
,
ACC_PRIVATE
)
.
implement
(
EnhancedInstance
.
class
)
.
intercept
(
FieldAccessor
.
ofField
(
CONTEXT_ATTR_NAME
));
context
.
extendObjectCompleted
();
}
/**
* 2. enhance constructors
...
...
apm-sniffer/apm-agent/src/main/java/org/skywalking/apm/agent/SkyWalkingAgent.java
浏览文件 @
6e3ad02d
package
org.skywalking.apm.agent
;
import
java.lang.instrument.Instrumentation
;
import
java.util.List
;
import
net.bytebuddy.agent.builder.AgentBuilder
;
import
net.bytebuddy.description.type.TypeDescription
;
import
net.bytebuddy.dynamic.DynamicType
;
...
...
@@ -9,6 +10,7 @@ import org.skywalking.apm.agent.core.boot.ServiceManager;
import
org.skywalking.apm.agent.core.conf.SnifferConfigInitializer
;
import
org.skywalking.apm.agent.core.logging.EasyLogResolver
;
import
org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
;
import
org.skywalking.apm.agent.core.plugin.EnhanceContext
;
import
org.skywalking.apm.agent.core.plugin.PluginBootstrap
;
import
org.skywalking.apm.agent.core.plugin.PluginException
;
import
org.skywalking.apm.agent.core.plugin.PluginFinder
;
...
...
@@ -54,13 +56,21 @@ public class SkyWalkingAgent {
@Override
public
DynamicType
.
Builder
<?>
transform
(
DynamicType
.
Builder
<?>
builder
,
TypeDescription
typeDescription
,
ClassLoader
classLoader
,
JavaModule
module
)
{
AbstractClassEnhancePluginDefine
pluginDefine
=
pluginFinder
.
find
(
typeDescription
,
classLoader
);
if
(
pluginDefine
!=
null
)
{
DynamicType
.
Builder
<?>
newBuilder
=
pluginDefine
.
define
(
typeDescription
.
getTypeName
(),
builder
,
classLoader
);
if
(
newBuilder
!=
null
)
{
List
<
AbstractClassEnhancePluginDefine
>
pluginDefines
=
pluginFinder
.
find
(
typeDescription
,
classLoader
);
if
(
pluginDefines
.
size
()
>
0
)
{
DynamicType
.
Builder
<?>
newBuilder
=
builder
;
EnhanceContext
context
=
new
EnhanceContext
();
for
(
AbstractClassEnhancePluginDefine
define
:
pluginDefines
)
{
DynamicType
.
Builder
<?>
possibleNewBuilder
=
define
.
define
(
typeDescription
.
getTypeName
(),
newBuilder
,
classLoader
,
context
);
if
(
possibleNewBuilder
!=
null
)
{
newBuilder
=
possibleNewBuilder
;
}
}
if
(
context
.
isEnhanced
())
{
logger
.
debug
(
"Finish the prepare stage for {}."
,
typeDescription
.
getName
());
return
newBuilder
;
}
return
newBuilder
;
}
logger
.
debug
(
"Matched class {}, but ignore by finding mechanism."
,
typeDescription
.
getTypeName
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录