APM-SkyWalking介绍

Apache SkyWalking是一个由中国人开发的APM系统,专注于微服务、容器化和分布式系统的性能监控。相比zipkin和pinpoint,SkyWalking拥有活跃的中文社区,支持多种语言探针,并使用ES作为存储,提供强大的检索能力。SkyWalking采用JavaAgent技术实现无侵入自动埋点,并使用OAL语言进行自定义分析。此外,SkyWalking强调轻量化设计和模块化架构,支持gRPC和HTTP/1.1通信协议,未来将更深入服务网格观测。

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);
            } else {
   
   
                ContainerInfo.INSTANCE.setType(ContainerType.UNKNOWN);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值