Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
阿信在这里
SkyWalking
提交
67ebaf3a
S
SkyWalking
项目概览
阿信在这里
/
SkyWalking
与 Fork 源项目一致
Fork自
山不在高_有仙则灵 / SkyWalking
通知
1
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,发现更多精彩内容 >>
提交
67ebaf3a
编写于
10月 27, 2017
作者:
wu-sheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Finish instrument codes. But with a byte buddy bug, not support instrument inner class.
上级
fafd17f2
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
191 addition
and
0 deletion
+191
-0
apm-collector/apm-collector-core/pom.xml
apm-collector/apm-collector-core/pom.xml
+5
-0
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java
...g/skywalking/apm/collector/core/module/ModuleManager.java
+9
-0
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java
.../skywalking/apm/collector/core/module/ModuleProvider.java
+4
-0
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/ServiceInstrumentation.java
...lector/core/module/instrument/ServiceInstrumentation.java
+69
-0
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/ServiceMetricCollector.java
...lector/core/module/instrument/ServiceMetricCollector.java
+42
-0
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/TracedService.java
...g/apm/collector/core/module/instrument/TracedService.java
+32
-0
apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java
...skywalking/apm/collector/core/module/ModuleBProvider.java
+11
-0
apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleManagerTest.java
...ywalking/apm/collector/core/module/ModuleManagerTest.java
+19
-0
未找到文件。
apm-collector/apm-collector-core/pom.xml
浏览文件 @
67ebaf3a
...
...
@@ -23,5 +23,10 @@
<artifactId>
gson
</artifactId>
<version>
2.8.1
</version>
</dependency>
<dependency>
<groupId>
net.bytebuddy
</groupId>
<artifactId>
byte-buddy
</artifactId>
<version>
1.7.8
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleManager.java
浏览文件 @
67ebaf3a
...
...
@@ -31,6 +31,7 @@ import java.util.ServiceLoader;
*/
public
class
ModuleManager
{
private
Map
<
String
,
Module
>
loadedModules
=
new
HashMap
<>();
private
boolean
isServiceInstrument
=
false
;
/**
* Init the given modules
...
...
@@ -83,4 +84,12 @@ public class ModuleManager {
return
module
;
throw
new
ModuleNotFoundException
(
moduleName
+
" missing."
);
}
public
boolean
isServiceInstrument
()
{
return
isServiceInstrument
;
}
public
void
setServiceInstrument
(
boolean
serviceInstrument
)
{
isServiceInstrument
=
serviceInstrument
;
}
}
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleProvider.java
浏览文件 @
67ebaf3a
...
...
@@ -21,6 +21,7 @@ package org.skywalking.apm.collector.core.module;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Properties
;
import
org.skywalking.apm.collector.core.module.instrument.ServiceInstrumentation
;
/**
* The <code>ModuleProvider</code> is an implementation of a {@link Module}.
...
...
@@ -90,6 +91,9 @@ public abstract class ModuleProvider {
protected
final
void
registerServiceImplementation
(
Class
<?
extends
Service
>
serviceType
,
Service
service
)
throws
ServiceNotProvidedException
{
if
(
serviceType
.
isInstance
(
service
))
{
if
(
manager
.
isServiceInstrument
())
{
service
=
ServiceInstrumentation
.
INSTANCE
.
buildServiceUnderMonitor
(
service
);
}
this
.
services
.
put
(
serviceType
,
service
);
}
else
{
throw
new
ServiceNotProvidedException
(
serviceType
+
" is not implemented by "
+
service
);
...
...
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/ServiceInstrumentation.java
0 → 100644
浏览文件 @
67ebaf3a
/*
* Copyright 2017, OpenSkywalking Organization All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project repository: https://github.com/OpenSkywalking/skywalking
*/
package
org.skywalking.apm.collector.core.module.instrument
;
import
net.bytebuddy.ByteBuddy
;
import
net.bytebuddy.description.method.MethodDescription
;
import
net.bytebuddy.implementation.MethodDelegation
;
import
net.bytebuddy.matcher.ElementMatcher
;
import
org.skywalking.apm.collector.core.module.Service
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
isStatic
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
named
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
not
;
/**
* @author wu-sheng
*/
public
enum
ServiceInstrumentation
{
INSTANCE
;
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ServiceInstrumentation
.
class
);
private
ElementMatcher
<?
super
MethodDescription
>
excludeObjectMethodsMatcher
;
public
Service
buildServiceUnderMonitor
(
Service
implementation
)
{
if
(
TracedService
.
class
.
isInstance
(
implementation
))
{
// Duplicate service instrument, ignore.
return
implementation
;
}
try
{
return
new
ByteBuddy
().
subclass
(
implementation
.
getClass
())
.
implement
(
TracedService
.
class
)
.
method
(
getDefaultMatcher
()).
intercept
(
MethodDelegation
.
withDefaultConfiguration
().
to
(
new
ServiceMetricCollector
())
).
make
().
load
(
getClass
().
getClassLoader
()
).
getLoaded
().
newInstance
();
}
catch
(
InstantiationException
e
)
{
logger
.
error
(
"Create instrumented service "
+
implementation
.
getClass
()
+
" fail."
,
e
);
}
catch
(
IllegalAccessException
e
)
{
logger
.
error
(
"Create instrumented service "
+
implementation
.
getClass
()
+
" fail."
,
e
);
}
return
implementation
;
}
private
ElementMatcher
<?
super
MethodDescription
>
getDefaultMatcher
()
{
if
(
excludeObjectMethodsMatcher
==
null
)
{
excludeObjectMethodsMatcher
=
not
(
isStatic
().
or
(
named
(
"getClass"
)).
or
(
named
(
"hashCode"
)).
or
(
named
(
"equals"
)).
or
(
named
(
"clone"
))
.
or
(
named
(
"toString"
)).
or
(
named
(
"notify"
)).
or
(
named
(
"notifyAll"
)).
or
(
named
(
"wait"
)).
or
(
named
(
"finalize"
)));
}
return
excludeObjectMethodsMatcher
;
}
}
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/ServiceMetricCollector.java
0 → 100644
浏览文件 @
67ebaf3a
/*
* Copyright 2017, OpenSkywalking Organization All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project repository: https://github.com/OpenSkywalking/skywalking
*/
package
org.skywalking.apm.collector.core.module.instrument
;
import
java.lang.reflect.Method
;
import
java.util.concurrent.Callable
;
import
net.bytebuddy.implementation.bind.annotation.AllArguments
;
import
net.bytebuddy.implementation.bind.annotation.Origin
;
import
net.bytebuddy.implementation.bind.annotation.RuntimeType
;
import
net.bytebuddy.implementation.bind.annotation.SuperCall
;
import
net.bytebuddy.implementation.bind.annotation.This
;
/**
* @author wu-sheng
*/
public
class
ServiceMetricCollector
{
@RuntimeType
public
Object
intercept
(
@This
Object
obj
,
@AllArguments
Object
[]
allArguments
,
@SuperCall
Callable
<?>
zuper
,
@Origin
Method
method
)
throws
Throwable
{
return
zuper
.
call
();
}
}
apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/instrument/TracedService.java
0 → 100644
浏览文件 @
67ebaf3a
/*
* Copyright 2017, OpenSkywalking Organization All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project repository: https://github.com/OpenSkywalking/skywalking
*/
package
org.skywalking.apm.collector.core.module.instrument
;
import
org.skywalking.apm.collector.core.module.ModuleManager
;
/**
* The <code>TracedService</code> implementation are dynamic class, generated by {@link ServiceInstrumentation}, when
* {@link ModuleManager#isServiceInstrument} is true.
*
* By that, all the services metrics are collected, and report in the certain cycle through console.
*
* @author wu-sheng
*/
public
interface
TracedService
{
}
apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleBProvider.java
浏览文件 @
67ebaf3a
...
...
@@ -19,6 +19,17 @@
package
org.skywalking.apm.collector.core.module
;
import
java.util.Properties
;
import
net.bytebuddy.ByteBuddy
;
import
net.bytebuddy.description.method.MethodDescription
;
import
net.bytebuddy.implementation.MethodDelegation
;
import
net.bytebuddy.matcher.ElementMatcher
;
import
org.junit.Test
;
import
org.skywalking.apm.collector.core.module.instrument.ServiceMetricCollector
;
import
org.skywalking.apm.collector.core.module.instrument.TracedService
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
isStatic
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
named
;
import
static
net
.
bytebuddy
.
matcher
.
ElementMatchers
.
not
;
/**
* @author wu-sheng
...
...
apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleManagerTest.java
浏览文件 @
67ebaf3a
...
...
@@ -18,7 +18,9 @@
package
org.skywalking.apm.collector.core.module
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
org.skywalking.apm.collector.core.module.instrument.TracedService
;
/**
* @author wu-sheng
...
...
@@ -37,4 +39,21 @@ public class ModuleManagerTest {
BaseModuleA
.
ServiceABusiness1
serviceABusiness1
=
manager
.
find
(
"BaseA"
).
provider
().
getService
(
BaseModuleA
.
ServiceABusiness1
.
class
);
serviceABusiness1
.
print
();
}
//@Test
public
void
testInstrument
()
throws
ServiceNotProvidedException
,
ModuleNotFoundException
,
ProviderNotFoundException
,
DuplicateProviderException
{
ApplicationConfiguration
configuration
=
new
ApplicationConfiguration
();
configuration
.
addModule
(
"Test"
).
addProviderConfiguration
(
"TestModule-Provider"
,
null
);
configuration
.
addModule
(
"BaseA"
).
addProviderConfiguration
(
"P-A"
,
null
);
configuration
.
addModule
(
"BaseB"
).
addProviderConfiguration
(
"P-B"
,
null
);
ModuleManager
manager
=
new
ModuleManager
();
manager
.
setServiceInstrument
(
true
);
manager
.
init
(
configuration
);
BaseModuleA
.
ServiceABusiness1
serviceABusiness1
=
manager
.
find
(
"BaseA"
).
provider
().
getService
(
BaseModuleA
.
ServiceABusiness1
.
class
);
serviceABusiness1
.
print
();
Assert
.
assertTrue
(
serviceABusiness1
instanceof
TracedService
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录