Java应用在线debug--bistoury介绍

news2024/11/17 23:47:22

Bistoury介绍

Bistoury 是去哪儿网开源的一个对应用透明,无侵入的java应用诊断工具,用于提升开发人员的诊断效率和能力,可以让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断问题的效率和能力。

Bistoury 集成了Alibaba开源的arthas和唯品会开源的vjtools,因此arthas和vjtools相关功能都可以在Bistoury中使用。
Arthas和vjtools通过命令行或类似的方式使用,Bistoury在保留命令行界面的基础上,还对很多命令提供了图形化界面,方面用户使用。

Bistoury 英文解释是外科手术刀,含义也就不言而喻了。

通过命令行界面查看日志,使用arthas和vjtools的各项功能

在这里插入图片描述

在线debug,在线应用调试神器

在这里插入图片描述

线程级cpu监控,帮助你掌握线程级cpu使用率

在这里插入图片描述

在web界面查看JVM运行信息,以及各种其它信息

在这里插入图片描述

动态给方法添加监控

在这里插入图片描述

线程dump

在这里插入图片描述

Bistoury架构分析

Bistoury核心组件包含agent,proxy,ui:

  • agent : 与需要诊断的应用部署到一起,负责具体的诊断命令执行,通过域名连接proxy
  • proxy:agent的代理,agent启动时会通过ws和proxy连接注册,proxy可以部署多个,推荐使用域名负载
  • ui:ui提供图形化和命令行界面,接收从用户传来的命令,传递命令给proxy,接收从proxy传来的结果并展示给用户。

在这里插入图片描述

一次命令执行的数据流向为 ui -> proxy -> agent -> proxy -> ui

具体分析一下:

  • proxy 先启动,将自己地址注册到zk
  • agent通过域名访问proxy,随机分配到一个proxy,在proxy注册自己
  • UI 访问一个具体的应用时,通过zk拿到所有的proxy,然后依次检查app对应的agent是否在该proxy,如果在,web网页连接这个proxy
  • web上输入一个命令:web->proxy->agent->proxy->ui

具体参见 bistoury/design.md at master · qunarcorp/bistoury · GitHub

bistoury原理分析: https://www.jianshu.com/p/f7202e490156

总结下就是使用类似skywalking那样的agent技术,来监测和协助运行在JVM上的程序。

Bistoury快速开始

准备

  • 目前仅支持linux环境,所以需要一个linux环境
  • 本机已安装jdk1.8+,并且设置了JAVA_HOME环境变量,如果没有设置也可以在启动脚本中传递参数,详情建下文
  • 本机9090,9091,9880,9881端口未被占用,这些端口会被Bistoury使用,如果已占用需要进行配置,详情见下文
  • 本机已经启动一个待诊断java应用,如果是spring web应用不需要做处理,非spring web应用需要配置启动脚本的-c参数,详情见下文

获取快速部署包

官方有一个快速开始文档: bistoury/quick_start.md at master · qunarcorp/bistoury · GitHub

可以下载release包快速启动,就可以体验了。

首先我们将快速启动包 bistoury-quick-start.tar.gz 拷贝到想要安装的位置。

然后解压启动包:

tar -zxvf bistoury-quick-start.tar.gz
cd bistoury

最后是启动 Bistoury,因为 Bistoury 会用到 jstack 等操作,为了保证所有功能可用,需要使用和待诊断 JAVA 应用相同的用户启动。

假设应用进程 id 为 1024

  • 如果应用以本人用户启动,可以直接运行
./quick_start.sh -p 1024 start
  • 如果应用以其它帐号启动,比如 tom,需要指定一下用户然后运行
sudo -u tom ./quick_start.sh -p 1024 start
  • 停止运行
./quick_start.sh stop

访问

可以通过http://ip:9091来对ui进行访问,比如部署的机器ip为127.0.0.1,则可以通过http://127.0.0.1:9091/访问,初始化用户名密码均为admin

在线debug使用说明

Bistoury实现了在线Debug功能,它模拟了ide的调试体验,可以直接在代码上添加断点,甚至还支持条件断点。

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

