btrace是个好东东

今天同事遇到一个问题,测试环境和线上环境数据不一致,

由于我们的线上预发布环境只开发了80端口,所以无法debug,之前我们的做法就是在代码添加log,然后覆盖预发环境的相关jar,这个使用起来比较麻烦

早就听说btrace很方便,今天特意尝试了一下,


我们的需求就是捕捉线上某个方法的输入参数的值及返回值

step0) 安装btrace

wget http://kenai.com/projects/btrace/downloads/download/releases/release-1.2.1/btrace-bin.tar.gz并解压即可


step1) 产生一个btrace脚本

import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
import java.util.Set;
import com.sun.btrace.AnyType;

@BTrace public class GetParam {


@OnMethod( //​【1】
     clazz="xxpackage.OfferSearchImpl",
     method="getOffer",
     location=@Location(Kind.RETURN)  //【2】
     )
   public static void onGetOffer(@Return String result,@ProbeMethodName String pmn, AnyType[] args){ //【3】

        println(pmn);
        println(get(field(classOf(args[0]),"recommended",false),args[0]));//【4】
        println(result);
    }
}

  • 脚本添加注解@BTrace
  • 【1】实际就是触发点,也许是方法@OnMethod,也许是异常抛出@Error......,@OnMethod应该能覆盖绝大部分场景详见官方文档的Method Annotations
  • 【2】更细粒度的触发点,典型的就是Kind.RETURN、Kind.THROW....,有些Argument Annotations需要添加这种触发点(即仅仅第一种触发还不够),比如@Return,详见官方文档的Unannotated arguments
  • 【3】需要监控的数据,本例中使用了@Return,@ProbeMethodName,详见官方文档的Argument Annotations
  • 【4】既然拿到了监控数据,就得想办法打印出来,本例中使用了get,field,classOf来打出某个实例的某个字段,类似java中的反射,还有很多实用方法,详见BTraceUtils的API
step2)运行


然后启动btrace脚本${BTRACE_HOME}/bin/btrace ${JAVA_PID} ${PATH/TO}/GetParam.java



小结

写出了脚本之后,我们通过在不同环境中检测很快定位到了问题,如果了解了上面标出的4个关键点,并且参看官方文档以及安装文件自带的sample应该能快速的写出很多实用的监控脚本,不得不说,btrace是线上监控的利器

你可能感兴趣的:(BTrace)