0%

bistoury非入侵式java生产环境诊断工具

简介

最近闲来无事逛github时发现bistoury,Bistoury是去哪儿网的java应用生产问题诊断工具,提供了一站式的问题诊断方案,可以在生产环境中实现非入侵式系统信息查看,包括堆栈信息,机器情况,在线调试,应用线程信息等.

下载

首先去github中下载编译好的文件
https://github.com/qunarcorp/bistoury/releases

准备

  • 需要Linux环境
  • JDK1.8
  • 本机 9090,9091,9880,9881 端口未被占用,这些端口会被 Bistoury 使用,如果已占用需要进行配置

以下为github中提供的快速开始说明

快速开始

Bistoury 具有多个模块,并且和公司自身环境有一定的关联,想要合理部署需要进行一些相关的配置。

为了能够快速启动和体验 Bistoury,我们提供快速部署脚本在单机部署整套 Bistoury 服务。

使用快速部署脚本,会在本机部署一整套 Bistoury 服务,其中包括 ui、proxy、agent。

注意,这里提供的快速部署脚本仅适用于快速上手进行单机诊断,想要获得完整的体验,还是需要进行合理的部署。

目前在我们公司内部的使用方式,也是推荐的部署方式为:

  • ui 独立部署,推荐部署在多台机器,并提供独立的域名

  • proxy 独立部署,推荐部署在多台机器,并提供独立的域名

  • agent 需要和应用部署在同一台机器上。推荐在测试环境全环境自动部署,线上环境提供单机一键部署,以及应用下所有机器一键部署

  • 独立的应用中心,管理所有功能内部应用和机器信息,这是一个和 Bistoury 相独立的系统,Bistoury 从中拿到不断更新的应用和机器信息

构建

获取快速部署包

  • 我们在项目 Release 页面提供了已经构建好的快速部署包,你也可以直接下载。

  • 你也可以下载源码然后自己构建快速启动包,这同样很简单。首先 clone 项目到本地,运行 script/quick_start_build.sh,运行完成后 script 目录下会生成相应的快速部署包,名字格式为 bistoury-quick-start.tar.gz

准备

  • 目前仅支持 Linux 环境,所以需要一个 Linux 环境

  • 本机已安装 jdk1.8+,并且设置了 JAVA_HOME 环境变量,如果没有设置也可以在启动脚本中传递 -j 参数,详情见下文:启动参数

  • 本机 9090,9091,9880,9881 端口未被占用,这些端口会被 Bistoury 使用,如果已占用需要进行配置,详情见下文:当端口冲突了怎么解决

  • 本机已经启动一个待诊断 JAVA 应用,如果是 Spring Web 应用不需要做处理,非 Spring Web 应用需要配置启动脚本的 -c 参数,详情见下文:启动参数

启动

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

然后解压启动包:

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

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

假设应用进程 id 为 1024

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

访问

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

具体实施中遇到的问题

websocket连接失败

原因是本机可能存在多个ip,导致获取的ip不是当前正在使用的ip(获取到的ip可以在各个日志中查看,也可以在应用中心查看),从而出错,

可以通过quick_start.sh脚本中的-i参数指定当前的ip。

例子 :

1
./quick_start.sh -i 127.0.0.1 -p 1024 start

提示 not find proxy for agent

端口冲突,修改端口即可

端口 作用
1. 9880 agent和proxy通信默认使用9880端口
2. 9881 ui和proxy通信默认使用9881端口
3. 9090 proxy默认使用9090端口
4. 9091 ui默认使用9091端口
5. 9092 h2数据库默认使用9092端口
端口 端口定义的位置
9880 解压缩目录/bistoury-proxy-bin/conf/global.properties中的agent.newport
9881 解压缩目录/bistoury-proxy-bin/conf/global.properties中的server.port值和quick_start.shPROXY_WEBSOCKET_PORT的值
9090 解压缩目录/bistoury-proxy-bin/conf/server.properties中的tomcat.port值和quick_start.shPROXY_TOMCAT_PORT的值以及bistoury-agent-bin/bin/bistoury-agent-env.sh中的BISTOURY_PROXY_HOST的值
9091 解压缩目录/bistoury-ui-bin/conf/server.properties中的tomcat.port
9092 解压缩目录/h2/h2.sh中的H2_PORT值