阿里巴巴Arthas诊断工具平台化改造

Arthas是一款开源且非常棒的在线诊断工具,阿里巴巴在16年就出品了,经过几年的功能迭代以及代码重构又出了不少新的诊断命令

在Github上面搜索Arthas即可下载源码,原生的Arthas实现了TunnelClient和TunnelServer的交互,但是总的来说还是单机版本的,在大企业中使用的时候避免不了需要封装改造下,不可能每次监控都去手动输入一个registerId,下面就介绍我们对他的改造过程,让他变成一个平台化的诊断工具

我们这边的设计思路是这样的:

  • 先改造arthas-client通过容器的环境变量等参数注册自身应用信息到arthas-server
  • arthas-client 植入到基础镜像中,然后通过agent方式运行arthas-client
  • 改造arthas-server源码,植入公司权限系统以及可视化应用-节点选择自动链接诊断

阿里巴巴Arthas诊断工具平台化改造

arthas-agent方式启动的话,需要几个入参,原先client-server交互是通过netty的socket来实现的,原先完整发送的socket-url是:ws://xxx/ws,注册ID是server端随机生成的,我们改造后变成ws://xx/ws/project/appname/ip,参数解析:项目名,应用名,应用ip,这些参数主要是为了server端的web页面可以下拉选可视化操作使用的

我们在这里分析agent源码后发现,源码中的premain是需要找到arthas-core.jar的,我们处理时一起放到基础镜像中,然后在premain中指定core的路径

arthas-client的改造只需要到这里就可以了,剩下的是server端的改造,主要思路是:server端接收到client注册请求后,将项目名、应用名、节点ip、arthas注册id存储到数据库中,供前端web页面可以下拉选

阿里巴巴Arthas诊断工具平台化改造

我们也对server端代码进行了部分重构,原先代码结构还是比较混乱的,简单介绍下核心需要关注的server源码类

阿里巴巴Arthas诊断工具平台化改造

主要需要关注这三个类,RegisterHandler是client进行socket连接时使用到的,ConnectionHandler是web-socket链接server时的第一步操作,成功之后会使用OpenTunnel