001、从零开始写调用链监控-hello javaagent

1、为什么要用javaagent

网上关于javaagent的介绍已经很多,就不再详细说javaagent是什么,为什么要用javaagent,因为它是我们实现非代码侵入式调用链监控的关键,没有它,我们就只能通过包依赖的方式进行调用链监控框架的实现(类似zipkin,还有没有其他非侵入的方式不太清楚),skywalking和pinpoint就是采用javaagent探针的方式。

总结:javaagent可以让我们不侵入业务代码实现字节码的加强,是我们实现非代码侵入式调用链监控的基础。

2、项目搭建

项目结构:

001、从零开始写调用链监控-hello javaagent_第1张图片
1566528413760.png

模块说明:

gy4j-monitor-sniffer:javaagent的jar模块,打包为jar,提供给test进行测试
gy4j-monitor-test:测试gy4j-monitor-sniffer的javaagent引入

关键代码:

SnifferAgent.java:

javaagent的入口方法,类似main方法

public class SnifferAgent {
    /**
     * 在方法在main方法之前执行,和main方法同Jvm、ClassLoader、Security policy和Context
     *
     * @param agentOps javaagent入参
     * @param inst     对class进行字节码加强的代理实例
     */
    public static void premain(String agentOps, Instrumentation inst) {
        System.out.println("hello javaagent!this is premain!");
    }
}

gy4j-monitor-sniffer的pom.xml:



    
        gy4j-monitor
        cn.gy4j.monitor
        1.0-SNAPSHOT
    
    4.0.0

    gy4j-monitor-sniffer

    
        cn.gy4j.monitor.sniffer.agent.SnifferAgent
    

    
        sniffer-agent
        
            
                maven-shade-plugin
                
                    
                        package
                        
                            shade
                        
                        
                            
                            false
                            
                            true
                            
                            true
                            
                            true
                            
                                
                                
                                    
                                        ${premain.class}
                                    
                                
                            
                        
                    
                
            
        
    

注意:

javaagent的jar包打包配置,javaagent的jar包结构和普通的jar包结构不太一样,META-INF的MANIFEST.MF文件里有一个Premain-Class的配置,如下图所示:


001、从零开始写调用链监控-hello javaagent_第2张图片
1566528813240.png
TestSnifferAgent.java

普通的main方法

    public static void main(String[] args) {
        System.out.println("hello javaagent!this is main!");
    }

3、测试验证

第一步:编译打包
mvn clean package
结果如下:
001、从零开始写调用链监控-hello javaagent_第3张图片
1566529181601.png

我的路径:G:\gy4j\git_gy4j\gy4j-monitor\gy4j-monitor-sniffer\target\sniffer-agent.jar

快捷获取路径方式如下:


001、从零开始写调用链监控-hello javaagent_第4张图片
1566529290346.png
第二步:测试验证
加入jvm参数(使用前面copy的jar路径):
-javaagent:G:\gy4j\git_gy4j\gy4j-monitor\gy4j-monitor-sniffer\target\sniffer-agent.jar
001、从零开始写调用链监控-hello javaagent_第5张图片
1566529887800.png
执行TestSnifferAgent的main方法:

先打印SnifferAgent的premain方法里面的字符串,然后再打印TestSnifferAgent的main方法里面的字符串,结果如下所示:


001、从零开始写调用链监控-hello javaagent_第6张图片
1566530053702.png

4、源码地址

https://github.com/gy4j/gy4j-monitor/tree/001-javaagent-hello

你可能感兴趣的:(001、从零开始写调用链监控-hello javaagent)