开发者学堂课程【分布式链路追踪 Skywalking:Java-Agent 环境搭建】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/743/detail/13165
Java-Agent 环境搭建
内容介绍:
一、java agent 是什么
二、如何使用 java agent
一、java agent 是什么
Java agent 本质上是 java 命令的一个参数。
参数 java agent 可以用于指定一个 jar 包。使用java-agent技术可以实现stylewalking实时监控。
Jar 包的两点要求如下:
1. jar 包的 MANIFESTMF 文件必须指定 Premain-Qlass 项。
2. Premain-Class 指定的那个类必须实现 premain ()方法。方法名是固定的,当java 虚拟机启动时,在styleworking-agent.jia中执行后执行main函数,这样JVM 的特征就可以执行一些初始化的操作。
二、如何使用 java agent
首先定义一个 MANIFESTMF 文件,必须包含 Premain-Class 选项,这个选项指定了类,这个类中必须包含 premain 方法,这个方法也是java agent 的启动方法,这个方法是一个静态方法,方法逻辑由用户自己决定。然后将 premain 的类和 MANIFESTMF 文件统一进行打包,打包成一个 jar 包。最后在应用项目中使用参数 -iava agent:jar 包路径启动要代理的方法。那么此时在启动之后就会先执行 jar 包中的 premain 方法,然后再执行main方法。
接下来演示代码如何操作:
首先创建一个工程,这个工程不需要额外的,只需要最基本的代码,把它放在c盘下。
生成完第一步就是编写一个 premain 方法,这个方法有参数要求,方法名是固定的不能随意更改。添加两个参数,第一个叫angentparam参数,第二个叫 instrumentation 参数,这个参数能操作一些类的方法,提供了一些类转换的方法,在代码里打出 premain 执行,然后再把参数打进去,这是 premain 方法写完了。
代码如下:
import java.lang.instrument.Instrumentation;
public class PreMainAgent {
public static void premain(string agentparam,Instrumentation inst){
System.out.println("premain执行");
system.outprintln(agentparam);
还需要编写一个 MIMIFEXT 文件,这个文件编辑起来相对麻烦,同时还需要对它进行打包,打包的时候需要对插件进行处理,最方便的方法是使用一个插件,这个插件叫做 maven-asemb.plugin 组装插件,可以把代码拷贝一下,把它拷贝到pom中。
代码如下:
<manifest>
<addClasspath>true</addClasspath></manifest>
<manifestEntries>
<Premain-Class>PreMainAgent</Premain-Class>
<Agent-Class> PreMainAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries></archive></configuration><executions>
<execution>
<id>make-assembly</id><phase>package</phase><goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这个代码最重要的部分是<Premain-Class>PreMainAgent</Premain-Class>部分,需要制定 篇remain 的位置,这时把文件指定到 PreMainAgent 位置,此时当它启动时会执行premainagent 中的 premain 方法。
另外代码中添加了 jar-with-dependencies依赖,也就是说无论添加什么依赖,所有的依赖都可以打包在 jar 包里。
<Can-Retransform-Classes>true</Can-Retransform-Classes>,这样就可以自动生成 MINIFEXT 文件。
接下来来测试一下,对它进行打包,通过 pacakage 进行打包,此时 target 应该已经编译出来了这个 class 文件,同时这个 jar 包也打包完成了。
光打包还不行,打包以后还需一个测试的项目进行 agent 测试。再创建一个模块,把代码生成到C盘下面,与 agent-demo 同级,点击 finish,创建目录,user 的创建方法计较简单,因为再 main 方法中就能够执行,所以提供一个 main 方法。
接下来就可以使用 agent,首先拷贝代码,然后通过启动这个 main
方法查看他的执行位置,
现在只有 main 方法执行这一条记录,然后
把 java-agent 添加上去,在后面还可以通过添加等号添加一些参
数,继续执行 main 方法,可以看到 agent 已经呗加载
进去了,先执行premain 方法,也就是再demo中执行了 premain,
第二步再打印一个参数,最后执行 main 方法。
这个跟之前说的执行顺序是一致的:先执行 Java 中的premain方
法,再执行 main 方法。
对于premain还有另外一种写法,方法拷贝一下,可以把第二个参
数值去掉,如果第一种写法的两个参数不存在,就可以打印这种,单
个参数的方法,然后打包一下。
现在是执行1,把执行1屏蔽掉进行打包后,看执行2
是否会执行,可以看到执行2也成功了。
可以看到逻辑是这样的:当两个参数的 premain 方法存在时,调用
两个参数的方法;当两个参数的 premain 方法不存在时,调用一个
参数的方法。
代码如下:
import java.lang.instrument.Instrumentation;
public class PreMainAgent {
public static void premain(string agentparam,Instrumentation inst){
System.out.println("premain执行");
system.outprintln(agentparam);
{
以上就是 java agent 的简单用法,他的逻辑是,当需要执行 main
方法是,会先执行jar 包中的 premain 方法。