Arthas 是阿里巴巴开源的在线诊断工具,提供了 Dashboard 负载总览、Thread 线程占用、Stack 堆栈查看、Watch 性能观测等功能。

在实际的生产应用中,我们遇到以下几个问题:

  1. Arthas 控制台没有权限控制,一旦访问 IP 暴露,就有安全问题。
  2. Arthas 控制台需要提前知道 AgentId 才能访问,不适合 K8s 扩容管理。

基于上面的问题,笔者 fork 了官方最新的源码进行二次开发,并打包镜像到 Docker Hub,方便大家使用。

改造内容

  • 新增服务发现支持,自动获取接入的应用列表 IP 和端口,无须手动输入 AgentId。

  • 新增权限控制机制,授权用户输入用户密码登录后,在控制台只能操作已授权的应用。

部署教程

FatJar 部署

执行 mvn clean package 打包成一个 fat jar,参考如下命令启动编译后的控制台。

1
java -Dserver.port=8080 -jar target/arthas-tunnel-server.jar

Docker 部署

本项目已发布稳定的镜像到 Docker Hub,您可以直接使用如下命令,完成部署。

1
docker run -p 8080:8080 --name=arthas-tunnel-server -d shiyindaxiaojie/arthas-tunnel-server

Kubernetes 部署

建议使用 StatefulSet 部署,YAML 示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: arthas-tunnel-server
namespace: monitoring
spec:
podManagementPolicy: OrderedReady
replicas: 1
serviceName: ""
template:
spec:
affinity: {}
containers:
- env:
- name: TZ
value: Asia/Shanghai
image: shiyindaxiaojie/arthas-tunnel-server:v3.6.7
imagePullPolicy: IfNotPresent
name: cat-home
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
volumeMounts:
- mountPath: /app/application.properties
name: application
readOnly: true
subPath: application.properties
volumes:
- configMap:
defaultMode: 420
items:
- key: application.properties
mode: 420
path: application.properties
name: arthas-tunnel-server
name: application

对应的 ConfigMap 如下,用于配置账号和权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: ConfigMap
metadata:
name: arthas-tunnel-server
namespace: monitoring
data:
application.properties: |
arthas.server.host=0.0.0.0
arthas.server.port=7777
arthas.enable-detail-pages=false

spring.cache.type=caffeine
spring.cache.cache-names=inMemoryClusterCache
spring.cache.caffeine.spec=maximumSize=3000,expireAfterAccess=3600s

spring.security.jwt.secret=base64码
spring.security.jwt.token-validity-in-seconds=604800
# Administrator
spring.security.users[0].name=admin
spring.security.users[0].password=123456
spring.security.users[0].roles=ADMIN
# Custom User
spring.security.users[1].name=user
spring.security.users[1].password=123456
spring.security.users[1].roles=eden-*

应用集成

为了减少客户端集成的工作,推荐您使用 eden-architect 框架,只需要两步就可以完成 Arthas 的集成。

引入 Arthas 依赖

1
2
3
4
<dependency>
<groupId>io.github.shiyindaxiaojie</groupId>
<artifactId>eden-arthas-spring-boot-starter</artifactId>
</dependency>

开启 Arthas 配置

1
2
3
4
5
6
7
8
9
10
spring:
arthas:
enabled: true # 默认关闭,请按需开启,支持零停机开启和关闭

arthas: # 在线诊断工具
agent-id: ${spring.application.name}@${random.value}
tunnel-server: ws://localhost:7777/ws # Arthas 地址
session-timeout: 1800
telnet-port: 0 # 随机端口
http-port: 0 # 随机端口

启动您的项目,在控制台中查看到应用列表,就可以看到您的应用了。

当然,如果你不希望依赖 eden-architect,则可以参考相关代码实现自己的需求。