agent 作用和開發
- 可以用獨立於應用程序之外的代理(agent)程序來監測和協助運行在JVM上的應用程序。這種監測和協助包括但不限於獲取JVM運行時狀態,替換和修改類定義等。
由此可知agent 功能不局限於監測jvm運行狀態,我們還可以自定義他的功能,用處就自己想吧,比如 日志標簽, 接口鏈路追蹤, jvm信息, aop相關操作,服務器相關信息,接口訪問前的監測,項目運行環境安裝(配合腳本) 等一系列操作
agent 打包失敗解決方案
作為新手 ,第一次實踐一般都是根據網上的教程來的,於是我也是這樣的,
- 生成一個META-INF/MAINIFEST.MF文件
- 重寫一個premain方法
- 在MAINIFEST.MF文件里面配置上必須的參數
Manifest-Version: 1.0
Premain-Class: UtilsAgent
Created-By: 1.6.0_06
- 打包 運行 測試 紅一片,找不到的premain方法和類
!!! 就很慘就很難受
於是研究一番,發現這些操作的最終目的就是吧上面配置文件里面的這個 Premain-Class 東西放進去,萬變不離其蹤
於是我用maven試類一下,果然可行,一下是正確的配置方式,用於記錄踩坑經驗
<build>
<finalName>utils-agent</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<!--自動添加META-INF/MANIFEST.MF -->
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Premain-Class>vip.setsun.agent.UtilsAgent</Premain-Class>
<Agent-Class>vip.setsun.agent.UtilsAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
premain 方法
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("agentArgs : " + agentArgs);
inst.addTransformer(new DefineTransformer());
}
static class DefineTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println("premain load Class:" + className);
System.out.println("premain loader:" + loader.toString());
System.out.println("這里可以根據的自己的需求拿到想要的東西,比如 請求參數 相應參數 等。。。");
return classfileBuffer;
}
}
demo案例
- 將上面的兩段代碼打包就行了
- 然后運行 idea 需要在vm options 配置 -javaagent:${your.path}/utils-agent.jar
- 或者直接運行jar. java -javaagent:${your.path}/utils-agent.jar -jar test.jar
- 訪問main方法或者springboot接口即可看到相關日志