最近我们在 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)
来源: http://www.tuicool.com/articles/73En6n2