APM-SkyWalking介绍
APM学习架构图
APM 介绍
APM是什么?
APM的全称是 Application Performance Monitor 即 应用性能监控,APM致力于监控和管理应用软件性能和可用性。通过监测和诊断处理复杂应用程序的性能问题,来保证软件应用程序的良好运行(预期的服务)。
主流APM对比
有 zipkin,pinpoint,skywalking ,下面主要对pinpoint和skywalking 进行对比:
Pinpoint的优势在于:追踪数据粒度非常细、功能强大的用户界面,以及使用HBase作为存储带来的海量存储能力。
skywalking的优势在于:非常活跃的中文社区,支持多种语言的探针,对国产开源软件非常全面的支持,以及使用es作为底层存储带来的强大的检索能力,并且skywalking的扩展性以及定制化要更优于Pinpoint。
SkyWalking介绍
SkyWalking 是中国人开发的,也是国内唯一一个发展成为Apache顶级项目的个人开源项目。SkyWalking 是一个为了微服务,容器化,和分布式系统而生的高度组件化的APM项目。
SkyWalking 结构分析
SkyWalking原理介绍
SkyWalking 基础架构图
JavaAgent 介绍
SkyWalking 探针在使用上是无代码侵入的,而这种无侵入的自动埋点基于Java 的JavaAgent 技术。
JavaAgent 主要有两个方法实现–premain 和transform;
premain是javaAgent 的入口方法
public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException {
final PluginFinder pluginFinder;
try {
SnifferConfigInitializer.initialize(agentArgs);
//创建插件查找器
pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins());
} catch (Exception e) {
logger.error(e, "Skywalking agent initialized failure. Shutting down.");
return;
}
final ByteBuddy byteBuddy = new ByteBuddy()
.with(TypeValidation.of(Config.Agent.IS_OPEN_DEBUGGING_CLASS));
AgentBuilder agentBuilder = new AgentBuilder.Default(byteBuddy)
.ignore(
nameStartsWith("net.bytebuddy.")
.or(nameStartsWith("org.slf4j."))
.or(nameStartsWith("org.apache.logging."))
.or(nameStartsWith("org.groovy."))
.or(nameContains("javassist"))
.or(nameContains(".asm."))
.or(nameStartsWith("sun.reflect"))
.or(allSkyWalkingAgentExcludeToolkit())
.or(ElementMatchers.<TypeDescription>isSynthetic()));
try {
agentBuilder = BootstrapInstrumentBoost.inject(pluginFinder, agentBuilder, instrumentation);
} catch (Exception e) {
logger.error(e, "SkyWalking agent inject bootstrap instrumentation failure. Shutting down.");
return;
}
agentBuilder
.type(pluginFinder.buildMatch())
.transform(new Transformer(pluginFinder))
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.with(new Listener())
.installOn(instrumentation);
instrumentation.addTransformer(new MainClassTransformer());
try {
ServiceManager.INSTANCE.boot();
} catch (Exception e) {
logger.error(e, "Skywalking agent boot failure.");
}
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override public void run() {
ServiceManager.INSTANCE.shutdown();
}
}, "skywalking service shutdown thread"));
}
transfrom的主要作用是进行字节码数据转换,码返回转换后的字节码;
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if (ContainerLifecycle.INSTANCE.getCurState().equals(ContainerLifecycleState.NEW)){
String mainClassName = findMainClass();
if (!StringUtil.isEmpty(mainClassName)){
logger.info("Find main class :{}",mainClassName);
if (mainClassName.equals(ContainerType.TOMCAT.getMainClassName())){
ContainerInfo.INSTANCE.setType(ContainerType.TOMCAT);
ContainerLifecycle.INSTANCE.fireLifecycleEvent(ContainerLifecycleState.INIT);
}