今天同事遇到一个问题,测试环境和线上环境数据不一致,
由于我们的线上预发布环境只开发了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脚本${BTRACE_HOME}/bin/btrace ${JAVA_PID} ${PATH/TO}/GetParam.java
小结
写出了脚本之后,我们通过在不同环境中检测很快定位到了问题,如果了解了上面标出的4个关键点,并且参看官方文档以及安装文件自带的sample应该能快速的写出很多实用的监控脚本,不得不说,btrace是线上监控的利器