Btrace 基礎入門
阿新 • • 發佈:2018-11-26
Btrace 有點像攔截器 和 Spring 的 AOP,只要是一個類的方法,Btrace 都可以進行攔截,下面來看看它一般都用在哪裡
攔截普通方法
@OnMethod(clazz="",method="")
@OnMethod(
// 被攔截的 Java 類名
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
// 攔截的方法名
method="arg1",
// 入口處攔截
[email protected](Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
btrace 程序ID 指令碼檔案
[email protected] chapter4 $ btrace 45824 PrintArgSimple.java
[lucas ma, ]
com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller,arg1
攔截建構函式
@OnMethod(clazz="",method=" <init> ")
@OnMethod( clazz="com.lucasma.monitor.monitor_tuning.chapter2.User", method="<init>" ) public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) { BTraceUtils.println(pcn+","+pmn); BTraceUtils.printArray(args); BTraceUtils.println(); }
[email protected] chapter4 $ btrace 45919 PrintConstructor.java
com.lucasma.monitor.monitor_tuning.chapter2.User,<init>
[12, lucas, ]
攔截同名函式 用引數區分
@BTrace
public class PrintSame {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="same"
)
//通過方法的引數來判斷攔截哪個,這裡只有 Sting型別的 name,所以只能攔截同名函式 same 中只有一個引數的 name的哪個 same 函式
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, String name) {
BTraceUtils.println(pcn+","+pmn + "," + name);
BTraceUtils.println();
}
}
攔截時機
Kind.ENTRY // 入口 ,預設值
Kind.RETURN // 返回
kind.THROW // 異常
Kind.LINE // 行
返回地攔截
@BTrace
public class PrintArgSimple {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="arg1",
[email protected](Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, AnyType[] args) {
BTraceUtils.printArray(args);
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
攔截行判斷
@BTrace
public class PrintLine {
@OnMethod(
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
method="exception",
// 攔截方法裡的所有行
[email protected](value=Kind.LINE, line=-1)
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn, int line) {
BTraceUtils.println(pcn+","+pmn + "," +line);
BTraceUtils.println();
}
}
通過正則表示式的方式攔截
@BTrace
public class PrintRegex {
@OnMethod(
// 這個類名支援正則表示式
clazz="com.lucasma.monitor.monitor_tuning.chapter4.Ch4Controller",
// 攔截這個類的所有方法
method="/.*/"
)
public static void anyRead(@ProbeClassName String pcn, @ProbeMethodName String pmn) {
BTraceUtils.println(pcn+","+pmn);
BTraceUtils.println();
}
}
使用 Btrace 注意點
- 預設只能本地
- 可以在生產環境使用,但是被Btrace 修改後的 ,但是被修改的位元組碼,在Btrace 程序退出之後,是不會被還原的,除非 JVM 重啟。