Btrace使用教程

下载

下载链接:https://github.com/btraceio/btrace/releases/tag/v1.3.9

安装及环境配置

 
  1. 1.下载一个压缩包

  2.  
  3. 2.解压

  4.  
  5. 3.配置环境变量 sudo vi /etc/profile 添加 export BTRACE\_HOME=/home/josonliu/btrace export PATH=$PATH:$BTRACE\_HOME/bin PS:BTRACE\_HOME必须是你解压的路径

  6.  
  7. 4.使配置生效 source /etc/profile 这样就可以在任何地方使用 btrace 命令了

BTrace简介及使用须知

 
  1. BTrace是一个可以对 JAVA 进行安全、动态追踪的工具。为了保证在追踪动作的只读性,追踪动作不能改变程序的状态。一般来说 BTrace 具体有以下限制(禁令):

  2.  
  3. 1.不准创建新对象!

  4.  
  5. 2.不准创建新数组!

  6.  
  7. 3.不准抛出异常!

  8.  
  9. 4.不准捕捉导常!

  10.  
  11. 5.不准使用断言或静态方法 只准使用 com.sun.btrace.BTraceUtils 中定义的类和方法及脚本里定义的 static 方法。

  12.  
  13. 6.不准对追踪的类或对象进行赋值操作

  14.  
  15. 7.不准使用外部、内部、嵌入或本地类

  16.  
  17. 8.不准实现接口

  18.  
  19. 9.不准使用循环

  20.  
  21. 其实就是一句话 只使用 println\(\) 方法进行打印信息就好 哈哈

使用方法

 
  1. 1.找到要监控的 JVM进程 PID

  2.  
  3. a.通过 top -c 命令找到

  4.  
  5. b.通过 ps -ef \| grep 对应进程标识

  6.  
  7. 2.切换到进程拥有账户 一般为 www-data

  8.  
  9. a.sudo -s 切换到 root 账户

  10.  
  11. b.btracec 监控脚本 对监控脚本进行预编译 这一点很重要,可以在运行前发现错误。特别是应用到线上环境,必须强制先预编译一下,看是否报错。

  12.  
  13. c.sudo -u www-data btrace $PID $监控脚本

  14.  
  15. 3.如需修改监控只需要停止运行后 修改脚本 然后运行脚本即可。

  16.  
  17. 4.BTrace脚本在进程重启后会失效。

使用场景

 
  1. 1.查看某一个方法中入参

  2.  
  3. 2.查看某一个方法的响应时间

  4.  
  5. 3.查看某一个方法中所有外部调用的响应时间,方便定位方法响应慢的具体位置及原因

  6.  
  7. 4.查看谁调用了 System.gc(),及其对应的调用栈

实战DEMO

1.监控指定方法的耗时

 
  1. import com.sun.btrace.annotations.\*;

  2.  
  3. import static com.sun.btrace.BTraceUtils.\*;

  4.  
  5. @BTrace

  6.  
  7. public class CheckOnlineStatus{

  8.  
  9. //监控某一个方法的执行时间

  10.  
  11. @OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",location=@Location\(Kind.RETURN\)\)

  12.  
  13. public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){

  14.  
  15. println\(probeClassName + ",duration:" + duration / 1000000 + " ms"\);

  16.  
  17. }

  18.  
  19. }

  20.  
  21. 这里是监控 BtraceServiceImpl 方法中 getCount 的调用情况。duration是以纳秒为单位的,所以换算成 MS 比较好看一点 ,其他例子也是如此考虑。

2.监控指定函数中所有外部调用的耗时情况.PS:这里最好只监控一个函数 太多的话 性能没法看

 
  1. import com.sun.btrace.annotations.\*;

  2.  
  3. import static com.sun.btrace.BTraceUtils.\*;

  4.  
  5. @BTrace

  6.  
  7. public class CheckOnlineStatus{

  8.  
  9. //监控某一个方法的执行时间

  10.  
  11. @OnMethod\(clazz = "com.joson.btrace.service.impl.BtraceServiceImpl",method = "getCount",

  12.  
  13. location=@Location\(value=Kind.CALL,clazz="/.\*/",method="/.\*/",where = Where.AFTER\)\)

  14.  
  15. public static void printMethodRunTime\(@Self Object self,@TargetInstance Object instance,@TargetMethodOrField String methon,@Duration long duration\){

  16.  
  17. if\( duration > 5000000 \){//如果耗时大于 5 毫秒则打印出来 这个条件建议加 否则打印的调用函数太多 具体数值可以自己调控

  18.  
  19. println\(methon + ",cost:" + duration / 1000000 + " ms"\);

  20.  
  21. }

  22.  
  23.  
  24.  
  25. }

  26.  
  27. }

  28.  
  29. 这里是监控 BtraceServiceImpl 类中 getCount 方法内的外部方法调用情况并打印出响应时间大于 5 MS 的外部调用方法名 。

  30.  
  31. 通过注入 @TargetInstance 和 @TargetMethodOrField 参数,告诉脚本实际匹配到的外部函数调用的类及方法名\(或属性名\)

