去哪儿网 Java 应用诊断工具 Bistoury 开源

最近我们在 Github 上开源了去哪儿网内部的 Java 应用诊断工具 Bistoury,本文将从 Bistoury 是什么、为什么做 Bistoury、Bistoury 能干什么这几个方面对 Bistoury 进行介绍。

Bistoury 是什么

Bistoury 是去哪儿网开源的一个对应用透明,无侵入的 Java 应用诊断工具。

Bistoury 的目标是一站式 Java 应用诊断解决方案,让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断效率和诊断能力。

为什么做 Bistoury

Bistoury 在公司内部原有 agent 的基础上集成 Alibaba 开源的 arthas 和唯品会开源的 vjtools。你可能要问,arthas 和 vjtools 已经是很优秀的 java 诊断工具,为什么还要做一个 Bistoury,这为了 kpi 轮子都懒得造,直接把别人造好的俩轮子粘上就完了?当然不是,Bistoury 在使用上做了一些针对性的优化,并且提供了一些能极大增强开发人员诊断能力的功能,用过都知道。

Bistoury 能做什么

我们提供了一些强大的诊断功能,这里简单介绍一下其中的在线 debug 和线程级 cpu 监控,以及我们做的一些优化。

在线 debug

曾经在微博上流传着这么一个程序员才懂的笑话:NASA 要发射一个新型火箭,火箭发射升空后发现不行,NASA 把火箭拖回来加了两行 log,再次发射,发现又不行,又加了两行 log 发射,发现又不行…当然这只是一个笑话,但这样的场景在我们的实际开发中却屡见不鲜,多少次系统重启后问题复现失败,多少次我们解决故障的时间就在不断地加 log,发布,加 log,发布的过程中溜走…

Arthas 的 watch 命令让我们可以观察函数的入参、返回值、异常等等,然而似乎每次 watch 都需要看看文档里参数该如何设置,面对函数中的本地变量也是无能为力,特别是行数较多的方法,方法内部的情况还是难以明了,想象一下面对上百行的方法,你需要脑补出其中各个本地变量值的情形,这个时候,我们无比怀念 ide 的 debug 功能。

不过这样的日子已经一去不复返了,Bistoury 实现了在线 Debug,它模拟了 ide 的调试体验,可以直接在代码上添加断点,甚至还支持条件断点。断点触发后,Bistoury 会捕捉断点处的各种信息,内部状态一览无余。

等等,这似乎就是 ide 的远程调试功能?可以说很类似但又不一样:

  • 在线 debug 在使用,功能上和远程调试,或者说你在 ide 上 debug 本地代码几乎一致。你在代码某一行打一个断点,断点触发就能看到本地变量、成员变量、静态变量以及调用栈。
  • 远程调试需要系统启动时就带上调试相关参数,线上应用启动时不可能默认打开调试功能,不说去加上参数然后重启系统的麻烦,重启后你想找的问题可能已经没法复现了;而在线 debug 不需要应用做任何操作。
  • 远程调试的断点触发后整个系统会暂停,线上应用这么操作很可能会导致故障;在线 debug 触发断点后只打印快照信息,打印完后继续执行代码逻辑,不影响系统的运行。

用过后你会发现,它就是在调试时你真正想要的那一个!

使用

在线 debug 的使用只需要简单的三步,首先选择应用和机器;然后搜索需要调试的类;最后在具体行上添加断点等待命中。

线程级 cpu 监控

在系统的日常运维中,我们有时会碰到 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

本文转载自微信公众号:Qunar 技术沙龙(ID:QunarTL)

作者介绍:

聂振宇,2013 年加入去哪儿网技术团队,目前在基础架构部,对并发编程,构建高并发系统很感兴趣。