BTrace实践

        今天使用了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 

猜你喜欢

转载自gigi-112.iteye.com/blog/1704424