[alibaba/arthas]开发一个native agent和远程管理平台,方便管理集群

2024-02-23 985 views
4

目前,Arthas只支持用 arthas-spring-boot-starter的方式,让应用引入arthas,然后在启动时attach自身,再连接到 tunnel server上。

这种方式有很多缺陷:

  • 应用启动时就需要attach自身,不能做到动态attach
  • 应用如果自身没有响应了,在tunnel server上也没办法查看了

因此,考虑一种真正支持大规模管控的方式。

  • 在应用机器上,启动一个常驻的native agent
  • native agent可以考虑用rust/java GraalVM/go 等(java GraalVM有mavend可以参考 https://github.com/apache/maven-mvnd
  • native agent负责连接远程管理平台,接收管理平台的 attach 命令,负责中转arthas的执行命令和结果
  • native agent要充分考虑安全问题,比如要支持TLS连接
  • 考虑docker/k8s环境下支持,比如 native agent本身以sidecar方式,或者k8s临时容器方式部署,参考:https://github.com/alibaba/arthas/issues/1874

整个事情比较多,考虑一步步实现。

agent的基本功能
  • Agent侧支持查看,列出所有java 进程
  • 支持通过jvm自身机制去attach
  • 支持sidecar方式,或者k8s临时容器的attach (考虑集成 https://github.com/apangin/jattach
agent和server端交互
  • 启动时注册到server报,上报信息
  • 接收server端的attach指令
  • 接收server端的诊断命令,返回结果到server端
server端的管理UI
  • 查看agent列表
  • agent管理功能

参考: https://github.com/alibaba/arthas/issues/1350

回答

5

这种场景rust感觉更适合一点,既有安全性,又有native能力

2

用go是不是平台性上更有优势

8

用graalvm编译的改造成本比较低,主程序native化,可以使用VirtualMachine.attach的功能,把javaagent注入到其他java进程。这样可以不依赖jdk也能启动Arthas