写点什么

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

2019 年 9 月 06 日

去哪儿网 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 年加入去哪儿网技术团队,目前在基础架构部,对并发编程,构建高并发系统很感兴趣。


2019 年 9 月 06 日 13:204514

评论

发布
暂无评论
发现更多内容

架构师训练营 第五周 【作业】

小K

架构师训练营 第五周 学习心得

李君

Week 05 作业

鱼_XueTr

负载均衡 hash

架构师训练营 第五周 学习总结

亮灯

第五周感悟

路人

极客大学架构师训练营

深入学习一致性Hash

拈香(曾德政)

算法 极客大学架构师训练营 一致性Hash算法

缓存、异步、集群和分布式等架构模式的实践

dony.zhang

负载均衡 缓存 消息队列 分布式缓存 异步

架构课第5课作业

张瑞浩

常用分布式组件

张瑞浩

week5-作业

蒜泥精英

采用负载均衡技术总结

superman

week5-作业一致性HASH算法的JAVA实现

蒜泥精英

2020-07-04-第五周作业

路易斯李李李

一致性Hash算法实现 - Java

羽球

极客大学架构师训练营 一致性哈希

【架构师训练营】第 5 周总结

花生无翼

极客大学架构师训练营

分布式和异步的技术选型

拈香(曾德政)

缓存 分布式 极客大学架构师训练营 技术选型 异步

week05学习总结

Safufu

管理堆内存,Rust是怎么做的?所有权!

袁承兴

c++ rust 堆内存管理 内存管理 垃圾回收

架构师训练营 - 学习笔记 - 第五周

小遵

架构师训练营 -Week 05 命题作业

华乐彬

极客大学架构师训练营 作业 一致性Hash算法

一致性hash算法

ashuai1106

极客大学架构师训练营

架构师训练营作业 (第五周)

小遵

架构师训练营 - 第五周 - 学习总结

Anrika

极客大学架构师训练营

分布式缓存架构

chenzt

作业 - 第5周

Happy-Coming

week5-作业 一致性 hash 算法

a晖

【架构师训练营】week 5 homework

eazonshaw

极客大学架构师训练营

架构师训练 第五周 作业

李君

架构师训练营week05 summary

Nick

极客大学架构师训练营

架构师训练营 - 第五周学习总结

hellohuan

极客大学架构师训练营

架构师训练营 第五周 【学习总结】

小K

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

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