使用步骤

  • 进入在线debug页面,初次使用时请先点击下方链接设置gitlab private token,若不设置,则添加断点时的代码将会通过反编译产生。目前仅支持gitlab,点击输入框下方对应链接获取,然后点击保存设置private token
    在这里插入图片描述

  • 选择需要调试的应用名,再选择需要调试的机器,然后点击【debug】按钮,进入已加载类列表。

在这里插入图片描述

  • 找到需要调试的类(支持搜索),点击【调试】按钮进入调试页面。类列表是在attach时获取的应用已加载的类。
  • 如果在attach之后有新的类加载(有时在列表中找不到自己想要的类,可能就是你要的类是在attach之后再加载的),可以通过点击【重新加载】加载按钮对列表进行重新加载。刷新按钮只会重新请求列表,不会重新加载
  • 选择“只加载新加载的类”只会加载应用中新加载的类;
  • 选择“全部加载”会把整个列表重新加载一遍。
  • 找到需要调试的那行代码,点击前方的行号标记设置断点

在这里插入图片描述

线程级cpu监控

在系统的日常运维中,我们有时会碰到cpu使用率突然飙高的情况。这个时候我们会登录机器,top查看进程id,top -h查看消耗cpu的线程id,然后jstack看看对应的线程是哪一个,最后再进行具体分析。 暂且不考虑这一系列操作需要的时间,我们收到报警的时候可能正在公司外吃饭,或是正在睡觉,而等我们做好准备登录上机器时问题已经结束了,现场没了,我们还能做的就只是看着机器的cpu监控图一脸茫然…

当遇到这些情况时,你会发现你需要的是线程级cpu使用率监控帮你指出问题线程,而不是传统的机器cpu使用率监控让你只能看着监控图一脸懵逼。

Bistoury就是你需要的那一个!我们提供了线程级的cpu使用率监控,它在本地保存了最近三天的线程级监控数据,还对每个线程每一分钟提供一个瞬时的线程调用栈。

使用

  • 进入主机信息页面
  • 选择需要查看的应用、机器
  • 点击 【线程级cpu监控】

线程级cpu监控主要分为两个区域,区域一是线程数量和cpu占比的折线图,区域二是线程完整信息。

区域一

可以单独查看某一线程的cpu占比,也可以查看不同时间的cpu占比(支持最近三天),点击某一时间对应的点,可以在区域二展示具体的线程信息。

区域二

可以按照线程名、线程调用栈、线程状态对线程进行筛选,其中每分钟cpu占用率是该分钟内cpu使用占比,瞬时cpu使用占比,是指抓取数据时cpu瞬时cpu使用率占比。

动态监控

有时候我们需要对系统的某个方法添加一个监控看看系统运行情况,但经历一次修改代码、qa检查、重新发布的流程又感觉不划算,这就是动态监控大显身手的时候了。 动态监控类似于Arthas的monitor方法,会对方法的执行时间、调用次数、失败次数进行监控,不同之处在于会生成对应的监控图,保留最近几天的数据,并且提供了web界面,通过类似添加断点的方式来添加监控。

注意: 监控会使用部分应用程序内存,建议内存较小的应用不要添加过多的动态监控。

监控生命周期

动态监控添加的指标生命周期与应用的的生命周期基本一致,从添加开始一直到应用停止,监控回一直采集监控数据。并存储最近三天的历史数据。

使用

  • 进入动态监控页面,初次使用时请先点击下方链接设置gitlab private token,若不设置,则添加断点时的代码将会通过反编译产生。目前仅支持gitlab,点击输入框下方对应链接获取,然后点击保存设置private token。

在这里插入图片描述

  • 选择需要添加监控的应用名,再选择需要在哪台机器上添加监控,然后点击【选择】按钮,进入已加载类列表
  • 找到需要添加的类(支持搜索),点击【监控】按钮进入监控页面。类列表是在attach时获取的应用已加载的类。
  • 如果在attach之后有新的类加载(有时在列表中找不到自己想要的类,可能就是你要的类是在attach之后再加载的),可以通过点击【重新加载】加载按钮对列表进行重新加载。刷新按钮只会重新请求列表,不会重新加载。
  • 选择“只加载新加载的类”只会加载应用中新加载的类;
  • 选择“全部加载”会把整个列表重新加载一遍。
  • 找到需要添加监控的方法,在其中任意语句添加标记,点击前方的行号标记所在行。

