线上性能问题排查工具btrace使用例子

来源:互联网 发布:windows 安全 编辑:程序博客网 时间:2024/05/16 19:04

安装

现在btrace项目已经迁移到了github上了。这点可以从官网( https://kenai.com/projects/btrace/downloads/directory/releases/latest )上看出。

点开这个链接就会跳转到btrace项目的github地址:https://github.com/btraceio/btrace

下面直接给出下载地址:https://github.com/btraceio/btrace/releases 

脚步编写准备

写btrace脚本和一般的java差别不大,只是用了一些annotation来标识某个类是跟踪脚本。btrace用到的jar包基本都在下载的/btrace-bin/build文件下,将这三个包导进工程就可以使用了。【btrace脚本写好后可以不用编译,直接执行.java文件就可以】

设置运行环境变量

mkdir btracetar

tar-zxvf btrace-bin-1.3.8.1.tgz-C btrace

修改/etc/profile

export BTRACE_HOME=/opt/app/btrace

export PATH=$BTRACE_HOME/bin:$PATH

配置tomcat javaagent

修改catalina.sh

$JAVA_OPTS=-javaagent:btrace-agent.jar

 将$BTRAC_HOME/build jar包放入$TOMCAT_HOME/lib
脚本代码:

package lee;

import static com.sun.btrace.BTraceUtils.name;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.probeClass;
import static com.sun.btrace.BTraceUtils.probeMethod;
import static com.sun.btrace.BTraceUtils.str;  
import static com.sun.btrace.BTraceUtils.strcat;  
import static com.sun.btrace.BTraceUtils.timeMillis;  
  
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 Btrace_script {
@TLS //定义一个threadLocal类型变量
    private static long startTime = 0;  
      
    @OnMethod(clazz = "/lee\\..*/", method = "/.+/",location=@Location(Kind.ENTRY)) 
    //定义的正则表达式要在 /  /里    ;Kind.ENTRY为加载进入时;Kind.RETURN为离开时
    public static void startMethod(){  
        startTime = timeMillis(); 
        println("-----------------begin--------------------------"); 
    }  
      
    @OnMethod(clazz = "/lee\\..*/", method = "/.+/", location = @Location(Kind.RETURN))  
    public static void endMethod(){ 
    long timecost = timeMillis()-startTime;
    println(strcat(strcat(name(probeClass()),","),probeMethod()));
    if(timecost > 50) {
    println(strcat("the class method execute time=>", str(timecost)));  
    }
    println("-----------------end--------------------------");  
    }  
}

被监控实例代码:

// Servlet必须继承HttpServlet类
@WebServlet(name="firstServlet"
, urlPatterns={"/firstServlet"})
public class FirstServlet extends HttpServlet
{
// 客户端的响应方法,使用该方法可以响应客户端所有类型的请求
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,java.io.IOException
{
// 设置解码方式
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charSet=GBK");
// 获取name的请求参数值
String name = request.getParameter("name");
// 获取gender的请求参数值
String gender = request.getParameter("gender");
// 获取color的请求参数值
String[] color = request.getParameterValues("color");
// 获取country的请求参数值
String national = request.getParameter("country");

int max=60;
        int min=40;
        Random random = new Random();


        int s = random.nextInt(max)%(max-min+1) + min;
try {
Thread.sleep(s);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 获取页面输出流
PrintStream out = new PrintStream(response.getOutputStream());
//输出HTML页面标签
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet测试</title>");
out.println("</head>");
out.println("<body>");
// 输出请求参数的值:name
out.println("您的名字:" + name + "<hr/>");
// 输出请求参数的值:gender
out.println("您的性别:" + gender + "<hr/>");
// 输出请求参数的值:color
out.println("您喜欢的颜色:");
for(String c : color)
{
out.println(c + " ");
}
out.println("<hr/>");
out.println("您喜欢的颜色:");
// 输出请求参数的值:national
out.println("您来自的国家:" + national + "<hr/>");
out.println("</body>");
out.println("</html>");
}
}

运行脚步脚步监控:

1、启动tomcat运行被监控web servlet.

2、查找运行的Java进程ID ,命令 jps

3 、启动监控脚步:

btrace 6140 Btrace_script.java 

运行效果图:


更多参考资料:

2. http://agapple.iteye.com/blog/962119

3. http://agapple.iteye.com/blog/1005918


原创粉丝点击