今天使用了BTrace排查线上问题,发现很好用,推荐给大家。
import static com.sun.btrace.BTraceUtils.println; import static com.sun.btrace.BTraceUtils.*; import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.str; import static com.sun.btrace.BTraceUtils.strcat; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.Kind; import com.sun.btrace.annotations.Location; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.ProbeClassName; import com.sun.btrace.annotations.ProbeMethodName; import com.sun.btrace.annotations.TLS; @BTrace public class CreativeBtrace{ @TLS private static long startTime = 0; @OnMethod(clazz = "/.*CreativeBOImpl/", method = "/.*updateCreativeAuditState/") public static void startMethod(){ startTime = BTraceUtils.timeMillis(); } @OnMethod(clazz = "/.*CreativeBOImpl/", method = "/.*updateCreativeAuditState/", location = @Location(Kind.RETURN)) public static void endMethod(){ println(strcat("time taken=>",str(BTraceUtils.timeMillis()-startTime))); println("--------------------------------------"); } @OnMethod(clazz = "/.*CreativeBOImpl/", method = "/.*updateCreativeAuditState/", location = @Location(Kind.RETURN)) public static void onValieExit(@Self Object self,java.util.List o,java.lang.Long custId, @Return Object result ){ //捕获调用对象,入参和返回值 String commandName = str(result); println(commandName); println(str(o)); println(custId); } @OnMethod(clazz = "/.*CreativeBOImpl/", method = "/.*updateCreativeAuditState/", location = @Location(Kind.RETURN)) public static void print(@ProbeClassName String pcn,@ProbeMethodName String pmn) { println(pcn); println(pmn); } @OnMethod(clazz = "/.*KeywordServiceImpl/", method = "/.*getKeywordsByIdsQscore/", location = @Location(Kind.RETURN)) public static void onValieExit(@Self Object self,com.ali.luna.bserv.commons.dto.ServiceContext o,java.lang.Long[] keywordIds, @Return com.ali.luna.bserv.dto.ResultDTO result ){ String commandName = str(result); println(commandName); println(str(o)); println(strcat("word size :",str(keywordIds.length)); println("-------------onValieExit-------------------------"); } }
功能:
1.记录调用方法的运行时间
2.打印调用方法的入参和返回值
注意:
1. 运行btrace时使用相同用户权限
2. 可以在btrace中设置java_home,classpath
3. 运行命令: ${JAVA_HOME}/bin/java -Dcom.sun.btrace.probeDescPath=. -Dcom.sun.btrace.dumpClasses=false -Dcom.sun.btrace.debug=false -Dcom.sun.btrace.unsafe=false -cp ${BTRACE_HOME}/build/btrace-client.jar:${TOOLS_JAR}:/usr/share/lib/java/dtrace.jar:/home/guzhen.cg/btrace/bin/luna-service-interface-1.2.1.jar: com.sun.btrace.client.Main $*
推荐博客:
1. http://learnworld.iteye.com/blog/1402763
2. http://rdc.taobao.com/team/jm/archives/509
3. http://agapple.iteye.com/blog/962119