3.按接口、父类监控方法的执行

 
  1. import com.sun.btrace.annotations.\*;

  2.  
  3. import static com.sun.btrace.BTraceUtils.\*;

  4.  
  5. @BTrace

  6.  
  7. public class InterfaceMonitor{

  8.  
  9. //监控某一个方法的执行时间

  10.  
  11. @OnMethod\(clazz = "+com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)

  12.  
  13. public static void printMethodRunTime\(@ProbeClassName String probeClassName,@Duration long duration\){

  14.  
  15. println\(probeClassName + ",cost time:" + duration / 1000000 + " ms"\);

  16.  
  17. }

  18.  
  19. }

  20.  
  21. 这里是监控 BtraceService 接口的所有实现类中 对 getCount 方法的调用情况。

4.正则表达式定位监控

 
  1. 通过正则表达式可以实现批量定位,正则表达式需要写在两个 "/" 中间。PS:建议正则表达式的范围要尽可能的小,不然会非常慢。

  2.  
  3. import com.sun.btrace.annotations.\*;

  4.  
  5. import static com.sun.btrace.BTraceUtils.\*;

  6.  
  7. @BTrace

  8.  
  9. public class ServiceMonitor{

  10.  
  11. //监控某一个方法的执行时间

  12.  
  13. @OnMethod\(clazz = "/com.joson.btrace.service.\*/",method = "/.\*/",location=@Location\(Kind.RETURN\)\)

  14.  
  15. public static void printMethodRunTime\(@ProbeClassName String probeClassName,@ProbeMethodName String probeMethod,@Duration long duration\){

  16.  
  17. println\( probeClassName + "." + probeMethod + " cost time: " + duration / 1000000 + " ms."\);

  18.  
  19. }

  20.  
  21. }

  22.  
  23.  
  24.  
  25. 这里是监控 com.joson.btrace.service 包下的所有类与方法,并打印其调用时间 以 MS 为单位。

  26.  
  27. 通过在函数里注入 @ProbeClassName,@ProbeMethodName 参数,告诉脚本实际匹配到的类和方法名。

5.监控代码是否到达了某类的某一行

 
  1. import com.sun.btrace.annotations.\*;

  2.  
  3. import static com.sun.btrace.BTraceUtils.\*;

  4.  
  5. @OnMethod\(clazz = "java.net.ServerSocket", location = @Location\(value = Kind.LINE, line = 363\)\)

  6.  
  7. public static void onBind4\(\) {

  8.  
  9. println\("socket bind reach line:363"\);

  10.  
  11.  
  12.  
  13. }

  14.  
  15. 这里是监控代码是否到达了 Stock类的 363 行。

6.打印某个类中 某一方法的入参

 
  1. import com.sun.btrace.AnyType;

  2.  
  3. import com.sun.btrace.annotations.\*;

  4.  
  5. import static com.sun.btrace.BTraceUtils.\*;

  6.  
  7. @BTrace

  8.  
  9. public class ServiceMonitor{

  10.  
  11. //监控某一个方法的执行时间

  12.  
  13. @OnMethod\(clazz = "com.joson.btrace.service.BtraceService",method = "getCount",location=@Location\(Kind.RETURN\)\)

  14.  
  15. public static void printMethodRunTime\(@Self Object self,String type,Integer limit,@Return AnyType result \){

  16.  
  17. println\( "type: " + type + " ,limit: " + limit \);

  18.  
  19. println\("result : " + result \);

  20.  
  21. }

  22.  
  23. }

  24.  
  25. 这里是监控 BtraceService 类中 getCount 方法的所有入参及返回值

  26.  
  27. 对于入参,不需要打印的也可以不定义 但是定义一定要按顺序。比如参数列表不能放在返回值的后面。

  28.  
  29. 对于返回值类型 如果是非基本类型 则直接用 AnyType 类型即可。

7.查看谁调用了 GC

 
  1. import com.sun.btrace.annotations.\*;

  2.  
  3. import static com.sun.btrace.BTraceUtils.\*;

  4.  
  5. @OnMethod\(clazz = "java.lang.System", method = "gc"\)

  6.  
  7. public static void onSystemGC\(\) {

  8.  
  9. println\("entered System.gc\(\)"\);

  10.  
  11. jstack\(\);// print the stack info.

  12.  
  13. }

8.其他用法参考链接:https://github.com/btraceio/btrace/tree/master/samples

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值