APM-SkyWalking介绍

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 结构分析

img

SkyWalking原理介绍

SkyWalking 基础架构图

9540eaab2edad233ad3a6de19ac16d82.png

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);
            } 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值