btrace 学习笔记

来源:互联网 发布:域名whois反查 编辑:程序博客网 时间:2024/05/29 17:53

一直听说大名鼎鼎的btrace,今天抽空玩了一下,确实是现网利器!

目标:使用btrace监控tomcat中的servlet

1.      环境说明

操作系统:ubuntu-64

Jdk:jdk 1.7

Btrace:1.2.2

2.      环境变量设置

修改/etc/profile

1)      JAVA_HOME

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/

export PATH=$JAVA_HOME/bin:$PATH

exportCLASSPATH=.:$JAVA_HOME/lib/rt.jar:$JAVA_HOME/lib/tools.jar

2)      BTRACE_HOME

export BTRACE_HOME=/opt/app/btrace

export PATH=$BTRACE_HOME/bin:$PATH

3.      配置tomcat javaagent

修改catalina.sh

$JAVA_OPTS=-javaagent:btrace-agent.jar

4.      将$BTRAC_HOME/build jar包放入$TOMCAT_HOME/lib
5.  servlet代码
HelloServlet.java
public class HelloServlet extends HttpServlet{private static int cnt=0;public synchronized int getCnt(){return cnt++;}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {getCnt();String user=req.getParameter("user");if(!checkUser(user)){out(resp,"login failed");return;}out(resp,"login success");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}private boolean checkUser(String user){if(user==null||user.equals(""))return false;return true;}private void out(HttpServletResponse resp,String res) throws IOException{OutputStream out=resp.getOutputStream();out.write(res.getBytes());out.flush();out.close();}}

6.      btrace 代码

TraceServlet.java

@BTracepublic class TraceServlet {@TLSprivate static long startTime=0;//方法开始时监测cnt属性//Kind.ENTRY @OnMethod(clazz="com.unei.servlet.HelloServlet",method="doGet",location=@Location(Kind.ENTRY))public static void tracePropertyBefore(@Self Object self){println(strcat("threadId:",str(threadId(currentThread()))));Field cntField=field("com.unei.servlet.HelloServlet","cnt");Integer c=(Integer)get(cntField,self);println(strcat("start cnt:",str(c)));}/** * 方法结束时监测cnt属性 * @param @Self self this */@OnMethod(clazz="com.unei.servlet.HelloServlet",method="doGet",location=@Location(Kind.RETURN))public static void tracePropertyAfter(@Self Object self){Field cntField=field("com.unei.servlet.HelloServlet","cnt");Integer c=(Integer)get(cntField,self);println(strcat("end cnt:",str(c)));println("-----------------------");}/** * 打印方法参数 * @ProbeClassName 类名 * @ProbeMethodName 方法名 * args 目标方法参数 */@OnMethod(clazz="/com.unei.*/",method="/check.*/")public static void anyRead(@ProbeClassName String pcn,@ProbeMethodName String pmn,AnyType[] args){println(strcat("method:",strcat(strcat(pcn,"."),pmn)));print("args:");printArray(args);}

7.执行脚本
查看tomcat进程号:12876
执行btrace脚本,然后客户端请求tomcat,看到如下结果:


8.学习中遇到的问题

1)connection refused

  解决方法:jvm可能会影响,换了oracle的jvm(不清楚是否真的有影响),javaagent 配置,这个其实官方文档的实例命令是有的


参考资料:

1. 下载的btrace 中的docs,第一手资料^-^,文档中的实例是最好的教程。

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

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

0 0