在这里插入图片描述

  • 在监控首页可以选择应用及机器后可以查看监控数据

应用中心

在前面说过,Bistoury不仅仅可以从机器的维度,还可以从应用的维度对系统进行诊断。

应用是什么

我们知道,在线系统往往部署在多台机器上,应用就是与系统相关的这些机器以及所使用到的资源的一个集合。

应用中心就是用来管理应用信息的一个东西,而Bistoury需要从应用中心获取应用与机器、应用与人等各种信息。

Bistoury在ui内部集成了一个简单的应用中心,如果公司内部有自己的应用中心,应该实现bistoury-application-api模块中的接口接入自己的应用中心。

功能说明

应用中心主要职责如下:

  • 人/应用/服务器之间的关系
  • 应用/服务器的信息

使用说明

  • 点击【应用中心】进入应用中心页面,这里会展示当前登录用户的所有应用
  • 点击【新增】可以新增一个应用,新增应用时会默认将当前登录用户添加到应用负责人中.
  • 点击【管理】可以对应用信息进行管理,可以修改应用信息
  • 点击【服务器管理】tab也可以对当前应用的服务器信息进行管理,点击列表中的开关可以对线程级cpu监控等功能进行管理
  • 点击新增按钮可以新增服务器,管理按钮可以对服务器信息进行管理。其中端口号用于agent与应用进行连接,日志目录用于查看日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术管理第三板斧招聘与解聘-“能落地

1.既要帮,也要严 “既要帮,也要严”是我定义的“能落地”的核心原则,“帮”与“严”是双向要求:帮是指帮助新同学融入团队(针对的是师兄和 Leader);严是要让新同学在团队中提升自己&#xff0c…

火爆全网,接口测试总结汇总,全知识点扫描卷起来...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 第一部分&#xf…

JavaSE-11 【内部类】

文章目录 JavaSE-11 【内部类】第一章 成员内部类和局部内部类1.1 四种权限修饰符1.2 内部类的概念和分类1.3 成员内部类的定义格式1.4 成员内部类的使用1.5 内部类的同名变量访问1.6 局部内部类定义1.7 局部内部类的final问题 第二章 匿名内部类2.1 匿名内部类2.2 匿名内部类的…

Sangfor华东天勇战队:shiro注入filter内存马

注入步骤 https://github.com/yyhuni/shiroMemshell&#xff08;实验环境&#xff09; 这里用的 pom.xml加入 <dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version> <…

阿里企业邮箱域名解析MX记录值设置

阿里企业邮箱配置需要为域名添加MX解析记录&#xff0c;不只是MX域名解析记录值&#xff0c;还需要为域名添加pop3、imap、smtp及mail等CNAME解析类型&#xff0c;阿里云百科分享阿里云企业邮箱域名MX解析记录类型、记录值及服务器地址&#xff1a; 目录 新版阿里企业邮箱域名…

FPGA解码 4K MIPI 视频自定义IP版 纯vhdl实现 CSI2 RX 采集OV13850 提供工程源码和技术支持

目录 1、前言2、Xilinx官方主推的MIPI解码方案3、本 MIPI CSI2 模块性能及其优越性4、我这里已有的 MIPI 编解码方案5、vivado工程介绍6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了&#xff…

div转data:image/svg编码图片

前言 将div转base64图片 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>div-svg-base64</title><script type"text/javascript" src"/js/jquery-3.2.1.min.js"></script><scr…

使用 Jetpack Compose 的 TextButton 组件

Jetpack Compose 是 Google 推出的一种声明式 UI 框架&#xff0c;它使 Android UI 开发变得更加简单和直观。在本篇博客中&#xff0c;我们将深入探索 Jetpack Compose 中的 TextButton 组件。 一、TextButton的使用 二、自定义TextButton 三、Button和TextButton的区别 一…

搜索算法特训 ----- Week5/6/7 (它太重要了)

