是一个异常日志收集的客户端,用javaagent&asm实现,可以收集error级别(也可以配置info和debug级别日志) 的所有日志发送到redis队列里(采用二进制传输协议 更小更快)。这个是客户端,需要自己实现服务端消费获取队列里的消息,处理并展示(woodpecker服务端地址)。而且可以支持线上debug, 性能等分析命令,可以应用运行后attach分析。部分命令支持mvel2表达式。
git clone git@github.com:guoyang1982/woodpecker-client.git
cd wpclient-agent/bin
./woodpecker-packages.sh
会在docker下生成wpclient-agent.zip运行文件,解压配置即可
解压wpclient-agent.zip包修改里面的woodpecker.properties文件,需要配置application.name 这个是项目名称,
agent.log.name是项目所使用的日志,目前支持logbak和log4j,redis.cluster.host集群服务器(ip:port,ip:port)
redis.cluster.password集群服务器的密码。其他都是可配置项,有默认,看注释。
java -javaagent:/jar包路径/wpclient-agent.jar=/配置文件路径/woodpecker.properties
-jar 运行的jar包.jar
加入agent到CATALINA_OPTS 在 Tomcat 启动脚本 (catalina.sh).
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/jar包路径/wpclient-agent.jar=/配置文件路径/woodpecker.properties"
加入以下配置到 /conf/resin.xml:
<jvm-arg>-javaagent:/jar包路径/wpclient-agent.jar=/配置文件路径/woodpecker.properties</jvm-arg>
jps 获取应用的pid 然后./woodpecker-launch.sh pid 最后执行./woodpecker-run.sh ip port 就ok了
-Dwoodpecker.applicationName=应用名
-Dwoodpecker.consolePort=控制端端口
如果jvm加上这个两个参数则会覆盖配置文件里的application.name和log.netty.server.port 主要为了方便多个应用在同一个服务器上用同一个
配置文件。(也可以用不同配置文件解决)
telnet ip port
./woodpecker-run.sh ip port
进去后,输入help,可以看到所有命令和命令的解释。主要控制项为:心跳检查redis开关,线程池队列监控,发送消息开关,日志级别
控制,jvm信息展示,内存使用信息展示,耗时线程栈展示,跟踪类方法耗时调用信息,查看类方法入参和返回值,查看已加载类详细信息,
查看已加载类的方法,查看方法的堆栈信息。
客户端支持命令补全(tab),还有历史记录(上下建)。
如下设置root级别为debug,设置com.gy.woo.classname打印日志级别为debug
查看方法调用路径和耗时,支持输出结果到文件,参数-o trace.log,看例子:help trace.
[]中括号里以逗号分隔成两个耗时,前面表示从调用链第1条到本方法执行完毕的总耗时,后面表示本方法自身的耗时,
@后面是行号,第一条括号里面的是总共耗时。trace命令可以看方法内部的执行路径。如果发生异常可以提示异常类型。
目前只支持一级方法内部情况。
根据条件过滤,如:只打印大于耗时1ms以上的,支持各种表达式
线上方法调用量太大,跟踪方法会刷屏,并且不能跟踪特定的某个方法调用,可以使用参数表达式解决:
如果是对象的话:
params代表参数,是个数组有几个参数,数组长度就为几,params[0]代表第一个参数,如果这个参数是个list对象,
可以params[0][0],代表list对象里的第一个值,如果这个值是对象,可以params[0][0].name代表这个对象里的
name属性。如上面的params[0]==227854954,我跟踪的方法第一个参数是userid,也就是只跟踪userid==227854954
的方法调用。而params[0][0].name=='lms',是我跟踪的方法第一个参数是list,而list里有对象,对象里有属性name,
所以指的是只跟踪方法第一个参数,list里第一个对象的属性值name为lms的方法调用。依此类推。表达式是用mvel实现的。
如果方法发生异常等错误,需要查看方法的入参和返回值,可以用这个命令。也可以支持参数表达式,如trace命令。
支持输出结果到文件,参数-o watch.log,看例子:help watch.
参数p是返回所有入参,x是层次展示
参数r是返回返回值 包括异常,也会返回入参(但是代码中对入参进行修改了,就是修改后的值)
方法调用命令,可以在客户端远程调用应用内的方法。
查询类的某个方法的详细信息。
查询jvm的详细信息。
查看应用线程占用cpu时间,能够排查占用cpu时间最大的线程栈,进而追踪到有问题的代码.支持输出结果到文件,参数-o top.log,看例子:help top.
查看内存占用情况,以及垃圾收集情况,和jdk的jstat功能一样
查看方法的线程栈,当不知道方法的调用路径时,这个比较不错,尤其对二方包等。
pring命令可以在类的某个方法里打印变量值包括局部和成员变量,支持打印对象,int,long,等值,看命令参数。也可以支持参数表达式,如trace命令。
支持输出结果到文件,参数-o print.log,看例子:help print.
适合:服务在启动后,出现问题急切需要知道变量的值而不需要重新打印log日志重启服务。
说明:
- print:命令名
- 参数:包含-i,-l,-d等,支持其他参数 查 help print,这些参数主要为了打印基本类型的变量,-i就是int,-l就是long,默认是对象.
- com..ope.controller.:类名 全路径 目前不支持正则匹配
- channelList:方法名
- 80:插入代码的行号
- user:要打印的变量
监控命令,监控接口调用率。支持输出结果到文件,参数-o monitor.log,看例子:help monitor.
参数:-c 时间秒
扫描系统内最耗时的方法。支持输出结果到文件,参数-o scan.log,看例子:help scan. 参数:-c 时间秒
例子:scan -c 5 包名
就会找出这个包名下的所有类里的最耗时的方法。建议一次扫描的类不要太多。-c 5,指的是每5秒一次统计输出。
以下是实际项目使用的异常收集服务:
- wp-server模块:这个是分布式取消息服务,每个线程池对应一个应用(每个应用是redis里一个key,看客户端代码),获取消息存到mongodb里。
- wp-web模块:是web服务,可以按照用户注册应用并添加报警邮件信息,监听每个应用,可以看到自己权限下的应用的异常详细信息,并按异常类型汇总,提供报表图进行统计。
#命令后期支持