摘要:建站服务器 缘起 最近看到一个很流行的标题,《开源XX年,star XXX,我是如何坚持的》。 看到这样的标题,忽然发觉 Arthas 从 2018 年 9 月开源
建站服务器 缘起
最近看到一个很流行的标题,《开源XX年,star XXX,我是如何坚持的》。
看到这样的标题,忽然发觉 Arthas 从 2018 年 9 月开源以来,刚好一年了,正好在这个秋高气爽的时节做下总结和回顾。
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
Github:
https://github.com/alibaba/arthas[1]
文档:
https://alibaba.github.io/arthas[2]
回顾 Arthas Star 数的历史,一直保持快速增长,目前已经突破 16 K。
Arthas Github Star历史曲线
感谢用户的支持,既是压力也是动力。在过去开源的一年里, Arthas 发布了 7 个 Release 版本,我们一直坚持三点:
持续改进易用性 持续增加好用的命令 从开源社区中获取力量,回报社区 持续改进易用性Arthas 一直把易用性放在第一位,在开源之后,我们做了下面的改进:
开发 arthas boot ,支持 Windows/Linux/Mac 统一体验 丝滑的自动补全,参考了 jshell 的体验 高效的历史命令匹配, Up/Down 直达 改进类搜索匹配功能,更好支持 lambda 和内部类 完善重定向机制 支持 JDK 9/10/11 支持 Docker 支持 rpm/deb 包安装尽管我们在易用性下了很大的功夫,但是发现很多时候用户比较难入门,因此,我们参考了 k8s 的 Interactive Tutorial ,推出了 Arthas 的在线教程:
Arthas 基础教程[3] Arthas 进阶教程[4]通过基础教程,可以在交互终端里一步步入门,通过进阶教程可以深入理解 Arthas 排查问题的案例。
另外,为了方便用户大规模部署,我们实现了 tunnel server 和用户数据回报功能:
增加 tunnel server ,统一管理 Agent 连接
增加用户数据回报功能,方便做安全管控
Arthas 号称是 Java 应用诊断利器,那么我们自己要对得起这个口号。在开源之后, Arthas 持续增加了 10 多个命令。
ognl 命令任意代码执行 mc 线上内存编译器 redefine 命令线上热更新代码 logger 命令一键查看应用里的所有 logger 配置 sysprop 查看更新 System Properties sysenv 查看环境变量 vmoption 查看更新 VM option logger 查看 logger 配置,更新 level mbean 查看 JMX 信息 heapdump 堆内存快照下面重点介绍两个功能。
jad/mc/redefine 一条龙热更新线上代码
以 Arthas 在线教程 里的 UserController 为例:
1、使用 jad 反编译代码
jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java
2、使用 vim 编译代码
当 user id 小于 1 时,也正常返回,不抛出异常:
@GetMapping("/user/{id}") public User findUserById(@PathVariable Integer id) { logger.info("id: {}" , id); if (id != null && id < 1) { return new User(id, "name" + id); // throw new IllegalArgumentException("id < 1"); } else { return new User(id, "name" + id); } }
3、使用 mc 命令编译修改后的 UserController.java
$ mc /tmp/UserController.java -d /tmp Memory compiler output: /tmp/com/example/demo/arthas/user/UserController.class Affect(row-cnt:1) cost in 346 ms
4、使用 redefine 命令,因为可以热更新代码
$ redefine /tmp/com/example/demo/arthas/user/UserController.class redefine success, size: 1
通过 logger 命令查看配置,修改 level
在网站压力大的时候(比如双 11 ),有个缓解措施就是把应用的日志 level 修改为 ERROR 。那么有两个问题:
复杂应用的日志系统可能会有多个,那么哪个日志系统配置真正生效了? 怎样在线上动态修改 logger 的 level ?[arthas@2062]$ logger name ROOT class ch.qos.logback.classic.Logger classLoader sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash 2a139a55 level INFO effectiveLevel INFO additivity true codeSource file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders name CONSOLE class ch.qos.logback.core.ConsoleAppender classLoader sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash 2a139a55 target System.out name APPLICATION class ch.qos.logback.core.rolling.RollingFileAppender classLoader sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash 2a139a55 file app.log name ASYNC class ch.qos.logback.classic.AsyncAppender classLoader sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash 2a139a55 blocking false appenderRef [APPLICATION]
也可以在线修改 logger 的 level :
[arthas@2062]$ logger --name ROOT --level debug update logger level success.从开源社区中获取力量,回报社区
感谢 67 位 Contributors
Arthas 开源以来,一共有 67 位 Contributors ,感谢他们贡献的改进:
Arthas Contributors
社区提交了一系列的改进,下面列出一些点(不完整):
另外,有 83 个公司/组织登记了他们的使用信息,欢迎更多的用户来登记:
基于 Arthas ,还产生了一些洐生项目,下面是其中两个:
Bistoury : 去哪儿网开源的集成了 Arthas 的项目 arthas-mvel : 一个使用 MVEL 脚本的 fork 用户案例分享广大用户在使用 Arthas 排查问题过程中,分享了很多排查过程和心得,欢迎大家来分享。
回馈开源
Arthas 本身使用了很多开源项目的代码,在开源过程中,我们给 netty, ognl, cfr 等都贡献了改进代码,回馈上游。
后记
在做 Arthas 宣传小册子时, Arthas 的宣传语是:
“赠人玫瑰之手,经久犹有余香”
希望 Arthas 未来能帮助到更多的用户解决问题,也希望广大的开发者对 Arthas 提出更多的改进和建议。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
相关文章推荐
虚拟主机的专业参数,分别都是什么意思?2022-09-09
中非域名注册规则是怎样的?注册域名有什么用处? 2022-01-10
HostEase新年活动促销 美国/香港主机全场低至五折2021-12-28
HostGator下载完整备份教程分享2021-12-28
Flink中有界数据与无界数据的示例分析2021-12-28