学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举_二叉树广度优先搜索_小杰312的博客-CSDN博客 上述文章&#xff0c;初步介绍了搜索过程和关于二叉树中进行搜索的很多实例。将搜索的过程写的还是很详细的。很…

网站出现卡顿是什么原因,要怎么解决?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言网站卡顿的原因解决…

人工智能算法在外卖配送系统中的应用和前景

随着人们对于外卖服务需求的增加&#xff0c;外卖配送系统的效率和精确度成为了重要的考虑因素。而人工智能算法的出现&#xff0c;则为外卖配送系统提供了更好的解决方案。 一、应用场景 1.1 路线规划 在外卖配送过程中&#xff0c;路线的规划是非常重要的。通过人工智能算…

一线大厂最全Java面试题及答案整理汇总(2023最新版)

程序员一步入中年&#xff0c;不知不觉便会被铺天盖地的“危机感”上身&#xff0c;曾经的那个少年已经不在&#xff0c;时间就是这样公平。就算你能发明 Java 语言&#xff0c;随着时间的推移&#xff0c;你注定还是要成为慢慢变蔫的茄子&#xff0c;缓缓变黑的葡萄。 看着金…

uniapp 自定义发行 动态修改 manifest.json

这边需求是&#xff1a;根据不同的打包环境 设置不同的标题以及路径。方便各种调试。防止 每次手动每次修改 manifest.json 出错 uniapp 自定义发行: 添加自定义发行之后 Hbuilder 编辑器会自动多 出来按钮&#xff1a; 官方文档&#xff1a;概述 | uni-app官网 我这里的配置是…

大数据开发基础-环境配置篇-Hadoop集群安装

鼠鼠接下来将更新一系列自己在学习大数据开发过程中收集的资源、和自己的总结、以及面经答案、LeetCode刷题分析题解。 首先是大数据开发基础篇 环境搭建、组件面试题等 其次是更新大数据开发面经的java面试基础 最后更新一个大数据开发离线数仓的实战项目&#xff0c;自己写入…

利用R中的corrmorant包绘制精美的相关性热图

大家好&#xff0c;我是带我去滑雪&#xff01; 相关性热图 (correlation heatmap) 是一种可视化工具&#xff0c;用于展示数据集中各个变量之间的相关性。它以矩阵的形式显示变量之间的相关系数&#xff0c;并通过色彩编码来表示相关性的强度。在相关性热图中&#xff0c;每个…

html面试题-概念题汇总

文章目录 html面试题汇总 src和href的区别 HMTL的全局属性有哪些&#xff1f; 超链接访问过后hover样式就不出现的原因是什么&#xff1f;怎么解决&#xff1f; 表单中readonly和disabled属性的区别&#xff1f; iframe的优缺点&#xff1f; 浏览器渲染页面的过程 viewport属性…

GO channel解析

GO channel解析 是什么&#xff1f; 官方文档&#xff1a; https://go.dev/ref/spec#Channel_typeshttps://go.dev/blog/pipelines&#xff08;channel提供了流式编程的例子&#xff09; 在 Go 语言中&#xff0c;channel 是一种用于在 goroutine 之间进行通信和同步的机制。…

【FFmpeg实战】音频解码与编码流程

解码流程 音频编解码流程与视频编解码流程一致&#xff0c;我们可以对 mp4 文件的音频流进行解码&#xff0c;并将解码后的音频数据保存到 PCM 文件中&#xff0c;后续我们可以通过读取 PCM 文件中的数据实现音频流的编码操作 FFmpeg音频解码流程 extern"C" { #inc…

ICC2: Create Placement Blockage

area-based的placement blockage有四种,hard、hard macro、soft,partial。hard 属性限制所有standard cell、hard macro放进hard blockage中;hard macro仅限制hard macro(如sram);soft属性限制placement的init_place阶段(也叫coarse placement)把standard cell和hard macro…

Vuex学习

5.1.理解 Vuex 5.1.1.Vuex 是什么 概念&#xff1a;专门在Vue中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue插件&#xff0c;对Vue应用中多个组件的共享状态进行集中式的管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适…