Arthas开源一周年,Github Star 16K,我们一直在坚持什么?

2023-11-16

缘起

最近看到一个很流行的标题,《开源XX年,star XXX,我是如何坚持的》。

看到这样的标题,忽然发觉Arthas从2018年9月开源以来,刚好一年了,正好在这个秋高气爽的时节做下总结和回顾。

Arthas

Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。

回顾Arthas Star数的历史,一直保持快速增长,目前已经突破16K。

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排查问题的案例。

另外,为了方便用户大规模部署,我们实现了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?

通过logger命令,可以查看应用里logger的详细配置信息,比如FileAppender输出的文件,AsyncAppender是否blocking

[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,感谢他们贡献的改进:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3lWIJwB-1569563648008)(https://opencollective.com/arthas/contributors.svg?width=890&button=false)]

社区提交了一系列的改进,下面列出一些点(不完整):

  • 翻译了大部分英文文档的
  • trace命令支持行号
  • 打包格式支持rpm/deb
  • 改进命令行提示符为 arthas@pid
  • 改进对windows的支持
  • 增加mbean命令
  • 改进webconsole的体验

另外,有83个公司/组织登记了他们的使用信息,欢迎更多的用户来登记:

Arthas Users

洐生项目

基于Arthas,还产生了一些洐生项目,下面是其中两个:

  • Bistoury: 去哪儿网开源的集成了Arthas的项目
  • arthas-mvel: 一个使用MVEL脚本的fork

用户案例分享

广大用户在使用Arthas排查问题过程中,分享了很多排查过程和心得,欢迎大家来分享。

Arthas用户案例分享

回馈开源

Arthas本身使用了很多开源项目的代码,在开源过程中,我们给netty, ognl, cfr等都贡献了改进代码,回馈上游。

后记

在做Arthas宣传小册子时,Arthas的宣传语是:

“赠人玫瑰之手,经久犹有余香”

希望Arthas未来能帮助到更多的用户解决问题,也希望广大的开发者对Arthas提出更多的改进和建议。

最后是抽奖环节,大家可以转发文章,在公众号后台留言自己和Arthas的故事,或者给Arthas提出建议,奖品是Arthas的卫衣一件:

Arthas卫衣

公众号

欢迎关注横云断岭的专栏,专注Java,Spring Boot,Arthas,Dubbo。

横云断岭的专栏

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arthas开源一周年,Github Star 16K,我们一直在坚持什么? 的相关文章

  • 内存不一致与线程交错有何不同?

    我正在编写一个多线程程序 正在研究是否应该使用volatile对于我的布尔标志 关于并发性的文档 oracle Trail 没有解释任何关于memory consistency errors以外 当不同的线程有内存一致性错误时 就会发生内存
  • ProcessBuilder 未正确执行 Java 类文件

    在一个java文件中 我调用命令行语句来执行另一个java文件 这就是我正在做的 List
  • 杰克逊.将缺失的属性反序列化为空Optional

    假设我有一堂这样的课 public static class Test private Optional
  • 通过 RMI 的服务器,无需注册

    我有一个可以通过 RMI 连接的服务对象 目前我正在这样做 Server Registry r LocateRegistry createRegistry 1234 r bind server UnicastRemoteObject exp
  • iText7:如何获取段落的实际宽度

    在添加到文档之前 我需要知道段落的宽度 以磅为单位 我在这里搜索并找到了 Alexey 关于段落高度的答案 所以我用宽度做了它 但它不起作用 无论段落有多长 始终返回矩形的宽度 我尝试了这段代码 private float getRealP
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • 如何使 java.text.NumberFormat 将 0.0d 格式设置为“0”而不是“+0”?

    需要带符号的结果 0 0d 除外 IE 123 45d gt 123 45 123 45d gt 123 45 0 0d gt 0 我调用format setPositivePrefix 在 DecimalFormat 的实例上 强制结果中
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • kafka消费端Offsets的一致性

    我有复制因子为 3 的卡夫卡主题min insync replicas 2 一个向该主题发送 X 条消息的生产者acks all 一段时间后 1 分钟内 在所有消息发送到主题后 将使用 java kafka 客户端为此主题创建新的消费者 使
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • 在 JUnit 测试中读取资源文件

    我在单元测试中读取文本文件 并将一些输入文本文件放置在资源文件夹中 以下是目录结构 src gt com gt au gt myapp gt util gt MyFileReader 测试 gt com gt au gt myapp gt
  • 飞碟中的外部 CSS

    我想知道如何在 Flying Saucer 中包含外部 CSS 在此之前THB我检查了所有可用的链接StackOverflow但它们没有帮助 这就是为什么我自己做这个的原因 TestCSS xhtml重命名版本TestCSS html 所以
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 是否可以从 JBoss 容器中部署的所有 .war 文件中读取属性文件

    我已成功将 war 部署到 Jboss Web 容器 其中包含并读取位于 META INF groupid dir artifactid dir 下的 pom properties 为了访问该文件 我在同一 war 中的 JSP 中使用了以
  • 表达式的类型必须是数组类型,但它解析为浮点数

    当我编写 Java 代码时 我遇到了困难 我觉得我不知何故把这个概念弄乱了 就像我不确定这一点 void setScore float sco sco score public void setScore float sco int id
  • 注释处理工具<-检查有效注释

    I have ColumnMetadata index 1 ColumnMetadata index 2 ColumnMetadata index 3 我必须使用 APT 检查索引号是否唯一 我不知道该怎么做 我看不懂教程 一般我在网上找资
  • 如何通过sparkSession向worker提交多个jar?

    我使用的是火花2 2 0 下面是我在 Spark 上使用的 java 代码片段 SparkSession spark SparkSession builder appName MySQL Connection master spark ip
  • JAAS keytab 配置的相对路径

    我有一个系统 其中 NET 客户端使用 Kerberos 针对 Java 服务器进行身份验证 一切正常 但我正在尝试改进服务器配置 目前一个keytab根目录中需要文件C 因为我的jaas配置文件看起来像这样 Server com sun

随机推荐

  • Tensorflow计算、数据和运行模型

    参考书籍 Tensorflow实战Google深度学习框架 郑泽宇等 Tensorflow是一款谷歌开源的深度学习工具 与其他深度学习工具 比如caffe Deeplearning4j等 相比 其受关注度和欢迎程度尤为突出 在谷歌内部 Te
  • 02-Node.js—Buffer(缓冲器)

    文章目录 1 概念 2 特点 3 创建Buffer 3 1 Buffer alloc 3 2 Buffer allocUnsafe 3 3 Buffer from 4 操作Buffer 4 1 Buffer 与字符串的转化 4 2 Buff
  • H264实时编码及NALU,RTP传输

    原文引用地址 http wmnmtm blog 163 com blog static 382457142011920102618122 fromdm fromSearch isFromSearchEngine yes H264实时编码及N
  • linux中find命令详解,Linux下的find指令详解

    在Linux下有很多查找指令 locate whereis which find 在这些查找指令中功能最强大的当属find指令了 find命令在目录结构中搜索文件 并执行指定的操作 Linux下find命令提供了相当多的查找条件 功能很强大
  • linux shell数据重定向(输入重定向与输出重定向)详细分析

    在了解重定向之前 我们先来看看linux 的文件描述符 linux文件描述符 可以理解为linux跟踪打开文件 而分配的一个数字 这个数字有点类似c语言操作文件时候的句柄 通过句柄就可以实现文件的读写操作 用户可以自定义文件描述符范围是 3
  • Vue计算属性:简化数据处理和视图更新的利器

    一 计算属性的基本使用 计算属性 一个特殊属性 值依赖于另外一些数据动态计算出来 计算属性特点 函数内使用的变量改变 重新计算结果返回 注意 计算属性必须定义在computed节点中 计算属性必须是一个function 计算属性必须有返回值
  • 基于STM32通过RTC唤醒低功耗模式

    一 低功耗模式 1 简介 通俗的来讲低功耗模式就是降低单片机的运行功耗 STM32F10xxx有三种低功耗模式 1 睡眠模式 Cortex M3 内核停止 所有外设包括 Cortex M3 核心的外设 如 NVIC 系统时 钟 SysTic
  • 解决Go-CQhttp无法登录(服务器如何登录)的问题

    既然你能看到这篇帖子 说明你一定对这个东西不陌生了 这是某讯的登录检查机制 解决方法 也很简单 保证手机与电脑处于同一wifi以内 那这时候有人叫要问了 可是我明明开了wifi 为什么还是登陆不了呢 麻烦你不要一边开wifi一边开数据 别问
  • 大数据技术炙手可热 专业人才短缺成发展掣肘

    大数据技术炙手可热 专业人才短缺成发展掣肘 2011 11 25 09 29 1765次阅读 已有0条评论 发表评论 来源 CSDN编译 作者 李智 收藏到我的网摘 导读 尽管还存在安全等问题 但Hadoop已经为部署在大企业中的大型项目做
  • 防止内存泄露 Linux下用Valgrind做检查

    用C C 开发其中最令人头疼的一个问题就是内存管理 有时候为了查找一个内存泄漏或者一个内存访问越界 需要要花上好几天时间 如果有一款工具能够帮助我们做这件事情就好了 valgrind正好就是这样的一款工具 Valgrind是一款基于模拟li
  • 数据建模,ODS模型分析

    根据ODS系统解决的不同的数据问题 将ODS模型将数据按三层进行管理 分别针对细节级数据 汇总型数据和分析型数据 每个区域有自己的管理重点 下面分别介绍 基础数据层 FDM FOUNDATION DATA MODLE 来源于标准化的各源系统
  • 计算机视觉基础:自适应阈值分割(Computer Vision Fundamentals: Adaptive Threshold Segmentation)

    前言 阈值分割方法虽然简单 但是如果场景简单 还是可以尝试使用的 因为其消耗的时间较少 同时 也可以作为一个baseline来验证提出的新算法是否有效 对于阈值分割 我们认为没有理由讲了 这里主要介绍两种自适应阈值分割方法 实际工程应用过程
  • 3dmax出现白屏解决方法

    3DMax 卡死 白屏 渲染死机问题总结 Deveuper的博客 CSDN博客 3dmax一渲染完就卡死 修改设置
  • 区块链技术的创新周期在不断缩短吗?

    有业内人士指出 区块链技术的发展可能要经过高峰 低谷和平复的过程 这也对金融监管部门提出了挑战 要在鼓励金融创新和防范风险之间找到平衡 从有利因素来看 区块链技术的创新周期在不断缩短 据介绍 金融科技定义是指技术驱动的金融创新 包括新业务模
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 II 从上到下打印二叉树 II 题目 题目链接 解题思路 具体思路 具体代码 题目 题目链接 https leetcode cn com problems cong shang dao xia da yin er c
  • vue父子组件在不同情况下生命周期的执行顺序

    在分析父子组件生命周期之前 我们先核实一次两个路由 不包含子组件 之间切换 其生命周期的执行顺序 在这用到两个路由 新闻路由和top路由 名字只做区分 没有其他含义 1 首先切换到新闻路由 执行顺序 beforeCreate gt crea
  • PHP下载m3u8,合并视频

    主要使用CURL获取请求 代码 将代码保存为m3u8 download php 然后执行 如果下载速度比较慢 要把Curl的超时时间设置长一点 防止出现超时丢数据 c gt php m3u8 download php u http xxx
  • 【构建ML驱动的应用程序】第 11 章 :监控和更新模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • C++ char* 的若干问题之一

    已有方法 十进制转二进制 char decimal2binary int numth string key bitset lt 4 gt t t numth key t to string char ch const cast
  • Arthas开源一周年,Github Star 16K,我们一直在坚持什么?

    缘起 最近看到一个很流行的标题 开源XX年 star XXX 我是如何坚持的 看到这样的标题 忽然发觉Arthas从2018年9月开源以来 刚好一年了 正好在这个秋高气爽的时节做下总结和回顾 Arthas是Alibaba开源的Java诊断工