skywalking 源码分析2
插件开发的规范
一个插件开发的规范
(注:agent中运用writeness技术判断区分不同种类的插件,后续详细介绍这种机制)
插件agent目录介绍
目录 | 解释 |
---|---|
activations | 日志相关的插件 |
bootstrap-plugins | JDK相关的原生插件 |
config | 配置文件 |
logs | 日志文件 |
optional-plugins | 可选插件 |
optional-reporter-plugins | 可选报表插件 |
plugins | 需要启动插件 |
官方插件开发文档 官方地址
加载过程源码分析
- agent 启动的源头
org.apache.skywalking.apm.agent.SkyWalkingAgent#premain
- 初始化配置
- 装配所有插件
// 装配byteBuddy 增加字节码行为
AgentBuilder agentBuilder = new AgentBuilder.Default(byteBuddy)
.ignore(
nameStartsWith("net.bytebuddy.")
.or(nameStartsWith("org.slf4j."))
.or(nameStartsWith("org.groovy."))
.or(nameContains("javassist"))
.or(nameContains(".asm."))
.or(nameStartsWith("sun.reflect"))
.or(allSkyWalkingAgentExcludeToolkit())
.or(ElementMatchers.<TypeDescription>isSynthetic()));
//构建agentBuilder
agentBuilder
.type(pluginFinder.buildMatch())
.transform(new Transformer(pluginFinder))
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.with(new Listener())
.installOn(instrumentation);
- 启动服务
try {
ServiceManager.INSTANCE.boot();
} catch (Exception e) {
logger.error(e, "Skywalking agent boot failure.");
}