最近我们在 Github 上开源了去哪儿网内部的 Java 应用诊断工具 Bistoury,本文将从 Bistoury 是什么、为什么做 Bistoury、Bistoury 能干什么这几个方面对 Bistoury 进行介绍。
Bistoury 是去哪儿网开源的一个对应用透明,无侵入的 Java 应用诊断工具。
Bistoury 的目标是一站式 Java 应用诊断解决方案,让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断效率和诊断能力。
Bistoury 在公司内部原有 agent 的基础上集成 Alibaba 开源的 arthas 和唯品会开源的 vjtools。你可能要问,arthas 和 vjtools 已经是很优秀的 java 诊断工具,为什么还要做一个 Bistoury,这为了 kpi 轮子都懒得造,直接把别人造好的俩轮子粘上就完了?当然不是,Bistoury 在使用上做了一些针对性的优化,并且提供了一些能极大增强开发人员诊断能力的功能,用过都知道。
我们提供了一些强大的诊断功能,这里简单介绍一下其中的在线 debug 和线程级 cpu 监控,以及我们做的一些优化。
曾经在微博上流传着这么一个程序员才懂的笑话:NASA 要发射一个新型火箭,火箭发射升空后发现不行,NASA 把火箭拖回来加了两行 log,再次发射,发现又不行,又加了两行 log 发射,发现又不行…当然这只是一个笑话,但这样的场景在我们的实际开发中却屡见不鲜,多少次系统重启后问题复现失败,多少次我们解决故障的时间就在不断地加 log,发布,加 log,发布的过程中溜走…
Arthas 的 watch 命令让我们可以观察函数的入参、返回值、异常等等,然而似乎每次 watch 都需要看看文档里参数该如何设置,面对函数中的本地变量也是无能为力,特别是行数较多的方法,方法内部的情况还是难以明了,想象一下面对上百行的方法,你需要脑补出其中各个本地变量值的情形,这个时候,我们无比怀念 ide 的 debug 功能。
不过这样的日子已经一去不复返了,Bistoury 实现了在线 Debug,它模拟了 ide 的调试体验,可以直接在代码上添加断点,甚至还支持条件断点。断点触发后,Bistoury 会捕捉断点处的各种信息,内部状态一览无余。
等等,这似乎就是 ide 的远程调试功能?可以说很类似但又不一样:
用过后你会发现,它就是在调试时你真正想要的那一个!
在线 debug 的使用只需要简单的三步,首先选择应用和机器;然后搜索需要调试的类;最后在具体行上添加断点等待命中。
在系统的日常运维中,我们有时会碰到 cpu 使用率突然飙高的情况。这个时候我们会登录机器,top 查看进程 id,top -h 查看消耗 cpu 的线程 id,然后 jstack 看看对应的线程是哪一个,最后再进行具体分析。
暂且不考虑这一系列操作需要的时间,我们收到报警的时候可能正在公司外吃饭,或是正在睡觉,而等我们做好准备登录上机器时问题已经结束了,现场没了,我们还能做的就只是看着机器的 cpu 监控图一脸茫然…
当遇到这些情况时,你会发现你需要的是线程级 cpu 监控帮你指出问题线程,而不是传统的机器 cpu 监控让你只能看着监控图一脸懵逼。
Bistoury 就是你需要的那一个!我们提供了线程级的 cpu 使用率监控,它在本地保存了最近三天的线程级监控数据,你可以根据线程名查看每个线程每分钟的 cpu 使用率,我们还对每个线程每分钟提供一个瞬时的线程调用栈。
Arthas 和 vjtools 通过命令行或类似的方式使用,不可否认命令行在很多时候具有比较高的效率;但图形化界面也有其自身的优点,特别是在参数复杂时使用起来更加简单,效率更高。Bistoury 在保留命令行界面的基础上,还对很多命令提供了图形化界面,方面用户使用。
Arthas 和 vjtools 针对单台机器,从机器的维度对系统进行诊断,没有提供全局的视角;但在线应用往往部署在多台机器,Bistoury 可以和使用方应用中心整合,从应用的维度对系统进行诊断,提供了更多的可能。
Arthas 和 vjtools 在使用上,要么登录机器,要么需要使用者提供相应的 ip 和端口;Bistoury 去掉各种设置,提供统一的 web 入口,从页面上选择应用和机器即可使用。
也许你正面对一个难以捉摸的线上问题束手无策,不妨试试我们提供的 Bistoury 快捷部署脚本,在一分钟内启动 Bistoury 然后插入断点开始调试吧!
GitHub 地址: https://github.com/qunarcorp/bistoury
作者介绍:
聂振宇,2013 年加入去哪儿网技术团队,目前在基础架构部,对并发编程,构建高并发系统很感兴趣。