在前面的服务端性能测试实战系列文章中详细地介绍了性能测试中性能测试的理论,以及针对JVM中它的监控和GC日志输出等信息。当应用程序部署后,也可以通过动态的方式来关注应用程序中需要关注的信息。BTrace通俗的理解就是应用程序在运行的情况下可以动态的修改程序的字节码,通过这样的手段可以达到针对运行的应用程序监控调试的目的,通过BTrace可以动态的实现向目标应用程序的字节码注入追踪代码,下面详细的介绍下这部分的案例应用。
在https://github.com/btraceio/btrace中下载btrace-v2.2.3-bin.tar.gz,下载成功后进行解压,配置btrace的环境变量,配置成功后在控制它输入来验证配置环境的准确,具体如下。
代码语言:javascript复制btrace --version
BTrace v.2.2.3 (71df581ff6c89afa41ef611b987fc87c17ee8537)
环境搭建成功后,运行Btrace主要有两种方式,分别是JVisualVM以插件的方式来运行,另外一种是通过命令行的模式来运行。在JVisualVM中选择BTrace Workbench插件,具体如下图所示。
选择插件,然后下一步下一步的进行安装,该插件安装成功后如下所示。
不管是以茶见的模式来执行还是以命令行的模式来运行,最终都是需要通过编写BTrace脚本的模式来执行达到监控调试的目的。下面通过一个简单的案例,编写REST的API,它的源码具体如下:
代码语言:javascript复制package com.example.dbplus.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController
{
@RequestMapping("/login")
public String login(@RequestParam("name")String name,@RequestParam("passwd") String passwd)
{
return "login username:" name " and login password:" passwd;
}
}
在如上代码中,编写的请求方法是login,query params的参数分别是name和passwd。然后编写BTrace的脚本,通过BTrace的脚本达到监控执行的是那个类那个方法以及API执行中它的参数信息。要使用BTrace的前提是首先需要在pom.xml文件中引入它的依赖,具体需要在pom.xml文件中添加如下部分:
代码语言:javascript复制 <dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-client</artifactId>
<version>1.2.3</version>
</dependency>
接下来编写BTrace的脚本,具体代码如下所示。
代码语言:javascript复制import org.openjdk.btrace.core.BTraceUtils;
import org.openjdk.btrace.core.annotations.*;
import org.openjdk.btrace.core.types.AnyType;
@BTrace
public class MonitorRestParams
{
@OnMethod(
//被拦截的具体类的名称完整信息
clazz = "com.example.dbplus.controller.LoginController",
//被拦截的方法名称
method = "login",
//拦截的方式:入口的方式
location =@Location(Kind.ENTRY)
)
public static void anyRead(@ProbeClassName String className, @ProbeMethodName String methodName, AnyType[] args)
{
BTraceUtils.printArray(args);
BTraceUtils.println("类:" className ",方法:" methodName);
BTraceUtils.println();
}
}
在如上的BTrace脚本中实现了通过BTrace脚本来达到监控被运行程序的类,方法以及REST中API的参数。执行BTrace命令行的模式是首先获取被运行程序的PID信息,然后执行BTrace的脚本,具体过程如下所示。
代码语言:javascript复制jps -l
#获取运行程序的PID信息
70177 com.example.dbplus.DbPlusApplication
#执行BTrace的脚本
btrace 70177 MonitorRestParams.java
调用应用程序后,输出如下的信息:
代码语言:javascript复制#运行程序后输出的信息
[main] INFO org.openjdk.btrace.client.Main - Attaching BTrace to PID: 70177
[main] INFO org.openjdk.btrace.client.Client - Successfully started BTrace probe: MonitorRestParams.java
[wuya, admin, ]
类:com.example.dbplus.controller.LoginController,方法:login
如上所示的是被运行的程序调用后获取到的信息。BTrace还有很多优秀的特性,在后续的文章中持续介绍它在监控调试中的案例应用实战。