今天使用了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 = "/.*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-------------------------");
- }
- }
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