Bistoury
是去哪儿网开源的一个对应用透明,无侵入的 java 应用诊断工具,用于提升开发人员的诊断效率和能力。
Bistoury
的目标是一站式 java 应用诊断解决方案,让开发人员无需登录机器或修改系统,就可以从日志、内存、线程、类信息、调试、机器和系统属性等各个方面对应用进行诊断,提升开发人员诊断问题的效率和能力。
项目开源工程地址: https://github.com/qunarcorp/bistoury
此应用在使用过程中需要管理员手动添加应用信息,在项目服务比较少的情况下还可以手动维护。当应用实例规模 200+ 以上以及使用 k8s 的情况下这种维护就会变得很困难。
在 k8s 环境中 pod 的 ip 和 hostname 是动态变化的,传统的手动维护数据库信息已经是不可能了,这个时候需要开发人员去在应用中接入注册中心,然后 bistoury 可以从应用中心获取应用注册信息。
关于这个解决方案的一些资料参考: https://www.cnblogs.com/xiaoqi/p/Bistoury.html
受限于开发人员水平已经每一个公司项目开发进度的问题,比如公司有上百个应用,那么每一个应用的升级改造就变的很困难。
应开发人员需求需要,我使用 golang 开发了一个简单的 api 调用,在 pod 中动态注册实例信息到 bistoury 数据库中,以此来代替手动维护。
Bistory-tool 开源地址: https://github.com/typ431127/bistoury-tool
此工程使用技术栈: gin gorm
在 pod 启动过程中启动一个 shell 脚本, 脚本上报 pod 的主机名和 ip 信息, 然后将这些信息写入 bistoury 数据库中。当 pod 销毁时使用钩子触发注销接口,从数据库中删除此注册信息。
此方法非最优解决方案,推荐方法是改造 java 项目来集成注册中心。
k8s 停止钩子使用示例
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- kill -15 $(ps aux|grep java|grep -Ev 'grep|bistoury' |awk '{print $1}')
; /bistoury-start.sh del
livenessProbe:
注册 API 调用
curl --location --request POST "${BISTOURY_API}/api/app" \
--header "Content-Type: application/json" \
--data-raw "{\"code\": \"${jobname}\",
\"Name\": \"${jobname}\",
\"Group_code\": \"${jobname}\",
\"ip\":\"$(hostname -i)\",
\"port\":${port},
\"logdir\":\"${logdir}\",
\"hostname\": \"$(hostname)\"
}"
变量说明
- jobname 服务名
- port java 程序端口号
- logdir java 程序日志目录
- hostname pod 内主机名
POST 方法注册实例,DELETE 方法注销
程序编译
cd cmd/bistoury-sync
go build
配置文件
[server]
host=0.0.0.0
port=8090
[mysql]
host=x.x.x.x:3306
user=bistoury
password=123456
db=bistoury
启动
./bistoury-sync
客户端注册
开发人员在需要调试的应用上面开启客户端脚本然后注册应用,可以搭配 pod 钩子也可以单独使用脚本去开启调试,每一个 pod 默认开启就会有应用内存 cpu 占用问题,所以我们使用的方案是需要的时候再去开启。
自动注册的应用