From 479f38b9db8b3820a4ea54a0e14bd01458445553 Mon Sep 17 00:00:00 2001 From: SiuHui Date: Sun, 1 Sep 2024 15:48:10 +0800 Subject: [PATCH] feat: restrict boot to use 3.x version and support website version switching (#2884) --- .github/ISSUE_TEMPLATE/bug-report--cn-.md | 2 +- CONTRIBUTING.md | 20 +- README.md | 79 ++-- README_CN.md | 85 +++-- .../arthas/agent/attach/ArthasAgent.java | 2 +- bin/{as.sh => as3.sh} | 86 ++--- bin/{install-local.sh => install-local3.sh} | 2 +- bin/{install.sh => install3.sh} | 12 +- boot/pom.xml | 6 +- .../com/taobao/arthas/boot/Bootstrap.java | 80 +++-- .../com/taobao/arthas/boot/DownloadUtils.java | 13 + .../com/taobao/arthas/boot/ProcessUtils.java | 2 +- core/src/main/java/arthas.properties | 2 +- .../taobao/arthas/core/command/Constants.java | 2 +- .../taobao/arthas/core/util/ArthasBanner.java | 4 +- katacoda.yaml | 1 - packaging/pom.xml | 4 +- packaging/src/main/assembly/assembly.xml | 8 +- site/docs/.vuepress/config.js | 1 + site/docs/.vuepress/configs/navbar/en.js | 9 + site/docs/.vuepress/configs/navbar/zh.js | 9 + .../public/doc/arthas-tutorials.html | 6 +- site/docs/doc/advanced-use.md | 12 +- site/docs/doc/arthas-properties.md | 2 +- site/docs/doc/arthas3.md | 2 +- site/docs/doc/async.md | 2 +- site/docs/doc/auth.md | 2 +- site/docs/doc/batch-support.md | 4 +- site/docs/doc/cat.md | 2 +- site/docs/doc/classloader.md | 2 +- site/docs/doc/dashboard.md | 2 +- site/docs/doc/docker.md | 10 +- site/docs/doc/download.md | 24 +- site/docs/doc/dump.md | 2 +- site/docs/doc/echo.md | 2 +- site/docs/doc/faq.md | 2 +- site/docs/doc/getstatic.md | 2 +- site/docs/doc/grep.md | 4 +- site/docs/doc/heapdump.md | 2 +- site/docs/doc/help.md | 2 +- site/docs/doc/http-api.md | 6 +- site/docs/doc/install-detail.md | 38 +- site/docs/doc/jad.md | 2 +- site/docs/doc/jfr.md | 2 +- site/docs/doc/jvm.md | 2 +- site/docs/doc/keymap.md | 2 +- site/docs/doc/logger.md | 2 +- site/docs/doc/manual-install.md | 18 +- site/docs/doc/mbean.md | 2 +- site/docs/doc/mc.md | 2 +- site/docs/doc/monitor.md | 2 +- site/docs/doc/ognl.md | 2 +- site/docs/doc/options.md | 2 +- site/docs/doc/perfcounter.md | 2 +- site/docs/doc/profiler.md | 2 +- site/docs/doc/pwd.md | 2 +- site/docs/doc/quick-start.md | 18 +- site/docs/doc/redefine.md | 2 +- site/docs/doc/reset.md | 2 +- site/docs/doc/retransform.md | 2 +- site/docs/doc/save-log.md | 2 +- site/docs/doc/sc.md | 2 +- site/docs/doc/sm.md | 2 +- site/docs/doc/stack.md | 2 +- site/docs/doc/start-arthas.md | 14 +- site/docs/doc/sysenv.md | 4 +- site/docs/doc/sysprop.md | 4 +- site/docs/doc/tee.md | 4 +- site/docs/doc/thread.md | 2 +- site/docs/doc/trace.md | 2 +- site/docs/doc/tt.md | 2 +- site/docs/doc/tunnel.md | 20 +- site/docs/doc/vmoption.md | 2 +- site/docs/doc/vmtool.md | 2 +- site/docs/doc/watch.md | 2 +- site/docs/doc/web-console.md | 2 +- site/docs/en/doc/advanced-use.md | 12 +- site/docs/en/doc/arthas-properties.md | 2 +- site/docs/en/doc/async.md | 2 +- site/docs/en/doc/auth.md | 2 +- site/docs/en/doc/batch-support.md | 4 +- site/docs/en/doc/cat.md | 2 +- site/docs/en/doc/classloader.md | 2 +- site/docs/en/doc/dashboard.md | 2 +- site/docs/en/doc/docker.md | 10 +- site/docs/en/doc/download.md | 24 +- site/docs/en/doc/dump.md | 2 +- site/docs/en/doc/echo.md | 2 +- site/docs/en/doc/faq.md | 2 +- site/docs/en/doc/getstatic.md | 2 +- site/docs/en/doc/grep.md | 4 +- site/docs/en/doc/heapdump.md | 2 +- site/docs/en/doc/help.md | 2 +- site/docs/en/doc/http-api.md | 6 +- site/docs/en/doc/install-detail.md | 30 +- site/docs/en/doc/jad.md | 2 +- site/docs/en/doc/jfr.md | 2 +- site/docs/en/doc/jvm.md | 2 +- site/docs/en/doc/keymap.md | 2 +- site/docs/en/doc/logger.md | 2 +- site/docs/en/doc/manual-install.md | 16 +- site/docs/en/doc/mbean.md | 2 +- site/docs/en/doc/mc.md | 2 +- site/docs/en/doc/monitor.md | 2 +- site/docs/en/doc/ognl.md | 2 +- site/docs/en/doc/options.md | 2 +- site/docs/en/doc/perfcounter.md | 2 +- site/docs/en/doc/profiler.md | 2 +- site/docs/en/doc/pwd.md | 2 +- site/docs/en/doc/quick-start.md | 16 +- site/docs/en/doc/redefine.md | 2 +- site/docs/en/doc/reset.md | 2 +- site/docs/en/doc/retransform.md | 2 +- site/docs/en/doc/save-log.md | 2 +- site/docs/en/doc/sc.md | 2 +- site/docs/en/doc/sm.md | 2 +- site/docs/en/doc/stack.md | 2 +- site/docs/en/doc/start-arthas.md | 14 +- site/docs/en/doc/sysenv.md | 4 +- site/docs/en/doc/sysprop.md | 4 +- site/docs/en/doc/tee.md | 4 +- site/docs/en/doc/thread.md | 2 +- site/docs/en/doc/trace.md | 2 +- site/docs/en/doc/tt.md | 2 +- site/docs/en/doc/tunnel.md | 18 +- site/docs/en/doc/vmoption.md | 2 +- site/docs/en/doc/vmtool.md | 2 +- site/docs/en/doc/watch.md | 2 +- site/docs/en/doc/web-console.md | 2 +- site/yarn.lock | 267 ++------------ tutorials/katacoda/README.md | 37 -- tutorials/katacoda/README_CN.md | 37 -- .../arthas-advanced-cn/arthas-boot-details.md | 30 -- .../arthas-advanced-cn/arthas-boot.md | 16 - .../arthas-advanced-cn/case-classloader.md | 139 ------- .../case-get-spring-context.md | 54 --- .../arthas-advanced-cn/case-http-401.md | 53 --- .../arthas-advanced-cn/case-http-404.md | 39 -- .../case-jad-mc-redefine.md | 89 ----- .../case-logger-config-problem.md | 52 --- .../case-ognl-update-logger-level.md | 66 ---- .../arthas-advanced-cn/case-thread.md | 25 -- .../case-watch-method-exception.md | 100 ------ tutorials/katacoda/arthas-advanced-cn/exit.md | 19 - .../katacoda/arthas-advanced-cn/finish.md | 11 - .../katacoda/arthas-advanced-cn/index.json | 104 ------ .../katacoda/arthas-advanced-cn/intro.md | 11 - tutorials/katacoda/arthas-advanced-cn/jad.md | 9 - .../katacoda/arthas-advanced-cn/jvm-info.md | 30 -- tutorials/katacoda/arthas-advanced-cn/ognl.md | 71 ---- .../katacoda/arthas-advanced-cn/options.md | 37 -- .../katacoda/arthas-advanced-cn/sc-sm.md | 34 -- .../katacoda/arthas-advanced-cn/start-demo.md | 14 - tutorials/katacoda/arthas-advanced-cn/tips.md | 47 --- .../arthas-advanced-cn/web-console.md | 19 - .../arthas-advanced-en/arthas-boot-details.md | 30 -- .../arthas-advanced-en/arthas-boot.md | 16 - .../arthas-advanced-en/case-classloader.md | 140 -------- .../case-get-spring-context.md | 54 --- .../arthas-advanced-en/case-http-401.md | 56 --- .../arthas-advanced-en/case-http-404.md | 39 -- .../case-jad-mc-redefine.md | 92 ----- .../case-logger-config-problem.md | 53 --- .../case-ognl-update-logger-level.md | 66 ---- .../arthas-advanced-en/case-thread.md | 24 -- .../case-watch-method-exception.md | 98 ----- tutorials/katacoda/arthas-advanced-en/exit.md | 18 - .../katacoda/arthas-advanced-en/finish.md | 8 - .../katacoda/arthas-advanced-en/index.json | 104 ------ .../katacoda/arthas-advanced-en/intro.md | 11 - tutorials/katacoda/arthas-advanced-en/jad.md | 8 - .../katacoda/arthas-advanced-en/jvm-info.md | 29 -- tutorials/katacoda/arthas-advanced-en/ognl.md | 71 ---- .../katacoda/arthas-advanced-en/options.md | 36 -- .../katacoda/arthas-advanced-en/sc-sm.md | 33 -- .../katacoda/arthas-advanced-en/start-demo.md | 14 - tutorials/katacoda/arthas-advanced-en/tips.md | 47 --- .../arthas-advanced-en/web-console.md | 20 -- .../katacoda/arthas-basics-cn/arthas-boot.md | 16 - .../katacoda/arthas-basics-cn/arthas-demo.md | 10 - .../katacoda/arthas-basics-cn/dashboard.md | 3 - tutorials/katacoda/arthas-basics-cn/exit.md | 15 - tutorials/katacoda/arthas-basics-cn/finish.md | 10 - .../katacoda/arthas-basics-cn/index.json | 57 --- tutorials/katacoda/arthas-basics-cn/intro.md | 11 - tutorials/katacoda/arthas-basics-cn/jad.md | 4 - tutorials/katacoda/arthas-basics-cn/sc.md | 4 - tutorials/katacoda/arthas-basics-cn/thread.md | 11 - tutorials/katacoda/arthas-basics-cn/vmtool.md | 20 -- tutorials/katacoda/arthas-basics-cn/watch.md | 6 - .../katacoda/arthas-basics-en/arthas-boot.md | 15 - .../katacoda/arthas-basics-en/arthas-demo.md | 11 - .../katacoda/arthas-basics-en/dashboard.md | 3 - tutorials/katacoda/arthas-basics-en/exit.md | 13 - tutorials/katacoda/arthas-basics-en/finish.md | 6 - .../katacoda/arthas-basics-en/index.json | 57 --- tutorials/katacoda/arthas-basics-en/intro.md | 11 - tutorials/katacoda/arthas-basics-en/jad.md | 4 - tutorials/katacoda/arthas-basics-en/sc.md | 4 - tutorials/katacoda/arthas-basics-en/thread.md | 10 - tutorials/katacoda/arthas-basics-en/vmtool.md | 20 -- tutorials/katacoda/arthas-basics-en/watch.md | 5 - .../case-async-jobs-cn/arthas-boot.md | 16 - .../case-async-jobs-cn/arthas-demo.md | 10 - .../katacoda/case-async-jobs-cn/async-jobs.md | 2 - .../katacoda/case-async-jobs-cn/finish.md | 11 - .../katacoda/case-async-jobs-cn/index.json | 63 ---- .../katacoda/case-async-jobs-cn/intro.md | 23 -- .../case-async-jobs-cn/list-backgd-jobs.md | 24 -- .../katacoda/case-async-jobs-cn/others.md | 6 - .../case-async-jobs-cn/redirect-output.md | 11 - .../case-async-jobs-cn/run-cmd-in-backgd.md | 6 - .../katacoda/case-async-jobs-cn/stop-job.md | 2 - .../case-async-jobs-cn/suspend-cancel-job.md | 8 - .../switch-foregd-backgd.md | 6 - .../case-async-jobs-en/arthas-boot.md | 16 - .../case-async-jobs-en/arthas-demo.md | 11 - .../katacoda/case-async-jobs-en/async-jobs.md | 2 - .../katacoda/case-async-jobs-en/finish.md | 7 - .../katacoda/case-async-jobs-en/index.json | 63 ---- .../katacoda/case-async-jobs-en/intro.md | 39 -- .../case-async-jobs-en/list-backgd-jobs.md | 24 -- .../katacoda/case-async-jobs-en/others.md | 6 - .../case-async-jobs-en/redirect-output.md | 11 - .../case-async-jobs-en/run-cmd-in-backgd.md | 6 - .../katacoda/case-async-jobs-en/stop-job.md | 2 - .../case-async-jobs-en/suspend-cancel-job.md | 8 - .../switch-foregd-backgd.md | 6 - .../arthas-boot-details.md | 65 ---- .../case-boot-details-cn/arthas-demo.md | 10 - .../case-boot-details-cn/boot-examples.md | 108 ------ .../katacoda/case-boot-details-cn/finish.md | 11 - .../katacoda/case-boot-details-cn/index.json | 49 --- .../katacoda/case-boot-details-cn/intro.md | 23 -- .../case-boot-details-cn/start-demo.md | 14 - .../case-boot-details-cn/use-as-sh.md | 10 - .../arthas-boot-details.md | 68 ---- .../case-boot-details-en/arthas-demo.md | 11 - .../case-boot-details-en/boot-examples.md | 105 ------ .../katacoda/case-boot-details-en/finish.md | 7 - .../katacoda/case-boot-details-en/index.json | 49 --- .../katacoda/case-boot-details-en/intro.md | 39 -- .../case-boot-details-en/use-as-sh.md | 10 - .../case-classloader-cn/arthas-boot.md | 16 - .../case-classloader-cn/case-classloader.md | 154 -------- .../katacoda/case-classloader-cn/finish.md | 11 - .../katacoda/case-classloader-cn/index.json | 45 --- .../katacoda/case-classloader-cn/intro.md | 23 -- .../case-classloader-cn/start-demo.md | 14 - .../case-classloader-en/arthas-boot.md | 16 - .../case-classloader-en/case-classloader.md | 157 -------- .../katacoda/case-classloader-en/finish.md | 7 - .../katacoda/case-classloader-en/index.json | 45 --- .../katacoda/case-classloader-en/intro.md | 39 -- .../case-classloader-en/start-demo.md | 14 - .../case-get-spring-context-cn/arthas-boot.md | 16 - .../case-get-spring-context.md | 54 --- .../case-get-spring-context-cn/finish.md | 11 - .../case-get-spring-context-cn/index.json | 45 --- .../case-get-spring-context-cn/intro.md | 23 -- .../case-get-spring-context-cn/start-demo.md | 14 - .../case-get-spring-context-en/arthas-boot.md | 16 - .../case-get-spring-context.md | 54 --- .../case-get-spring-context-en/finish.md | 7 - .../case-get-spring-context-en/index.json | 45 --- .../case-get-spring-context-en/intro.md | 39 -- .../case-get-spring-context-en/start-demo.md | 14 - .../katacoda/case-http-401-cn/arthas-boot.md | 16 - .../case-http-401-cn/case-http-401.md | 53 --- tutorials/katacoda/case-http-401-cn/finish.md | 11 - .../katacoda/case-http-401-cn/index.json | 45 --- tutorials/katacoda/case-http-401-cn/intro.md | 23 -- .../katacoda/case-http-401-cn/start-demo.md | 14 - .../katacoda/case-http-401-en/arthas-boot.md | 16 - .../case-http-401-en/case-http-401.md | 56 --- .../case-watch-method-exception.md | 98 ----- tutorials/katacoda/case-http-401-en/finish.md | 7 - .../katacoda/case-http-401-en/index.json | 45 --- tutorials/katacoda/case-http-401-en/intro.md | 39 -- .../katacoda/case-http-401-en/start-demo.md | 14 - .../katacoda/case-http-404-cn/arthas-boot.md | 16 - .../case-http-404-cn/case-http-404.md | 39 -- tutorials/katacoda/case-http-404-cn/finish.md | 11 - .../katacoda/case-http-404-cn/index.json | 45 --- tutorials/katacoda/case-http-404-cn/intro.md | 23 -- .../katacoda/case-http-404-cn/start-demo.md | 14 - .../katacoda/case-http-404-en/arthas-boot.md | 16 - .../case-http-404-en/case-http-404.md | 39 -- tutorials/katacoda/case-http-404-en/finish.md | 7 - .../katacoda/case-http-404-en/index.json | 45 --- tutorials/katacoda/case-http-404-en/intro.md | 39 -- .../katacoda/case-http-404-en/start-demo.md | 14 - .../katacoda/case-http-api-cn/arthas-boot.md | 16 - .../katacoda/case-http-api-cn/arthas-demo.md | 10 - .../case-http-api-cn/classpath-java-app.md | 30 -- tutorials/katacoda/case-http-api-cn/finish.md | 11 - .../katacoda/case-http-api-cn/http-api.md | 59 --- .../katacoda/case-http-api-cn/index.json | 62 ---- tutorials/katacoda/case-http-api-cn/intro.md | 23 -- .../case-http-api-cn/one-time-command.md | 82 ----- .../case-http-api-cn/session-interaction.md | 323 ----------------- .../case-http-api-cn/watch-output-map.md | 87 ----- tutorials/katacoda/case-http-api-cn/web-ui.md | 19 - .../katacoda/case-http-api-en/arthas-boot.md | 16 - .../katacoda/case-http-api-en/arthas-demo.md | 11 - .../case-http-api-en/classpath-java-app.md | 32 -- tutorials/katacoda/case-http-api-en/finish.md | 7 - .../katacoda/case-http-api-en/http-api.md | 79 ---- .../katacoda/case-http-api-en/index.json | 62 ---- tutorials/katacoda/case-http-api-en/intro.md | 39 -- .../case-http-api-en/one-time-command.md | 97 ----- .../case-http-api-en/session-interaction.md | 339 ------------------ .../case-http-api-en/watch-output-map.md | 92 ----- tutorials/katacoda/case-http-api-en/web-ui.md | 23 -- .../case-jad-mc-redefine-cn/arthas-boot.md | 16 - .../case-jad-mc-redefine.md | 95 ----- .../case-jad-mc-redefine-cn/finish.md | 11 - .../case-jad-mc-redefine-cn/index.json | 45 --- .../katacoda/case-jad-mc-redefine-cn/intro.md | 23 -- .../case-jad-mc-redefine-cn/start-demo.md | 14 - .../case-jad-mc-redefine-en/arthas-boot.md | 16 - .../case-jad-mc-redefine.md | 98 ----- .../case-jad-mc-redefine-en/finish.md | 7 - .../case-jad-mc-redefine-en/index.json | 45 --- .../katacoda/case-jad-mc-redefine-en/intro.md | 39 -- .../case-jad-mc-redefine-en/start-demo.md | 14 - .../arthas-boot.md | 16 - .../case-logger-config-problem.md | 82 ----- .../case-logger-config-problem-cn/finish.md | 11 - .../case-logger-config-problem-cn/index.json | 45 --- .../case-logger-config-problem-cn/intro.md | 23 -- .../start-demo.md | 14 - .../arthas-boot.md | 16 - .../case-logger-config-problem.md | 83 ----- .../case-logger-config-problem-en/finish.md | 7 - .../case-logger-config-problem-en/index.json | 45 --- .../case-logger-config-problem-en/intro.md | 39 -- .../start-demo.md | 14 - .../katacoda/case-ognl-practise-cn/finish.md | 20 -- .../katacoda/case-ognl-practise-cn/index.json | 29 -- .../katacoda/case-ognl-practise-cn/intro.md | 9 - .../katacoda/case-ognl-practise-cn/setup.sh | 1 - .../katacoda/case-ognl-practise-cn/step1.md | 84 ----- .../katacoda/case-ognl-practise-en/finish.md | 12 - .../katacoda/case-ognl-practise-en/index.json | 29 -- .../katacoda/case-ognl-practise-en/intro.md | 8 - .../katacoda/case-ognl-practise-en/setup.sh | 1 - .../katacoda/case-ognl-practise-en/step1.md | 85 ----- .../arthas-boot.md | 16 - .../case-ognl-update-logger-level.md | 87 ----- .../finish.md | 11 - .../index.json | 45 --- .../case-ognl-update-logger-level-cn/intro.md | 23 -- .../start-demo.md | 14 - .../arthas-boot.md | 16 - .../case-ognl-update-logger-level.md | 85 ----- .../finish.md | 7 - .../index.json | 45 --- .../case-ognl-update-logger-level-en/intro.md | 39 -- .../start-demo.md | 14 - .../katacoda/case-save-log-cn/arthas-boot.md | 16 - .../katacoda/case-save-log-cn/arthas-demo.md | 10 - tutorials/katacoda/case-save-log-cn/finish.md | 11 - .../katacoda/case-save-log-cn/index.json | 35 -- tutorials/katacoda/case-save-log-cn/intro.md | 23 -- .../katacoda/case-save-log-cn/save-log.md | 32 -- .../katacoda/case-save-log-en/arthas-boot.md | 16 - .../katacoda/case-save-log-en/arthas-demo.md | 11 - tutorials/katacoda/case-save-log-en/finish.md | 7 - .../katacoda/case-save-log-en/index.json | 33 -- tutorials/katacoda/case-save-log-en/intro.md | 39 -- .../katacoda/case-save-log-en/save-log.md | 31 -- .../katacoda/case-thread-cn/arthas-boot.md | 16 - .../katacoda/case-thread-cn/arthas-demo.md | 10 - .../katacoda/case-thread-cn/case-thread.md | 30 -- tutorials/katacoda/case-thread-cn/finish.md | 11 - tutorials/katacoda/case-thread-cn/index.json | 35 -- tutorials/katacoda/case-thread-cn/intro.md | 23 -- .../katacoda/case-thread-en/arthas-boot.md | 16 - .../katacoda/case-thread-en/arthas-demo.md | 11 - .../katacoda/case-thread-en/case-thread.md | 29 -- tutorials/katacoda/case-thread-en/finish.md | 7 - tutorials/katacoda/case-thread-en/index.json | 35 -- tutorials/katacoda/case-thread-en/intro.md | 39 -- .../arthas-boot.md | 16 - .../case-watch-method-exception.md | 118 ------ .../case-watch-method-exception-cn/finish.md | 11 - .../case-watch-method-exception-cn/index.json | 45 --- .../case-watch-method-exception-cn/intro.md | 23 -- .../start-demo.md | 14 - .../arthas-boot.md | 16 - .../case-watch-method-exception.md | 116 ------ .../case-watch-method-exception-en/finish.md | 7 - .../case-watch-method-exception-en/index.json | 45 --- .../case-watch-method-exception-en/intro.md | 39 -- .../start-demo.md | 14 - .../case-web-console-cn/arthas-boot.md | 16 - .../case-web-console-cn/arthas-demo.md | 10 - .../katacoda/case-web-console-cn/finish.md | 11 - .../katacoda/case-web-console-cn/index.json | 35 -- .../katacoda/case-web-console-cn/intro.md | 23 -- .../case-web-console-cn/web-console.md | 19 - .../case-web-console-en/arthas-boot.md | 16 - .../case-web-console-en/arthas-demo.md | 11 - .../katacoda/case-web-console-en/finish.md | 7 - .../katacoda/case-web-console-en/index.json | 35 -- .../katacoda/case-web-console-en/intro.md | 39 -- .../case-web-console-en/web-console.md | 20 -- .../katacoda/command-cat-cn/arthas-boot.md | 16 - .../katacoda/command-cat-cn/arthas-demo.md | 10 - tutorials/katacoda/command-cat-cn/cat.md | 10 - tutorials/katacoda/command-cat-cn/finish.md | 11 - tutorials/katacoda/command-cat-cn/index.json | 33 -- tutorials/katacoda/command-cat-cn/intro.md | 23 -- .../katacoda/command-cat-en/arthas-boot.md | 15 - .../katacoda/command-cat-en/arthas-demo.md | 11 - tutorials/katacoda/command-cat-en/cat.md | 10 - tutorials/katacoda/command-cat-en/finish.md | 7 - tutorials/katacoda/command-cat-en/index.json | 33 -- tutorials/katacoda/command-cat-en/intro.md | 39 -- .../command-classloader-cn/arthas-boot.md | 16 - .../command-classloader-cn/classloader.md | 184 ---------- .../katacoda/command-classloader-cn/finish.md | 11 - .../command-classloader-cn/index.json | 45 --- .../katacoda/command-classloader-cn/intro.md | 23 -- .../command-classloader-cn/start-demo.md | 14 - .../command-classloader-en/arthas-boot.md | 16 - .../command-classloader-en/classloader.md | 183 ---------- .../katacoda/command-classloader-en/finish.md | 7 - .../command-classloader-en/index.json | 45 --- .../katacoda/command-classloader-en/intro.md | 39 -- .../command-classloader-en/start-demo.md | 14 - .../katacoda/command-cls-cn/arthas-boot.md | 16 - .../katacoda/command-cls-cn/arthas-demo.md | 10 - tutorials/katacoda/command-cls-cn/cls.md | 3 - tutorials/katacoda/command-cls-cn/finish.md | 11 - tutorials/katacoda/command-cls-cn/index.json | 33 -- tutorials/katacoda/command-cls-cn/intro.md | 23 -- .../katacoda/command-cls-en/arthas-boot.md | 15 - .../katacoda/command-cls-en/arthas-demo.md | 11 - tutorials/katacoda/command-cls-en/cls.md | 4 - tutorials/katacoda/command-cls-en/finish.md | 7 - tutorials/katacoda/command-cls-en/index.json | 33 -- tutorials/katacoda/command-cls-en/intro.md | 39 -- .../command-dashboard-cn/arthas-boot.md | 16 - .../command-dashboard-cn/arthas-demo.md | 10 - .../command-dashboard-cn/dashboard.md | 70 ---- .../katacoda/command-dashboard-cn/finish.md | 11 - .../katacoda/command-dashboard-cn/index.json | 37 -- .../katacoda/command-dashboard-cn/intro.md | 23 -- .../notes-on-column-headers.md | 22 -- .../command-dashboard-en/arthas-boot.md | 15 - .../command-dashboard-en/arthas-demo.md | 11 - .../command-dashboard-en/dashboard.md | 74 ---- .../katacoda/command-dashboard-en/finish.md | 7 - .../katacoda/command-dashboard-en/index.json | 37 -- .../katacoda/command-dashboard-en/intro.md | 39 -- .../notes-on-column-headers.md | 22 -- .../katacoda/command-dump-cn/arthas-boot.md | 16 - .../katacoda/command-dump-cn/arthas-demo.md | 10 - tutorials/katacoda/command-dump-cn/dump.md | 68 ---- tutorials/katacoda/command-dump-cn/finish.md | 11 - tutorials/katacoda/command-dump-cn/index.json | 35 -- tutorials/katacoda/command-dump-cn/intro.md | 23 -- .../katacoda/command-dump-en/arthas-boot.md | 16 - .../katacoda/command-dump-en/arthas-demo.md | 11 - tutorials/katacoda/command-dump-en/dump.md | 68 ---- tutorials/katacoda/command-dump-en/finish.md | 7 - tutorials/katacoda/command-dump-en/index.json | 35 -- tutorials/katacoda/command-dump-en/intro.md | 39 -- .../katacoda/command-echo-cn/arthas-boot.md | 16 - .../katacoda/command-echo-cn/arthas-demo.md | 10 - tutorials/katacoda/command-echo-cn/echo.md | 4 - tutorials/katacoda/command-echo-cn/finish.md | 11 - tutorials/katacoda/command-echo-cn/index.json | 33 -- tutorials/katacoda/command-echo-cn/intro.md | 23 -- .../katacoda/command-echo-en/arthas-boot.md | 15 - .../katacoda/command-echo-en/arthas-demo.md | 11 - tutorials/katacoda/command-echo-en/echo.md | 4 - tutorials/katacoda/command-echo-en/finish.md | 7 - tutorials/katacoda/command-echo-en/index.json | 33 -- tutorials/katacoda/command-echo-en/intro.md | 39 -- .../command-getstatic-cn/arthas-boot.md | 16 - .../command-getstatic-cn/arthas-demo.md | 10 - .../katacoda/command-getstatic-cn/finish.md | 11 - .../command-getstatic-cn/getstatic.md | 52 --- .../katacoda/command-getstatic-cn/index.json | 35 -- .../katacoda/command-getstatic-cn/intro.md | 23 -- .../command-getstatic-en/arthas-boot.md | 16 - .../command-getstatic-en/arthas-demo.md | 11 - .../katacoda/command-getstatic-en/finish.md | 7 - .../command-getstatic-en/getstatic.md | 52 --- .../katacoda/command-getstatic-en/index.json | 35 -- .../katacoda/command-getstatic-en/intro.md | 39 -- .../katacoda/command-grep-cn/arthas-boot.md | 16 - .../katacoda/command-grep-cn/arthas-demo.md | 10 - tutorials/katacoda/command-grep-cn/finish.md | 11 - tutorials/katacoda/command-grep-cn/grep.md | 60 ---- tutorials/katacoda/command-grep-cn/index.json | 33 -- tutorials/katacoda/command-grep-cn/intro.md | 23 -- .../katacoda/command-grep-en/arthas-boot.md | 15 - .../katacoda/command-grep-en/arthas-demo.md | 11 - tutorials/katacoda/command-grep-en/finish.md | 8 - tutorials/katacoda/command-grep-en/grep.md | 60 ---- tutorials/katacoda/command-grep-en/index.json | 33 -- tutorials/katacoda/command-grep-en/intro.md | 39 -- .../command-heapdump-cn/arthas-boot.md | 16 - .../command-heapdump-cn/arthas-demo.md | 10 - .../katacoda/command-heapdump-cn/finish.md | 11 - .../katacoda/command-heapdump-cn/heapdump.md | 38 -- .../katacoda/command-heapdump-cn/index.json | 35 -- .../katacoda/command-heapdump-cn/intro.md | 23 -- .../command-heapdump-en/arthas-boot.md | 16 - .../command-heapdump-en/arthas-demo.md | 11 - .../katacoda/command-heapdump-en/finish.md | 8 - .../katacoda/command-heapdump-en/heapdump.md | 38 -- .../katacoda/command-heapdump-en/index.json | 35 -- .../katacoda/command-heapdump-en/intro.md | 39 -- .../katacoda/command-help-cn/arthas-boot.md | 16 - .../katacoda/command-help-cn/arthas-demo.md | 10 - tutorials/katacoda/command-help-cn/finish.md | 12 - .../katacoda/command-help-cn/help-sysprop.md | 30 -- tutorials/katacoda/command-help-cn/help.md | 19 - tutorials/katacoda/command-help-cn/index.json | 37 -- tutorials/katacoda/command-help-cn/intro.md | 23 -- .../katacoda/command-help-en/arthas-boot.md | 15 - .../katacoda/command-help-en/arthas-demo.md | 11 - tutorials/katacoda/command-help-en/finish.md | 7 - .../katacoda/command-help-en/help-sysprop.md | 30 -- tutorials/katacoda/command-help-en/help.md | 19 - tutorials/katacoda/command-help-en/index.json | 37 -- tutorials/katacoda/command-help-en/intro.md | 39 -- .../command-history-cn/arthas-boot.md | 16 - .../command-history-cn/arthas-demo.md | 10 - .../katacoda/command-history-cn/finish.md | 12 - .../katacoda/command-history-cn/history.md | 35 -- .../katacoda/command-history-cn/index.json | 33 -- .../katacoda/command-history-cn/intro.md | 23 -- .../command-history-en/arthas-boot.md | 15 - .../command-history-en/arthas-demo.md | 11 - .../katacoda/command-history-en/finish.md | 8 - .../katacoda/command-history-en/history.md | 35 -- .../katacoda/command-history-en/index.json | 33 -- .../katacoda/command-history-en/intro.md | 39 -- .../katacoda/command-jad-cn/arthas-boot.md | 16 - .../katacoda/command-jad-cn/arthas-demo.md | 10 - tutorials/katacoda/command-jad-cn/finish.md | 12 - tutorials/katacoda/command-jad-cn/index.json | 35 -- tutorials/katacoda/command-jad-cn/intro.md | 23 -- tutorials/katacoda/command-jad-cn/jad.md | 156 -------- .../katacoda/command-jad-en/arthas-boot.md | 16 - .../katacoda/command-jad-en/arthas-demo.md | 11 - tutorials/katacoda/command-jad-en/finish.md | 7 - tutorials/katacoda/command-jad-en/index.json | 35 -- tutorials/katacoda/command-jad-en/intro.md | 39 -- tutorials/katacoda/command-jad-en/jad.md | 156 -------- .../katacoda/command-jfr-cn/arthas-boot.md | 16 - .../katacoda/command-jfr-cn/arthas-demo.md | 10 - tutorials/katacoda/command-jfr-cn/finish.md | 11 - tutorials/katacoda/command-jfr-cn/index.json | 35 -- tutorials/katacoda/command-jfr-cn/intro.md | 23 -- tutorials/katacoda/command-jfr-cn/jfr.md | 126 ------- .../katacoda/command-jfr-en/arthas-boot.md | 16 - .../katacoda/command-jfr-en/arthas-demo.md | 11 - tutorials/katacoda/command-jfr-en/finish.md | 7 - tutorials/katacoda/command-jfr-en/index.json | 35 -- tutorials/katacoda/command-jfr-en/intro.md | 39 -- tutorials/katacoda/command-jfr-en/jfr.md | 126 ------- .../katacoda/command-jvm-cn/arthas-boot.md | 16 - .../katacoda/command-jvm-cn/arthas-demo.md | 10 - tutorials/katacoda/command-jvm-cn/finish.md | 11 - tutorials/katacoda/command-jvm-cn/index.json | 43 --- tutorials/katacoda/command-jvm-cn/intro.md | 23 -- .../katacoda/command-jvm-cn/jvm-usage.md | 103 ------ tutorials/katacoda/command-jvm-cn/jvm.md | 13 - .../command-jvm-cn/notes-on-column-headers.md | 18 - .../katacoda/command-jvm-en/arthas-boot.md | 16 - .../katacoda/command-jvm-en/arthas-demo.md | 11 - tutorials/katacoda/command-jvm-en/finish.md | 7 - tutorials/katacoda/command-jvm-en/index.json | 35 -- tutorials/katacoda/command-jvm-en/intro.md | 39 -- .../katacoda/command-jvm-en/jvm-usage.md | 102 ------ tutorials/katacoda/command-jvm-en/jvm.md | 13 - .../command-jvm-en/notes-on-column-headers.md | 18 - .../katacoda/command-keymap-cn/arthas-boot.md | 16 - .../katacoda/command-keymap-cn/arthas-demo.md | 10 - .../command-keymap-cn/custom-shortcuts.md | 63 ---- .../command-keymap-cn/default-keymap.md | 26 -- .../katacoda/command-keymap-cn/finish.md | 11 - .../katacoda/command-keymap-cn/index.json | 45 --- tutorials/katacoda/command-keymap-cn/intro.md | 23 -- .../katacoda/command-keymap-cn/keymap.md | 4 - .../command-keymap-cn/shortcuts-for-jobs.md | 8 - .../katacoda/command-keymap-en/arthas-boot.md | 15 - .../katacoda/command-keymap-en/arthas-demo.md | 11 - .../command-keymap-en/custom-shortcuts.md | 63 ---- .../command-keymap-en/default-keymap.md | 26 -- .../katacoda/command-keymap-en/finish.md | 7 - .../katacoda/command-keymap-en/index.json | 45 --- tutorials/katacoda/command-keymap-en/intro.md | 39 -- .../katacoda/command-keymap-en/keymap.md | 4 - .../command-keymap-en/shortcuts-for-jobs.md | 8 - .../katacoda/command-logger-cn/arthas-boot.md | 16 - .../katacoda/command-logger-cn/finish.md | 11 - .../katacoda/command-logger-cn/index.json | 45 --- tutorials/katacoda/command-logger-cn/intro.md | 23 -- .../katacoda/command-logger-cn/logger.md | 134 ------- .../katacoda/command-logger-cn/start-demo.md | 14 - .../katacoda/command-logger-en/arthas-boot.md | 16 - .../katacoda/command-logger-en/finish.md | 7 - .../katacoda/command-logger-en/index.json | 45 --- tutorials/katacoda/command-logger-en/intro.md | 39 -- .../katacoda/command-logger-en/logger.md | 134 ------- .../katacoda/command-logger-en/start-demo.md | 14 - .../katacoda/command-mbean-cn/arthas-boot.md | 16 - .../katacoda/command-mbean-cn/arthas-demo.md | 10 - tutorials/katacoda/command-mbean-cn/finish.md | 11 - .../katacoda/command-mbean-cn/index.json | 35 -- tutorials/katacoda/command-mbean-cn/intro.md | 23 -- tutorials/katacoda/command-mbean-cn/mbean.md | 57 --- .../katacoda/command-mbean-en/arthas-boot.md | 16 - .../katacoda/command-mbean-en/arthas-demo.md | 11 - tutorials/katacoda/command-mbean-en/finish.md | 7 - .../katacoda/command-mbean-en/index.json | 35 -- tutorials/katacoda/command-mbean-en/intro.md | 39 -- tutorials/katacoda/command-mbean-en/mbean.md | 57 --- .../command-mc-redefine-cn/arthas-boot.md | 16 - .../case-jad-mc-redefine.md | 95 ----- .../katacoda/command-mc-redefine-cn/finish.md | 11 - .../command-mc-redefine-cn/index.json | 53 --- .../katacoda/command-mc-redefine-cn/intro.md | 23 -- .../katacoda/command-mc-redefine-cn/mc.md | 7 - .../command-mc-redefine-cn/redefine.md | 33 -- .../command-mc-redefine-cn/start-demo.md | 14 - .../command-mc-redefine-en/arthas-boot.md | 16 - .../case-jad-mc-redefine.md | 98 ----- .../katacoda/command-mc-redefine-en/finish.md | 7 - .../command-mc-redefine-en/index.json | 53 --- .../katacoda/command-mc-redefine-en/intro.md | 39 -- .../katacoda/command-mc-redefine-en/mc.md | 6 - .../command-mc-redefine-en/redefine.md | 33 -- .../command-mc-redefine-en/start-demo.md | 14 - .../command-mc-retransform-cn/arthas-boot.md | 16 - .../case-jad-mc-retransform.md | 95 ----- .../command-mc-retransform-cn/finish.md | 11 - .../command-mc-retransform-cn/index.json | 57 --- .../command-mc-retransform-cn/intro.md | 23 -- .../katacoda/command-mc-retransform-cn/mc.md | 7 - .../retransform-more.md | 62 ---- .../command-mc-retransform-cn/retransform.md | 19 - .../command-mc-retransform-cn/start-demo.md | 14 - .../command-mc-retransform-en/arthas-boot.md | 16 - .../case-jad-mc-retransform.md | 98 ----- .../command-mc-retransform-en/finish.md | 7 - .../command-mc-retransform-en/index.json | 57 --- .../command-mc-retransform-en/intro.md | 39 -- .../katacoda/command-mc-retransform-en/mc.md | 6 - .../retransform-more.md | 64 ---- .../command-mc-retransform-en/retransform.md | 18 - .../command-mc-retransform-en/start-demo.md | 14 - .../command-monitor-cn/arthas-boot.md | 16 - .../command-monitor-cn/arthas-demo.md | 10 - .../katacoda/command-monitor-cn/finish.md | 11 - .../katacoda/command-monitor-cn/index.json | 35 -- .../katacoda/command-monitor-cn/intro.md | 23 -- .../katacoda/command-monitor-cn/monitor.md | 69 ---- .../command-monitor-en/arthas-boot.md | 16 - .../command-monitor-en/arthas-demo.md | 11 - .../katacoda/command-monitor-en/finish.md | 7 - .../katacoda/command-monitor-en/index.json | 35 -- .../katacoda/command-monitor-en/intro.md | 39 -- .../katacoda/command-monitor-en/monitor.md | 71 ---- .../katacoda/command-ognl-cn/arthas-boot.md | 16 - .../case-logger-config-problem.md | 52 --- .../case-ognl-update-logger-level.md | 66 ---- tutorials/katacoda/command-ognl-cn/finish.md | 11 - tutorials/katacoda/command-ognl-cn/index.json | 53 --- tutorials/katacoda/command-ognl-cn/intro.md | 23 -- tutorials/katacoda/command-ognl-cn/ognl.md | 73 ---- .../katacoda/command-ognl-cn/start-demo.md | 14 - .../katacoda/command-ognl-en/arthas-boot.md | 16 - .../case-logger-config-problem.md | 53 --- .../case-ognl-update-logger-level.md | 64 ---- tutorials/katacoda/command-ognl-en/finish.md | 7 - tutorials/katacoda/command-ognl-en/index.json | 53 --- tutorials/katacoda/command-ognl-en/intro.md | 39 -- tutorials/katacoda/command-ognl-en/ognl.md | 73 ---- .../katacoda/command-ognl-en/start-demo.md | 14 - .../command-options-cn/arthas-boot.md | 16 - .../command-options-cn/arthas-demo.md | 10 - .../katacoda/command-options-cn/finish.md | 11 - .../katacoda/command-options-cn/index.json | 35 -- .../katacoda/command-options-cn/intro.md | 23 -- .../katacoda/command-options-cn/options.md | 96 ----- .../command-options-en/arthas-boot.md | 16 - .../command-options-en/arthas-demo.md | 11 - .../katacoda/command-options-en/finish.md | 7 - .../katacoda/command-options-en/index.json | 35 -- .../katacoda/command-options-en/intro.md | 39 -- .../katacoda/command-options-en/options.md | 101 ------ .../command-perfcounter-cn/arthas-boot.md | 16 - .../command-perfcounter-cn/arthas-demo.md | 10 - .../katacoda/command-perfcounter-cn/finish.md | 11 - .../command-perfcounter-cn/index.json | 35 -- .../katacoda/command-perfcounter-cn/intro.md | 23 -- .../command-perfcounter-cn/perfcounter.md | 60 ---- .../command-perfcounter-en/arthas-boot.md | 16 - .../command-perfcounter-en/arthas-demo.md | 11 - .../katacoda/command-perfcounter-en/finish.md | 7 - .../command-perfcounter-en/index.json | 35 -- .../katacoda/command-perfcounter-en/intro.md | 39 -- .../command-perfcounter-en/perfcounter.md | 60 ---- .../command-plaintext-cn/arthas-boot.md | 16 - .../command-plaintext-cn/arthas-demo.md | 10 - .../katacoda/command-plaintext-cn/finish.md | 11 - .../katacoda/command-plaintext-cn/index.json | 35 -- .../katacoda/command-plaintext-cn/intro.md | 23 -- .../command-plaintext-cn/plaintext.md | 8 - .../command-plaintext-en/arthas-boot.md | 16 - .../command-plaintext-en/arthas-demo.md | 11 - .../katacoda/command-plaintext-en/finish.md | 7 - .../katacoda/command-plaintext-en/index.json | 35 -- .../katacoda/command-plaintext-en/intro.md | 39 -- .../command-plaintext-en/plaintext.md | 8 - .../command-profiler-cn/arthas-boot.md | 16 - .../command-profiler-cn/arthas-demo.md | 10 - .../katacoda/command-profiler-cn/finish.md | 11 - .../katacoda/command-profiler-cn/index.json | 42 --- .../katacoda/command-profiler-cn/intro.md | 23 -- .../katacoda/command-profiler-cn/profiler.md | 188 ---------- .../command-profiler-en/arthas-boot.md | 16 - .../command-profiler-en/arthas-demo.md | 11 - .../katacoda/command-profiler-en/finish.md | 7 - .../katacoda/command-profiler-en/index.json | 42 --- .../katacoda/command-profiler-en/intro.md | 39 -- .../katacoda/command-profiler-en/profiler.md | 189 ---------- .../katacoda/command-pwd-cn/arthas-boot.md | 16 - .../katacoda/command-pwd-cn/arthas-demo.md | 10 - tutorials/katacoda/command-pwd-cn/finish.md | 11 - tutorials/katacoda/command-pwd-cn/index.json | 33 -- tutorials/katacoda/command-pwd-cn/intro.md | 23 -- tutorials/katacoda/command-pwd-cn/pwd.md | 4 - .../katacoda/command-pwd-en/arthas-boot.md | 15 - .../katacoda/command-pwd-en/arthas-demo.md | 11 - tutorials/katacoda/command-pwd-en/finish.md | 7 - tutorials/katacoda/command-pwd-en/index.json | 33 -- tutorials/katacoda/command-pwd-en/intro.md | 39 -- tutorials/katacoda/command-pwd-en/pwd.md | 4 - .../command-quit-stop-cn/arthas-boot.md | 16 - .../command-quit-stop-cn/arthas-demo.md | 10 - .../katacoda/command-quit-stop-cn/finish.md | 11 - .../katacoda/command-quit-stop-cn/index.json | 33 -- .../katacoda/command-quit-stop-cn/intro.md | 23 -- .../command-quit-stop-cn/quit-stop.md | 15 - .../command-quit-stop-en/arthas-boot.md | 15 - .../command-quit-stop-en/arthas-demo.md | 11 - .../katacoda/command-quit-stop-en/finish.md | 7 - .../katacoda/command-quit-stop-en/index.json | 33 -- .../katacoda/command-quit-stop-en/intro.md | 39 -- .../command-quit-stop-en/quit-stop.md | 12 - .../katacoda/command-reset-cn/arthas-boot.md | 16 - .../katacoda/command-reset-cn/arthas-demo.md | 10 - tutorials/katacoda/command-reset-cn/finish.md | 11 - .../katacoda/command-reset-cn/index.json | 45 --- tutorials/katacoda/command-reset-cn/intro.md | 23 -- .../command-reset-cn/reset-all-classes.md | 22 -- .../command-reset-cn/reset-specified-class.md | 22 -- .../katacoda/command-reset-cn/reset-usage.md | 22 -- tutorials/katacoda/command-reset-cn/reset.md | 5 - .../katacoda/command-reset-en/arthas-boot.md | 15 - .../katacoda/command-reset-en/arthas-demo.md | 11 - tutorials/katacoda/command-reset-en/finish.md | 7 - .../katacoda/command-reset-en/index.json | 45 --- tutorials/katacoda/command-reset-en/intro.md | 39 -- .../command-reset-en/reset-all-classes.md | 22 -- .../command-reset-en/reset-specified-class.md | 22 -- .../katacoda/command-reset-en/reset-usage.md | 22 -- tutorials/katacoda/command-reset-en/reset.md | 4 - .../katacoda/command-sc-cn/arthas-boot.md | 16 - .../katacoda/command-sc-cn/arthas-demo.md | 10 - tutorials/katacoda/command-sc-cn/finish.md | 11 - tutorials/katacoda/command-sc-cn/index.json | 35 -- tutorials/katacoda/command-sc-cn/intro.md | 23 -- tutorials/katacoda/command-sc-cn/sc.md | 126 ------- .../katacoda/command-sc-en/arthas-boot.md | 16 - .../katacoda/command-sc-en/arthas-demo.md | 11 - tutorials/katacoda/command-sc-en/finish.md | 7 - tutorials/katacoda/command-sc-en/index.json | 35 -- tutorials/katacoda/command-sc-en/intro.md | 39 -- tutorials/katacoda/command-sc-en/sc.md | 123 ------- .../command-session-cn/arthas-boot.md | 16 - .../command-session-cn/arthas-demo.md | 10 - .../katacoda/command-session-cn/finish.md | 11 - .../katacoda/command-session-cn/index.json | 33 -- .../katacoda/command-session-cn/intro.md | 23 -- .../katacoda/command-session-cn/session.md | 12 - .../command-session-en/arthas-boot.md | 15 - .../command-session-en/arthas-demo.md | 11 - .../katacoda/command-session-en/finish.md | 7 - .../katacoda/command-session-en/index.json | 33 -- .../katacoda/command-session-en/intro.md | 39 -- .../katacoda/command-session-en/session.md | 12 - .../katacoda/command-sm-cn/arthas-boot.md | 16 - .../katacoda/command-sm-cn/arthas-demo.md | 10 - tutorials/katacoda/command-sm-cn/finish.md | 11 - tutorials/katacoda/command-sm-cn/index.json | 35 -- tutorials/katacoda/command-sm-cn/intro.md | 23 -- tutorials/katacoda/command-sm-cn/sm.md | 129 ------- .../katacoda/command-sm-en/arthas-boot.md | 16 - .../katacoda/command-sm-en/arthas-demo.md | 11 - tutorials/katacoda/command-sm-en/finish.md | 7 - tutorials/katacoda/command-sm-en/index.json | 35 -- tutorials/katacoda/command-sm-en/intro.md | 39 -- tutorials/katacoda/command-sm-en/sm.md | 128 ------- .../katacoda/command-stack-cn/arthas-boot.md | 16 - .../katacoda/command-stack-cn/arthas-demo.md | 10 - tutorials/katacoda/command-stack-cn/finish.md | 12 - .../katacoda/command-stack-cn/index.json | 35 -- tutorials/katacoda/command-stack-cn/intro.md | 23 -- tutorials/katacoda/command-stack-cn/stack.md | 76 ---- .../katacoda/command-stack-en/arthas-boot.md | 16 - .../katacoda/command-stack-en/arthas-demo.md | 11 - tutorials/katacoda/command-stack-en/finish.md | 7 - .../katacoda/command-stack-en/index.json | 35 -- tutorials/katacoda/command-stack-en/intro.md | 39 -- tutorials/katacoda/command-stack-en/stack.md | 77 ---- .../katacoda/command-sysenv-cn/arthas-boot.md | 16 - .../katacoda/command-sysenv-cn/arthas-demo.md | 10 - .../command-sysenv-cn/auto-completion.md | 10 - .../command-sysenv-cn/check-all-properties.md | 38 -- .../check-one-single-property.md | 7 - .../completion-of-history-commands.md | 8 - .../katacoda/command-sysenv-cn/finish.md | 11 - .../katacoda/command-sysenv-cn/index.json | 51 --- tutorials/katacoda/command-sysenv-cn/intro.md | 23 -- .../katacoda/command-sysenv-cn/sysenv.md | 25 -- .../katacoda/command-sysenv-en/arthas-boot.md | 16 - .../katacoda/command-sysenv-en/arthas-demo.md | 11 - .../command-sysenv-en/auto-completion.md | 10 - .../command-sysenv-en/check-all-properties.md | 38 -- .../check-one-single-property.md | 7 - .../completion-of-history-commands.md | 6 - .../katacoda/command-sysenv-en/finish.md | 7 - .../katacoda/command-sysenv-en/index.json | 51 --- tutorials/katacoda/command-sysenv-en/intro.md | 39 -- .../katacoda/command-sysenv-en/sysenv.md | 25 -- .../command-sysprop-cn/arthas-boot.md | 16 - .../command-sysprop-cn/arthas-demo.md | 10 - .../command-sysprop-cn/auto-completion.md | 11 - .../check-all-properties.md | 75 ---- .../check-one-single-property.md | 21 -- .../completion-of-history-commands.md | 8 - .../katacoda/command-sysprop-cn/finish.md | 11 - .../katacoda/command-sysprop-cn/index.json | 55 --- .../katacoda/command-sysprop-cn/intro.md | 23 -- .../katacoda/command-sysprop-cn/pipeline.md | 10 - .../katacoda/command-sysprop-cn/sysprop.md | 27 -- .../command-sysprop-en/arthas-boot.md | 16 - .../command-sysprop-en/arthas-demo.md | 11 - .../command-sysprop-en/auto-completion.md | 11 - .../check-all-properties.md | 75 ---- .../check-one-single-property.md | 19 - .../completion-of-history-commands.md | 6 - .../katacoda/command-sysprop-en/finish.md | 7 - .../katacoda/command-sysprop-en/index.json | 55 --- .../katacoda/command-sysprop-en/intro.md | 39 -- .../katacoda/command-sysprop-en/pipeline.md | 11 - .../katacoda/command-sysprop-en/sysprop.md | 27 -- .../katacoda/command-tee-cn/arthas-boot.md | 16 - .../katacoda/command-tee-cn/arthas-demo.md | 10 - tutorials/katacoda/command-tee-cn/finish.md | 11 - tutorials/katacoda/command-tee-cn/index.json | 33 -- tutorials/katacoda/command-tee-cn/intro.md | 23 -- tutorials/katacoda/command-tee-cn/tee.md | 44 --- .../katacoda/command-tee-en/arthas-boot.md | 15 - .../katacoda/command-tee-en/arthas-demo.md | 11 - tutorials/katacoda/command-tee-en/finish.md | 7 - tutorials/katacoda/command-tee-en/index.json | 33 -- tutorials/katacoda/command-tee-en/intro.md | 39 -- tutorials/katacoda/command-tee-en/tee.md | 44 --- .../command-thread-cn/CPU-ratios-calculate.md | 15 - .../katacoda/command-thread-cn/arthas-boot.md | 16 - .../katacoda/command-thread-cn/arthas-demo.md | 10 - .../katacoda/command-thread-cn/finish.md | 11 - .../katacoda/command-thread-cn/index.json | 43 --- tutorials/katacoda/command-thread-cn/intro.md | 23 -- .../command-thread-cn/thread-usage.md | 180 ---------- .../katacoda/command-thread-cn/thread.md | 12 - .../command-thread-en/CPU-ratios-calculate.md | 15 - .../katacoda/command-thread-en/arthas-boot.md | 16 - .../katacoda/command-thread-en/arthas-demo.md | 11 - .../katacoda/command-thread-en/finish.md | 7 - .../katacoda/command-thread-en/index.json | 43 --- tutorials/katacoda/command-thread-en/intro.md | 39 -- .../command-thread-en/thread-usage.md | 179 --------- .../katacoda/command-thread-en/thread.md | 15 - .../katacoda/command-trace-cn/arthas-boot.md | 16 - .../katacoda/command-trace-cn/arthas-demo.md | 10 - tutorials/katacoda/command-trace-cn/finish.md | 11 - .../katacoda/command-trace-cn/index.json | 35 -- tutorials/katacoda/command-trace-cn/intro.md | 23 -- tutorials/katacoda/command-trace-cn/trace.md | 210 ----------- .../katacoda/command-trace-en/arthas-boot.md | 16 - .../katacoda/command-trace-en/arthas-demo.md | 11 - tutorials/katacoda/command-trace-en/finish.md | 7 - .../katacoda/command-trace-en/index.json | 35 -- tutorials/katacoda/command-trace-en/intro.md | 39 -- tutorials/katacoda/command-trace-en/trace.md | 206 ----------- .../katacoda/command-tt-cn/arthas-boot.md | 16 - .../katacoda/command-tt-cn/arthas-demo.md | 10 - tutorials/katacoda/command-tt-cn/finish.md | 11 - tutorials/katacoda/command-tt-cn/index.json | 35 -- tutorials/katacoda/command-tt-cn/intro.md | 23 -- tutorials/katacoda/command-tt-cn/tt.md | 191 ---------- .../katacoda/command-tt-en/arthas-boot.md | 16 - .../katacoda/command-tt-en/arthas-demo.md | 11 - tutorials/katacoda/command-tt-en/finish.md | 7 - tutorials/katacoda/command-tt-en/index.json | 35 -- tutorials/katacoda/command-tt-en/intro.md | 39 -- tutorials/katacoda/command-tt-en/tt.md | 165 --------- .../command-version-cn/arthas-boot.md | 16 - .../command-version-cn/arthas-demo.md | 10 - .../katacoda/command-version-cn/finish.md | 11 - .../katacoda/command-version-cn/index.json | 33 -- .../katacoda/command-version-cn/intro.md | 23 -- .../katacoda/command-version-cn/version.md | 4 - .../command-version-en/arthas-boot.md | 15 - .../command-version-en/arthas-demo.md | 11 - .../katacoda/command-version-en/finish.md | 7 - .../katacoda/command-version-en/index.json | 33 -- .../katacoda/command-version-en/intro.md | 39 -- .../katacoda/command-version-en/version.md | 4 - .../command-vmoption-cn/arthas-boot.md | 16 - .../command-vmoption-cn/arthas-demo.md | 16 - .../katacoda/command-vmoption-cn/finish.md | 11 - .../katacoda/command-vmoption-cn/index.json | 35 -- .../katacoda/command-vmoption-cn/intro.md | 23 -- .../katacoda/command-vmoption-cn/vmoption.md | 113 ------ .../command-vmoption-en/arthas-boot.md | 16 - .../command-vmoption-en/arthas-demo.md | 17 - .../katacoda/command-vmoption-en/finish.md | 7 - .../katacoda/command-vmoption-en/index.json | 35 -- .../katacoda/command-vmoption-en/intro.md | 39 -- .../katacoda/command-vmoption-en/vmoption.md | 112 ------ .../katacoda/command-vmtool-cn/arthas-boot.md | 16 - .../katacoda/command-vmtool-cn/finish.md | 11 - .../katacoda/command-vmtool-cn/index.json | 57 --- tutorials/katacoda/command-vmtool-cn/intro.md | 12 - .../katacoda/command-vmtool-cn/start-demo.md | 14 - .../command-vmtool-cn/vmtool-classloader.md | 31 -- .../katacoda/command-vmtool-cn/vmtool-gc.md | 7 - .../command-vmtool-cn/vmtool-spring.md | 61 ---- .../katacoda/command-vmtool-cn/vmtool.md | 37 -- .../katacoda/command-vmtool-en/arthas-boot.md | 16 - .../katacoda/command-vmtool-en/finish.md | 7 - .../katacoda/command-vmtool-en/index.json | 57 --- tutorials/katacoda/command-vmtool-en/intro.md | 12 - .../katacoda/command-vmtool-en/start-demo.md | 14 - .../command-vmtool-en/vmtool-classloader.md | 25 -- .../katacoda/command-vmtool-en/vmtool-gc.md | 4 - .../command-vmtool-en/vmtool-spring.md | 57 --- .../katacoda/command-vmtool-en/vmtool.md | 37 -- .../katacoda/command-watch-cn/arthas-boot.md | 16 - .../katacoda/command-watch-cn/arthas-demo.md | 10 - tutorials/katacoda/command-watch-cn/finish.md | 11 - .../katacoda/command-watch-cn/index.json | 35 -- tutorials/katacoda/command-watch-cn/intro.md | 23 -- tutorials/katacoda/command-watch-cn/watch.md | 309 ---------------- .../katacoda/command-watch-en/arthas-boot.md | 16 - .../katacoda/command-watch-en/arthas-demo.md | 11 - tutorials/katacoda/command-watch-en/finish.md | 7 - .../katacoda/command-watch-en/index.json | 35 -- tutorials/katacoda/command-watch-en/intro.md | 39 -- tutorials/katacoda/command-watch-en/watch.md | 304 ---------------- .../katacoda/command-wc-cn/arthas-boot.md | 16 - .../katacoda/command-wc-cn/arthas-demo.md | 10 - tutorials/katacoda/command-wc-cn/finish.md | 11 - tutorials/katacoda/command-wc-cn/index.json | 35 -- tutorials/katacoda/command-wc-cn/intro.md | 23 -- tutorials/katacoda/command-wc-cn/wc.md | 32 -- .../katacoda/command-wc-en/arthas-boot.md | 16 - .../katacoda/command-wc-en/arthas-demo.md | 11 - tutorials/katacoda/command-wc-en/finish.md | 7 - tutorials/katacoda/command-wc-en/index.json | 35 -- tutorials/katacoda/command-wc-en/intro.md | 39 -- tutorials/katacoda/command-wc-en/wc.md | 32 -- .../common-resources/assets/arthas-boot.png | Bin 38843 -> 0 bytes .../common-resources/assets/demo-web.png | Bin 24593 -> 0 bytes .../assets/qrcode_gongzhonghao.jpg | Bin 40069 -> 0 bytes .../common-resources/assets/web-console.png | Bin 50070 -> 0 bytes tutorials/katacoda/common-resources/finish.md | 9 - tutorials/katacoda/common-resources/hello.md | 3 - .../katacoda/common-resources/index.json | 25 -- tutorials/katacoda/common-resources/intro.md | 8 - .../all/share/component/Console.vue | 8 +- .../all/ui/ui/src/components/NavHeader.vue | 2 +- 996 files changed, 511 insertions(+), 27443 deletions(-) rename bin/{as.sh => as3.sh} (93%) mode change 100755 => 100644 rename bin/{install-local.sh => install-local3.sh} (96%) rename bin/{install.sh => install3.sh} (82%) delete mode 100644 katacoda.yaml delete mode 100644 tutorials/katacoda/README.md delete mode 100644 tutorials/katacoda/README_CN.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/arthas-boot-details.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-classloader.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-get-spring-context.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-http-401.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-http-404.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-thread.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/case-watch-method-exception.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/exit.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/finish.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/index.json delete mode 100644 tutorials/katacoda/arthas-advanced-cn/intro.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/jad.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/jvm-info.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/ognl.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/options.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/sc-sm.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/start-demo.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/tips.md delete mode 100644 tutorials/katacoda/arthas-advanced-cn/web-console.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/arthas-boot-details.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/arthas-boot.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-classloader.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-get-spring-context.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-http-401.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-http-404.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-thread.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/case-watch-method-exception.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/exit.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/finish.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/index.json delete mode 100644 tutorials/katacoda/arthas-advanced-en/intro.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/jad.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/jvm-info.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/ognl.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/options.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/sc-sm.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/start-demo.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/tips.md delete mode 100644 tutorials/katacoda/arthas-advanced-en/web-console.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/dashboard.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/exit.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/finish.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/index.json delete mode 100644 tutorials/katacoda/arthas-basics-cn/intro.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/jad.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/sc.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/thread.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/vmtool.md delete mode 100644 tutorials/katacoda/arthas-basics-cn/watch.md delete mode 100644 tutorials/katacoda/arthas-basics-en/arthas-boot.md delete mode 100644 tutorials/katacoda/arthas-basics-en/arthas-demo.md delete mode 100644 tutorials/katacoda/arthas-basics-en/dashboard.md delete mode 100644 tutorials/katacoda/arthas-basics-en/exit.md delete mode 100644 tutorials/katacoda/arthas-basics-en/finish.md delete mode 100644 tutorials/katacoda/arthas-basics-en/index.json delete mode 100644 tutorials/katacoda/arthas-basics-en/intro.md delete mode 100644 tutorials/katacoda/arthas-basics-en/jad.md delete mode 100644 tutorials/katacoda/arthas-basics-en/sc.md delete mode 100644 tutorials/katacoda/arthas-basics-en/thread.md delete mode 100644 tutorials/katacoda/arthas-basics-en/vmtool.md delete mode 100644 tutorials/katacoda/arthas-basics-en/watch.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/async-jobs.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/finish.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/index.json delete mode 100644 tutorials/katacoda/case-async-jobs-cn/intro.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/list-backgd-jobs.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/others.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/redirect-output.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/run-cmd-in-backgd.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/stop-job.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/suspend-cancel-job.md delete mode 100644 tutorials/katacoda/case-async-jobs-cn/switch-foregd-backgd.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/async-jobs.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/finish.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/index.json delete mode 100644 tutorials/katacoda/case-async-jobs-en/intro.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/list-backgd-jobs.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/others.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/redirect-output.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/run-cmd-in-backgd.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/stop-job.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/suspend-cancel-job.md delete mode 100644 tutorials/katacoda/case-async-jobs-en/switch-foregd-backgd.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/arthas-boot-details.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/boot-examples.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/finish.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/index.json delete mode 100644 tutorials/katacoda/case-boot-details-cn/intro.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-boot-details-cn/use-as-sh.md delete mode 100644 tutorials/katacoda/case-boot-details-en/arthas-boot-details.md delete mode 100644 tutorials/katacoda/case-boot-details-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-boot-details-en/boot-examples.md delete mode 100644 tutorials/katacoda/case-boot-details-en/finish.md delete mode 100644 tutorials/katacoda/case-boot-details-en/index.json delete mode 100644 tutorials/katacoda/case-boot-details-en/intro.md delete mode 100644 tutorials/katacoda/case-boot-details-en/use-as-sh.md delete mode 100644 tutorials/katacoda/case-classloader-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-classloader-cn/case-classloader.md delete mode 100644 tutorials/katacoda/case-classloader-cn/finish.md delete mode 100644 tutorials/katacoda/case-classloader-cn/index.json delete mode 100644 tutorials/katacoda/case-classloader-cn/intro.md delete mode 100644 tutorials/katacoda/case-classloader-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-classloader-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-classloader-en/case-classloader.md delete mode 100644 tutorials/katacoda/case-classloader-en/finish.md delete mode 100644 tutorials/katacoda/case-classloader-en/index.json delete mode 100644 tutorials/katacoda/case-classloader-en/intro.md delete mode 100644 tutorials/katacoda/case-classloader-en/start-demo.md delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/case-get-spring-context.md delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/finish.md delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/index.json delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/intro.md delete mode 100644 tutorials/katacoda/case-get-spring-context-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-get-spring-context-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-get-spring-context-en/case-get-spring-context.md delete mode 100644 tutorials/katacoda/case-get-spring-context-en/finish.md delete mode 100644 tutorials/katacoda/case-get-spring-context-en/index.json delete mode 100644 tutorials/katacoda/case-get-spring-context-en/intro.md delete mode 100644 tutorials/katacoda/case-get-spring-context-en/start-demo.md delete mode 100644 tutorials/katacoda/case-http-401-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-401-cn/case-http-401.md delete mode 100644 tutorials/katacoda/case-http-401-cn/finish.md delete mode 100644 tutorials/katacoda/case-http-401-cn/index.json delete mode 100644 tutorials/katacoda/case-http-401-cn/intro.md delete mode 100644 tutorials/katacoda/case-http-401-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-http-401-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-401-en/case-http-401.md delete mode 100644 tutorials/katacoda/case-http-401-en/case-watch-method-exception.md delete mode 100644 tutorials/katacoda/case-http-401-en/finish.md delete mode 100644 tutorials/katacoda/case-http-401-en/index.json delete mode 100644 tutorials/katacoda/case-http-401-en/intro.md delete mode 100644 tutorials/katacoda/case-http-401-en/start-demo.md delete mode 100644 tutorials/katacoda/case-http-404-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-404-cn/case-http-404.md delete mode 100644 tutorials/katacoda/case-http-404-cn/finish.md delete mode 100644 tutorials/katacoda/case-http-404-cn/index.json delete mode 100644 tutorials/katacoda/case-http-404-cn/intro.md delete mode 100644 tutorials/katacoda/case-http-404-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-http-404-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-404-en/case-http-404.md delete mode 100644 tutorials/katacoda/case-http-404-en/finish.md delete mode 100644 tutorials/katacoda/case-http-404-en/index.json delete mode 100644 tutorials/katacoda/case-http-404-en/intro.md delete mode 100644 tutorials/katacoda/case-http-404-en/start-demo.md delete mode 100644 tutorials/katacoda/case-http-api-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-api-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-http-api-cn/classpath-java-app.md delete mode 100644 tutorials/katacoda/case-http-api-cn/finish.md delete mode 100644 tutorials/katacoda/case-http-api-cn/http-api.md delete mode 100644 tutorials/katacoda/case-http-api-cn/index.json delete mode 100644 tutorials/katacoda/case-http-api-cn/intro.md delete mode 100644 tutorials/katacoda/case-http-api-cn/one-time-command.md delete mode 100644 tutorials/katacoda/case-http-api-cn/session-interaction.md delete mode 100644 tutorials/katacoda/case-http-api-cn/watch-output-map.md delete mode 100644 tutorials/katacoda/case-http-api-cn/web-ui.md delete mode 100644 tutorials/katacoda/case-http-api-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-http-api-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-http-api-en/classpath-java-app.md delete mode 100644 tutorials/katacoda/case-http-api-en/finish.md delete mode 100644 tutorials/katacoda/case-http-api-en/http-api.md delete mode 100644 tutorials/katacoda/case-http-api-en/index.json delete mode 100644 tutorials/katacoda/case-http-api-en/intro.md delete mode 100644 tutorials/katacoda/case-http-api-en/one-time-command.md delete mode 100644 tutorials/katacoda/case-http-api-en/session-interaction.md delete mode 100644 tutorials/katacoda/case-http-api-en/watch-output-map.md delete mode 100644 tutorials/katacoda/case-http-api-en/web-ui.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/finish.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/index.json delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/intro.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/finish.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/index.json delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/intro.md delete mode 100644 tutorials/katacoda/case-jad-mc-redefine-en/start-demo.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/finish.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/index.json delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/intro.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/finish.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/index.json delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/intro.md delete mode 100644 tutorials/katacoda/case-logger-config-problem-en/start-demo.md delete mode 100644 tutorials/katacoda/case-ognl-practise-cn/finish.md delete mode 100644 tutorials/katacoda/case-ognl-practise-cn/index.json delete mode 100644 tutorials/katacoda/case-ognl-practise-cn/intro.md delete mode 100644 tutorials/katacoda/case-ognl-practise-cn/setup.sh delete mode 100644 tutorials/katacoda/case-ognl-practise-cn/step1.md delete mode 100644 tutorials/katacoda/case-ognl-practise-en/finish.md delete mode 100644 tutorials/katacoda/case-ognl-practise-en/index.json delete mode 100644 tutorials/katacoda/case-ognl-practise-en/intro.md delete mode 100644 tutorials/katacoda/case-ognl-practise-en/setup.sh delete mode 100644 tutorials/katacoda/case-ognl-practise-en/step1.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/finish.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/index.json delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/intro.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/finish.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/index.json delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/intro.md delete mode 100644 tutorials/katacoda/case-ognl-update-logger-level-en/start-demo.md delete mode 100644 tutorials/katacoda/case-save-log-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-save-log-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-save-log-cn/finish.md delete mode 100644 tutorials/katacoda/case-save-log-cn/index.json delete mode 100644 tutorials/katacoda/case-save-log-cn/intro.md delete mode 100644 tutorials/katacoda/case-save-log-cn/save-log.md delete mode 100644 tutorials/katacoda/case-save-log-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-save-log-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-save-log-en/finish.md delete mode 100644 tutorials/katacoda/case-save-log-en/index.json delete mode 100644 tutorials/katacoda/case-save-log-en/intro.md delete mode 100644 tutorials/katacoda/case-save-log-en/save-log.md delete mode 100644 tutorials/katacoda/case-thread-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-thread-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-thread-cn/case-thread.md delete mode 100644 tutorials/katacoda/case-thread-cn/finish.md delete mode 100644 tutorials/katacoda/case-thread-cn/index.json delete mode 100644 tutorials/katacoda/case-thread-cn/intro.md delete mode 100644 tutorials/katacoda/case-thread-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-thread-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-thread-en/case-thread.md delete mode 100644 tutorials/katacoda/case-thread-en/finish.md delete mode 100644 tutorials/katacoda/case-thread-en/index.json delete mode 100644 tutorials/katacoda/case-thread-en/intro.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/case-watch-method-exception.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/finish.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/index.json delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/intro.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-cn/start-demo.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/case-watch-method-exception.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/finish.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/index.json delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/intro.md delete mode 100644 tutorials/katacoda/case-watch-method-exception-en/start-demo.md delete mode 100644 tutorials/katacoda/case-web-console-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/case-web-console-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/case-web-console-cn/finish.md delete mode 100644 tutorials/katacoda/case-web-console-cn/index.json delete mode 100644 tutorials/katacoda/case-web-console-cn/intro.md delete mode 100644 tutorials/katacoda/case-web-console-cn/web-console.md delete mode 100644 tutorials/katacoda/case-web-console-en/arthas-boot.md delete mode 100644 tutorials/katacoda/case-web-console-en/arthas-demo.md delete mode 100644 tutorials/katacoda/case-web-console-en/finish.md delete mode 100644 tutorials/katacoda/case-web-console-en/index.json delete mode 100644 tutorials/katacoda/case-web-console-en/intro.md delete mode 100644 tutorials/katacoda/case-web-console-en/web-console.md delete mode 100644 tutorials/katacoda/command-cat-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-cat-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-cat-cn/cat.md delete mode 100644 tutorials/katacoda/command-cat-cn/finish.md delete mode 100644 tutorials/katacoda/command-cat-cn/index.json delete mode 100644 tutorials/katacoda/command-cat-cn/intro.md delete mode 100644 tutorials/katacoda/command-cat-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-cat-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-cat-en/cat.md delete mode 100644 tutorials/katacoda/command-cat-en/finish.md delete mode 100644 tutorials/katacoda/command-cat-en/index.json delete mode 100644 tutorials/katacoda/command-cat-en/intro.md delete mode 100644 tutorials/katacoda/command-classloader-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-classloader-cn/classloader.md delete mode 100644 tutorials/katacoda/command-classloader-cn/finish.md delete mode 100644 tutorials/katacoda/command-classloader-cn/index.json delete mode 100644 tutorials/katacoda/command-classloader-cn/intro.md delete mode 100644 tutorials/katacoda/command-classloader-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-classloader-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-classloader-en/classloader.md delete mode 100644 tutorials/katacoda/command-classloader-en/finish.md delete mode 100644 tutorials/katacoda/command-classloader-en/index.json delete mode 100644 tutorials/katacoda/command-classloader-en/intro.md delete mode 100644 tutorials/katacoda/command-classloader-en/start-demo.md delete mode 100644 tutorials/katacoda/command-cls-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-cls-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-cls-cn/cls.md delete mode 100644 tutorials/katacoda/command-cls-cn/finish.md delete mode 100644 tutorials/katacoda/command-cls-cn/index.json delete mode 100644 tutorials/katacoda/command-cls-cn/intro.md delete mode 100644 tutorials/katacoda/command-cls-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-cls-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-cls-en/cls.md delete mode 100644 tutorials/katacoda/command-cls-en/finish.md delete mode 100644 tutorials/katacoda/command-cls-en/index.json delete mode 100644 tutorials/katacoda/command-cls-en/intro.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/dashboard.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/finish.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/index.json delete mode 100644 tutorials/katacoda/command-dashboard-cn/intro.md delete mode 100644 tutorials/katacoda/command-dashboard-cn/notes-on-column-headers.md delete mode 100644 tutorials/katacoda/command-dashboard-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-dashboard-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-dashboard-en/dashboard.md delete mode 100644 tutorials/katacoda/command-dashboard-en/finish.md delete mode 100644 tutorials/katacoda/command-dashboard-en/index.json delete mode 100644 tutorials/katacoda/command-dashboard-en/intro.md delete mode 100644 tutorials/katacoda/command-dashboard-en/notes-on-column-headers.md delete mode 100644 tutorials/katacoda/command-dump-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-dump-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-dump-cn/dump.md delete mode 100644 tutorials/katacoda/command-dump-cn/finish.md delete mode 100644 tutorials/katacoda/command-dump-cn/index.json delete mode 100644 tutorials/katacoda/command-dump-cn/intro.md delete mode 100644 tutorials/katacoda/command-dump-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-dump-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-dump-en/dump.md delete mode 100644 tutorials/katacoda/command-dump-en/finish.md delete mode 100644 tutorials/katacoda/command-dump-en/index.json delete mode 100644 tutorials/katacoda/command-dump-en/intro.md delete mode 100644 tutorials/katacoda/command-echo-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-echo-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-echo-cn/echo.md delete mode 100644 tutorials/katacoda/command-echo-cn/finish.md delete mode 100644 tutorials/katacoda/command-echo-cn/index.json delete mode 100644 tutorials/katacoda/command-echo-cn/intro.md delete mode 100644 tutorials/katacoda/command-echo-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-echo-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-echo-en/echo.md delete mode 100644 tutorials/katacoda/command-echo-en/finish.md delete mode 100644 tutorials/katacoda/command-echo-en/index.json delete mode 100644 tutorials/katacoda/command-echo-en/intro.md delete mode 100644 tutorials/katacoda/command-getstatic-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-getstatic-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-getstatic-cn/finish.md delete mode 100644 tutorials/katacoda/command-getstatic-cn/getstatic.md delete mode 100644 tutorials/katacoda/command-getstatic-cn/index.json delete mode 100644 tutorials/katacoda/command-getstatic-cn/intro.md delete mode 100644 tutorials/katacoda/command-getstatic-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-getstatic-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-getstatic-en/finish.md delete mode 100644 tutorials/katacoda/command-getstatic-en/getstatic.md delete mode 100644 tutorials/katacoda/command-getstatic-en/index.json delete mode 100644 tutorials/katacoda/command-getstatic-en/intro.md delete mode 100644 tutorials/katacoda/command-grep-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-grep-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-grep-cn/finish.md delete mode 100644 tutorials/katacoda/command-grep-cn/grep.md delete mode 100644 tutorials/katacoda/command-grep-cn/index.json delete mode 100644 tutorials/katacoda/command-grep-cn/intro.md delete mode 100644 tutorials/katacoda/command-grep-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-grep-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-grep-en/finish.md delete mode 100644 tutorials/katacoda/command-grep-en/grep.md delete mode 100644 tutorials/katacoda/command-grep-en/index.json delete mode 100644 tutorials/katacoda/command-grep-en/intro.md delete mode 100644 tutorials/katacoda/command-heapdump-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-heapdump-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-heapdump-cn/finish.md delete mode 100644 tutorials/katacoda/command-heapdump-cn/heapdump.md delete mode 100644 tutorials/katacoda/command-heapdump-cn/index.json delete mode 100644 tutorials/katacoda/command-heapdump-cn/intro.md delete mode 100644 tutorials/katacoda/command-heapdump-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-heapdump-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-heapdump-en/finish.md delete mode 100644 tutorials/katacoda/command-heapdump-en/heapdump.md delete mode 100644 tutorials/katacoda/command-heapdump-en/index.json delete mode 100644 tutorials/katacoda/command-heapdump-en/intro.md delete mode 100644 tutorials/katacoda/command-help-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-help-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-help-cn/finish.md delete mode 100644 tutorials/katacoda/command-help-cn/help-sysprop.md delete mode 100644 tutorials/katacoda/command-help-cn/help.md delete mode 100644 tutorials/katacoda/command-help-cn/index.json delete mode 100644 tutorials/katacoda/command-help-cn/intro.md delete mode 100644 tutorials/katacoda/command-help-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-help-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-help-en/finish.md delete mode 100644 tutorials/katacoda/command-help-en/help-sysprop.md delete mode 100644 tutorials/katacoda/command-help-en/help.md delete mode 100644 tutorials/katacoda/command-help-en/index.json delete mode 100644 tutorials/katacoda/command-help-en/intro.md delete mode 100644 tutorials/katacoda/command-history-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-history-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-history-cn/finish.md delete mode 100644 tutorials/katacoda/command-history-cn/history.md delete mode 100644 tutorials/katacoda/command-history-cn/index.json delete mode 100644 tutorials/katacoda/command-history-cn/intro.md delete mode 100644 tutorials/katacoda/command-history-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-history-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-history-en/finish.md delete mode 100644 tutorials/katacoda/command-history-en/history.md delete mode 100644 tutorials/katacoda/command-history-en/index.json delete mode 100644 tutorials/katacoda/command-history-en/intro.md delete mode 100644 tutorials/katacoda/command-jad-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jad-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jad-cn/finish.md delete mode 100644 tutorials/katacoda/command-jad-cn/index.json delete mode 100644 tutorials/katacoda/command-jad-cn/intro.md delete mode 100644 tutorials/katacoda/command-jad-cn/jad.md delete mode 100644 tutorials/katacoda/command-jad-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jad-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jad-en/finish.md delete mode 100644 tutorials/katacoda/command-jad-en/index.json delete mode 100644 tutorials/katacoda/command-jad-en/intro.md delete mode 100644 tutorials/katacoda/command-jad-en/jad.md delete mode 100644 tutorials/katacoda/command-jfr-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jfr-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jfr-cn/finish.md delete mode 100644 tutorials/katacoda/command-jfr-cn/index.json delete mode 100644 tutorials/katacoda/command-jfr-cn/intro.md delete mode 100644 tutorials/katacoda/command-jfr-cn/jfr.md delete mode 100644 tutorials/katacoda/command-jfr-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jfr-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jfr-en/finish.md delete mode 100644 tutorials/katacoda/command-jfr-en/index.json delete mode 100644 tutorials/katacoda/command-jfr-en/intro.md delete mode 100644 tutorials/katacoda/command-jfr-en/jfr.md delete mode 100644 tutorials/katacoda/command-jvm-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jvm-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jvm-cn/finish.md delete mode 100644 tutorials/katacoda/command-jvm-cn/index.json delete mode 100644 tutorials/katacoda/command-jvm-cn/intro.md delete mode 100644 tutorials/katacoda/command-jvm-cn/jvm-usage.md delete mode 100644 tutorials/katacoda/command-jvm-cn/jvm.md delete mode 100644 tutorials/katacoda/command-jvm-cn/notes-on-column-headers.md delete mode 100644 tutorials/katacoda/command-jvm-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-jvm-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-jvm-en/finish.md delete mode 100644 tutorials/katacoda/command-jvm-en/index.json delete mode 100644 tutorials/katacoda/command-jvm-en/intro.md delete mode 100644 tutorials/katacoda/command-jvm-en/jvm-usage.md delete mode 100644 tutorials/katacoda/command-jvm-en/jvm.md delete mode 100644 tutorials/katacoda/command-jvm-en/notes-on-column-headers.md delete mode 100644 tutorials/katacoda/command-keymap-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-keymap-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-keymap-cn/custom-shortcuts.md delete mode 100644 tutorials/katacoda/command-keymap-cn/default-keymap.md delete mode 100644 tutorials/katacoda/command-keymap-cn/finish.md delete mode 100644 tutorials/katacoda/command-keymap-cn/index.json delete mode 100644 tutorials/katacoda/command-keymap-cn/intro.md delete mode 100644 tutorials/katacoda/command-keymap-cn/keymap.md delete mode 100644 tutorials/katacoda/command-keymap-cn/shortcuts-for-jobs.md delete mode 100644 tutorials/katacoda/command-keymap-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-keymap-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-keymap-en/custom-shortcuts.md delete mode 100644 tutorials/katacoda/command-keymap-en/default-keymap.md delete mode 100644 tutorials/katacoda/command-keymap-en/finish.md delete mode 100644 tutorials/katacoda/command-keymap-en/index.json delete mode 100644 tutorials/katacoda/command-keymap-en/intro.md delete mode 100644 tutorials/katacoda/command-keymap-en/keymap.md delete mode 100644 tutorials/katacoda/command-keymap-en/shortcuts-for-jobs.md delete mode 100644 tutorials/katacoda/command-logger-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-logger-cn/finish.md delete mode 100644 tutorials/katacoda/command-logger-cn/index.json delete mode 100644 tutorials/katacoda/command-logger-cn/intro.md delete mode 100644 tutorials/katacoda/command-logger-cn/logger.md delete mode 100644 tutorials/katacoda/command-logger-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-logger-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-logger-en/finish.md delete mode 100644 tutorials/katacoda/command-logger-en/index.json delete mode 100644 tutorials/katacoda/command-logger-en/intro.md delete mode 100644 tutorials/katacoda/command-logger-en/logger.md delete mode 100644 tutorials/katacoda/command-logger-en/start-demo.md delete mode 100644 tutorials/katacoda/command-mbean-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mbean-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-mbean-cn/finish.md delete mode 100644 tutorials/katacoda/command-mbean-cn/index.json delete mode 100644 tutorials/katacoda/command-mbean-cn/intro.md delete mode 100644 tutorials/katacoda/command-mbean-cn/mbean.md delete mode 100644 tutorials/katacoda/command-mbean-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mbean-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-mbean-en/finish.md delete mode 100644 tutorials/katacoda/command-mbean-en/index.json delete mode 100644 tutorials/katacoda/command-mbean-en/intro.md delete mode 100644 tutorials/katacoda/command-mbean-en/mbean.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/finish.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/index.json delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/intro.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/mc.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/redefine.md delete mode 100644 tutorials/katacoda/command-mc-redefine-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/case-jad-mc-redefine.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/finish.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/index.json delete mode 100644 tutorials/katacoda/command-mc-redefine-en/intro.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/mc.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/redefine.md delete mode 100644 tutorials/katacoda/command-mc-redefine-en/start-demo.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/case-jad-mc-retransform.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/finish.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/index.json delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/intro.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/mc.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/retransform-more.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/retransform.md delete mode 100644 tutorials/katacoda/command-mc-retransform-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/case-jad-mc-retransform.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/finish.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/index.json delete mode 100644 tutorials/katacoda/command-mc-retransform-en/intro.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/mc.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/retransform-more.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/retransform.md delete mode 100644 tutorials/katacoda/command-mc-retransform-en/start-demo.md delete mode 100644 tutorials/katacoda/command-monitor-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-monitor-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-monitor-cn/finish.md delete mode 100644 tutorials/katacoda/command-monitor-cn/index.json delete mode 100644 tutorials/katacoda/command-monitor-cn/intro.md delete mode 100644 tutorials/katacoda/command-monitor-cn/monitor.md delete mode 100644 tutorials/katacoda/command-monitor-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-monitor-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-monitor-en/finish.md delete mode 100644 tutorials/katacoda/command-monitor-en/index.json delete mode 100644 tutorials/katacoda/command-monitor-en/intro.md delete mode 100644 tutorials/katacoda/command-monitor-en/monitor.md delete mode 100644 tutorials/katacoda/command-ognl-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-ognl-cn/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/command-ognl-cn/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/command-ognl-cn/finish.md delete mode 100644 tutorials/katacoda/command-ognl-cn/index.json delete mode 100644 tutorials/katacoda/command-ognl-cn/intro.md delete mode 100644 tutorials/katacoda/command-ognl-cn/ognl.md delete mode 100644 tutorials/katacoda/command-ognl-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-ognl-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-ognl-en/case-logger-config-problem.md delete mode 100644 tutorials/katacoda/command-ognl-en/case-ognl-update-logger-level.md delete mode 100644 tutorials/katacoda/command-ognl-en/finish.md delete mode 100644 tutorials/katacoda/command-ognl-en/index.json delete mode 100644 tutorials/katacoda/command-ognl-en/intro.md delete mode 100644 tutorials/katacoda/command-ognl-en/ognl.md delete mode 100644 tutorials/katacoda/command-ognl-en/start-demo.md delete mode 100644 tutorials/katacoda/command-options-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-options-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-options-cn/finish.md delete mode 100644 tutorials/katacoda/command-options-cn/index.json delete mode 100644 tutorials/katacoda/command-options-cn/intro.md delete mode 100644 tutorials/katacoda/command-options-cn/options.md delete mode 100644 tutorials/katacoda/command-options-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-options-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-options-en/finish.md delete mode 100644 tutorials/katacoda/command-options-en/index.json delete mode 100644 tutorials/katacoda/command-options-en/intro.md delete mode 100644 tutorials/katacoda/command-options-en/options.md delete mode 100644 tutorials/katacoda/command-perfcounter-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-perfcounter-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-perfcounter-cn/finish.md delete mode 100644 tutorials/katacoda/command-perfcounter-cn/index.json delete mode 100644 tutorials/katacoda/command-perfcounter-cn/intro.md delete mode 100644 tutorials/katacoda/command-perfcounter-cn/perfcounter.md delete mode 100644 tutorials/katacoda/command-perfcounter-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-perfcounter-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-perfcounter-en/finish.md delete mode 100644 tutorials/katacoda/command-perfcounter-en/index.json delete mode 100644 tutorials/katacoda/command-perfcounter-en/intro.md delete mode 100644 tutorials/katacoda/command-perfcounter-en/perfcounter.md delete mode 100644 tutorials/katacoda/command-plaintext-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-plaintext-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-plaintext-cn/finish.md delete mode 100644 tutorials/katacoda/command-plaintext-cn/index.json delete mode 100644 tutorials/katacoda/command-plaintext-cn/intro.md delete mode 100644 tutorials/katacoda/command-plaintext-cn/plaintext.md delete mode 100644 tutorials/katacoda/command-plaintext-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-plaintext-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-plaintext-en/finish.md delete mode 100644 tutorials/katacoda/command-plaintext-en/index.json delete mode 100644 tutorials/katacoda/command-plaintext-en/intro.md delete mode 100644 tutorials/katacoda/command-plaintext-en/plaintext.md delete mode 100644 tutorials/katacoda/command-profiler-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-profiler-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-profiler-cn/finish.md delete mode 100644 tutorials/katacoda/command-profiler-cn/index.json delete mode 100644 tutorials/katacoda/command-profiler-cn/intro.md delete mode 100644 tutorials/katacoda/command-profiler-cn/profiler.md delete mode 100644 tutorials/katacoda/command-profiler-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-profiler-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-profiler-en/finish.md delete mode 100644 tutorials/katacoda/command-profiler-en/index.json delete mode 100644 tutorials/katacoda/command-profiler-en/intro.md delete mode 100644 tutorials/katacoda/command-profiler-en/profiler.md delete mode 100644 tutorials/katacoda/command-pwd-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-pwd-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-pwd-cn/finish.md delete mode 100644 tutorials/katacoda/command-pwd-cn/index.json delete mode 100644 tutorials/katacoda/command-pwd-cn/intro.md delete mode 100644 tutorials/katacoda/command-pwd-cn/pwd.md delete mode 100644 tutorials/katacoda/command-pwd-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-pwd-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-pwd-en/finish.md delete mode 100644 tutorials/katacoda/command-pwd-en/index.json delete mode 100644 tutorials/katacoda/command-pwd-en/intro.md delete mode 100644 tutorials/katacoda/command-pwd-en/pwd.md delete mode 100644 tutorials/katacoda/command-quit-stop-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-quit-stop-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-quit-stop-cn/finish.md delete mode 100644 tutorials/katacoda/command-quit-stop-cn/index.json delete mode 100644 tutorials/katacoda/command-quit-stop-cn/intro.md delete mode 100644 tutorials/katacoda/command-quit-stop-cn/quit-stop.md delete mode 100644 tutorials/katacoda/command-quit-stop-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-quit-stop-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-quit-stop-en/finish.md delete mode 100644 tutorials/katacoda/command-quit-stop-en/index.json delete mode 100644 tutorials/katacoda/command-quit-stop-en/intro.md delete mode 100644 tutorials/katacoda/command-quit-stop-en/quit-stop.md delete mode 100644 tutorials/katacoda/command-reset-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-reset-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-reset-cn/finish.md delete mode 100644 tutorials/katacoda/command-reset-cn/index.json delete mode 100644 tutorials/katacoda/command-reset-cn/intro.md delete mode 100644 tutorials/katacoda/command-reset-cn/reset-all-classes.md delete mode 100644 tutorials/katacoda/command-reset-cn/reset-specified-class.md delete mode 100644 tutorials/katacoda/command-reset-cn/reset-usage.md delete mode 100644 tutorials/katacoda/command-reset-cn/reset.md delete mode 100644 tutorials/katacoda/command-reset-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-reset-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-reset-en/finish.md delete mode 100644 tutorials/katacoda/command-reset-en/index.json delete mode 100644 tutorials/katacoda/command-reset-en/intro.md delete mode 100644 tutorials/katacoda/command-reset-en/reset-all-classes.md delete mode 100644 tutorials/katacoda/command-reset-en/reset-specified-class.md delete mode 100644 tutorials/katacoda/command-reset-en/reset-usage.md delete mode 100644 tutorials/katacoda/command-reset-en/reset.md delete mode 100644 tutorials/katacoda/command-sc-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sc-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sc-cn/finish.md delete mode 100644 tutorials/katacoda/command-sc-cn/index.json delete mode 100644 tutorials/katacoda/command-sc-cn/intro.md delete mode 100644 tutorials/katacoda/command-sc-cn/sc.md delete mode 100644 tutorials/katacoda/command-sc-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sc-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sc-en/finish.md delete mode 100644 tutorials/katacoda/command-sc-en/index.json delete mode 100644 tutorials/katacoda/command-sc-en/intro.md delete mode 100644 tutorials/katacoda/command-sc-en/sc.md delete mode 100644 tutorials/katacoda/command-session-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-session-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-session-cn/finish.md delete mode 100644 tutorials/katacoda/command-session-cn/index.json delete mode 100644 tutorials/katacoda/command-session-cn/intro.md delete mode 100644 tutorials/katacoda/command-session-cn/session.md delete mode 100644 tutorials/katacoda/command-session-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-session-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-session-en/finish.md delete mode 100644 tutorials/katacoda/command-session-en/index.json delete mode 100644 tutorials/katacoda/command-session-en/intro.md delete mode 100644 tutorials/katacoda/command-session-en/session.md delete mode 100644 tutorials/katacoda/command-sm-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sm-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sm-cn/finish.md delete mode 100644 tutorials/katacoda/command-sm-cn/index.json delete mode 100644 tutorials/katacoda/command-sm-cn/intro.md delete mode 100644 tutorials/katacoda/command-sm-cn/sm.md delete mode 100644 tutorials/katacoda/command-sm-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sm-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sm-en/finish.md delete mode 100644 tutorials/katacoda/command-sm-en/index.json delete mode 100644 tutorials/katacoda/command-sm-en/intro.md delete mode 100644 tutorials/katacoda/command-sm-en/sm.md delete mode 100644 tutorials/katacoda/command-stack-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-stack-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-stack-cn/finish.md delete mode 100644 tutorials/katacoda/command-stack-cn/index.json delete mode 100644 tutorials/katacoda/command-stack-cn/intro.md delete mode 100644 tutorials/katacoda/command-stack-cn/stack.md delete mode 100644 tutorials/katacoda/command-stack-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-stack-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-stack-en/finish.md delete mode 100644 tutorials/katacoda/command-stack-en/index.json delete mode 100644 tutorials/katacoda/command-stack-en/intro.md delete mode 100644 tutorials/katacoda/command-stack-en/stack.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/auto-completion.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/check-all-properties.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/check-one-single-property.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/completion-of-history-commands.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/finish.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/index.json delete mode 100644 tutorials/katacoda/command-sysenv-cn/intro.md delete mode 100644 tutorials/katacoda/command-sysenv-cn/sysenv.md delete mode 100644 tutorials/katacoda/command-sysenv-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sysenv-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sysenv-en/auto-completion.md delete mode 100644 tutorials/katacoda/command-sysenv-en/check-all-properties.md delete mode 100644 tutorials/katacoda/command-sysenv-en/check-one-single-property.md delete mode 100644 tutorials/katacoda/command-sysenv-en/completion-of-history-commands.md delete mode 100644 tutorials/katacoda/command-sysenv-en/finish.md delete mode 100644 tutorials/katacoda/command-sysenv-en/index.json delete mode 100644 tutorials/katacoda/command-sysenv-en/intro.md delete mode 100644 tutorials/katacoda/command-sysenv-en/sysenv.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/auto-completion.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/check-all-properties.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/check-one-single-property.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/completion-of-history-commands.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/finish.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/index.json delete mode 100644 tutorials/katacoda/command-sysprop-cn/intro.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/pipeline.md delete mode 100644 tutorials/katacoda/command-sysprop-cn/sysprop.md delete mode 100644 tutorials/katacoda/command-sysprop-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-sysprop-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-sysprop-en/auto-completion.md delete mode 100644 tutorials/katacoda/command-sysprop-en/check-all-properties.md delete mode 100644 tutorials/katacoda/command-sysprop-en/check-one-single-property.md delete mode 100644 tutorials/katacoda/command-sysprop-en/completion-of-history-commands.md delete mode 100644 tutorials/katacoda/command-sysprop-en/finish.md delete mode 100644 tutorials/katacoda/command-sysprop-en/index.json delete mode 100644 tutorials/katacoda/command-sysprop-en/intro.md delete mode 100644 tutorials/katacoda/command-sysprop-en/pipeline.md delete mode 100644 tutorials/katacoda/command-sysprop-en/sysprop.md delete mode 100644 tutorials/katacoda/command-tee-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-tee-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-tee-cn/finish.md delete mode 100644 tutorials/katacoda/command-tee-cn/index.json delete mode 100644 tutorials/katacoda/command-tee-cn/intro.md delete mode 100644 tutorials/katacoda/command-tee-cn/tee.md delete mode 100644 tutorials/katacoda/command-tee-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-tee-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-tee-en/finish.md delete mode 100644 tutorials/katacoda/command-tee-en/index.json delete mode 100644 tutorials/katacoda/command-tee-en/intro.md delete mode 100644 tutorials/katacoda/command-tee-en/tee.md delete mode 100644 tutorials/katacoda/command-thread-cn/CPU-ratios-calculate.md delete mode 100644 tutorials/katacoda/command-thread-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-thread-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-thread-cn/finish.md delete mode 100644 tutorials/katacoda/command-thread-cn/index.json delete mode 100644 tutorials/katacoda/command-thread-cn/intro.md delete mode 100644 tutorials/katacoda/command-thread-cn/thread-usage.md delete mode 100644 tutorials/katacoda/command-thread-cn/thread.md delete mode 100644 tutorials/katacoda/command-thread-en/CPU-ratios-calculate.md delete mode 100644 tutorials/katacoda/command-thread-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-thread-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-thread-en/finish.md delete mode 100644 tutorials/katacoda/command-thread-en/index.json delete mode 100644 tutorials/katacoda/command-thread-en/intro.md delete mode 100644 tutorials/katacoda/command-thread-en/thread-usage.md delete mode 100644 tutorials/katacoda/command-thread-en/thread.md delete mode 100644 tutorials/katacoda/command-trace-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-trace-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-trace-cn/finish.md delete mode 100644 tutorials/katacoda/command-trace-cn/index.json delete mode 100644 tutorials/katacoda/command-trace-cn/intro.md delete mode 100644 tutorials/katacoda/command-trace-cn/trace.md delete mode 100644 tutorials/katacoda/command-trace-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-trace-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-trace-en/finish.md delete mode 100644 tutorials/katacoda/command-trace-en/index.json delete mode 100644 tutorials/katacoda/command-trace-en/intro.md delete mode 100644 tutorials/katacoda/command-trace-en/trace.md delete mode 100644 tutorials/katacoda/command-tt-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-tt-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-tt-cn/finish.md delete mode 100644 tutorials/katacoda/command-tt-cn/index.json delete mode 100644 tutorials/katacoda/command-tt-cn/intro.md delete mode 100644 tutorials/katacoda/command-tt-cn/tt.md delete mode 100644 tutorials/katacoda/command-tt-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-tt-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-tt-en/finish.md delete mode 100644 tutorials/katacoda/command-tt-en/index.json delete mode 100644 tutorials/katacoda/command-tt-en/intro.md delete mode 100644 tutorials/katacoda/command-tt-en/tt.md delete mode 100644 tutorials/katacoda/command-version-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-version-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-version-cn/finish.md delete mode 100644 tutorials/katacoda/command-version-cn/index.json delete mode 100644 tutorials/katacoda/command-version-cn/intro.md delete mode 100644 tutorials/katacoda/command-version-cn/version.md delete mode 100644 tutorials/katacoda/command-version-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-version-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-version-en/finish.md delete mode 100644 tutorials/katacoda/command-version-en/index.json delete mode 100644 tutorials/katacoda/command-version-en/intro.md delete mode 100644 tutorials/katacoda/command-version-en/version.md delete mode 100644 tutorials/katacoda/command-vmoption-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-vmoption-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-vmoption-cn/finish.md delete mode 100644 tutorials/katacoda/command-vmoption-cn/index.json delete mode 100644 tutorials/katacoda/command-vmoption-cn/intro.md delete mode 100644 tutorials/katacoda/command-vmoption-cn/vmoption.md delete mode 100644 tutorials/katacoda/command-vmoption-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-vmoption-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-vmoption-en/finish.md delete mode 100644 tutorials/katacoda/command-vmoption-en/index.json delete mode 100644 tutorials/katacoda/command-vmoption-en/intro.md delete mode 100644 tutorials/katacoda/command-vmoption-en/vmoption.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/finish.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/index.json delete mode 100644 tutorials/katacoda/command-vmtool-cn/intro.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/start-demo.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/vmtool-classloader.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/vmtool-gc.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/vmtool-spring.md delete mode 100644 tutorials/katacoda/command-vmtool-cn/vmtool.md delete mode 100644 tutorials/katacoda/command-vmtool-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-vmtool-en/finish.md delete mode 100644 tutorials/katacoda/command-vmtool-en/index.json delete mode 100644 tutorials/katacoda/command-vmtool-en/intro.md delete mode 100644 tutorials/katacoda/command-vmtool-en/start-demo.md delete mode 100644 tutorials/katacoda/command-vmtool-en/vmtool-classloader.md delete mode 100644 tutorials/katacoda/command-vmtool-en/vmtool-gc.md delete mode 100644 tutorials/katacoda/command-vmtool-en/vmtool-spring.md delete mode 100644 tutorials/katacoda/command-vmtool-en/vmtool.md delete mode 100644 tutorials/katacoda/command-watch-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-watch-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-watch-cn/finish.md delete mode 100644 tutorials/katacoda/command-watch-cn/index.json delete mode 100644 tutorials/katacoda/command-watch-cn/intro.md delete mode 100644 tutorials/katacoda/command-watch-cn/watch.md delete mode 100644 tutorials/katacoda/command-watch-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-watch-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-watch-en/finish.md delete mode 100644 tutorials/katacoda/command-watch-en/index.json delete mode 100644 tutorials/katacoda/command-watch-en/intro.md delete mode 100644 tutorials/katacoda/command-watch-en/watch.md delete mode 100644 tutorials/katacoda/command-wc-cn/arthas-boot.md delete mode 100644 tutorials/katacoda/command-wc-cn/arthas-demo.md delete mode 100644 tutorials/katacoda/command-wc-cn/finish.md delete mode 100644 tutorials/katacoda/command-wc-cn/index.json delete mode 100644 tutorials/katacoda/command-wc-cn/intro.md delete mode 100644 tutorials/katacoda/command-wc-cn/wc.md delete mode 100644 tutorials/katacoda/command-wc-en/arthas-boot.md delete mode 100644 tutorials/katacoda/command-wc-en/arthas-demo.md delete mode 100644 tutorials/katacoda/command-wc-en/finish.md delete mode 100644 tutorials/katacoda/command-wc-en/index.json delete mode 100644 tutorials/katacoda/command-wc-en/intro.md delete mode 100644 tutorials/katacoda/command-wc-en/wc.md delete mode 100644 tutorials/katacoda/common-resources/assets/arthas-boot.png delete mode 100644 tutorials/katacoda/common-resources/assets/demo-web.png delete mode 100644 tutorials/katacoda/common-resources/assets/qrcode_gongzhonghao.jpg delete mode 100644 tutorials/katacoda/common-resources/assets/web-console.png delete mode 100644 tutorials/katacoda/common-resources/finish.md delete mode 100644 tutorials/katacoda/common-resources/hello.md delete mode 100644 tutorials/katacoda/common-resources/index.json delete mode 100644 tutorials/katacoda/common-resources/intro.md diff --git a/.github/ISSUE_TEMPLATE/bug-report--cn-.md b/.github/ISSUE_TEMPLATE/bug-report--cn-.md index 797ba11928b..a92a240db90 100644 --- a/.github/ISSUE_TEMPLATE/bug-report--cn-.md +++ b/.github/ISSUE_TEMPLATE/bug-report--cn-.md @@ -8,7 +8,7 @@ about: 提交Arthas Bug/使用疑问,使用这个模板 ### 环境信息 -* `arthas-boot.jar` 或者 `as.sh` 的版本: xxx +* `arthas-boot3.jar` 或者 `as3.sh` 的版本: xxx * Arthas 版本: xxx * 操作系统版本: xxx * 目标进程的JVM版本: xxx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cf2a7a8ea9a..20b4d28b37e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,23 +32,23 @@ Recommend to use [`as-package.sh`](as-package.sh) to package, which will auto-in * windows need to install gcc F.Y.I -1. when using [`as.sh`](https://github.com/alibaba/arthas/blob/master/bin/as.sh) to start Arthas, it will get the latest version under `~/.arthas/lib`; +1. when using [`as3.sh`](https://github.com/alibaba/arthas/blob/master/bin/as3.sh) to start Arthas, it will get the latest version under `~/.arthas/lib`; 2. when [`as-package.sh`](as-package.sh) packaging, it will get the version from `pom.xml` and suffix it with the current timestamp e.g. `3.0.5.20180917161808`. -You can also use `./mvnw clean package -DskipTests` to package and generate a `zip` under `packaging/target/` but remember when `as.sh` starts, it load the version under `~/.arthas/lib`. +You can also use `./mvnw clean package -DskipTests` to package and generate a `zip` under `packaging/target/` but remember when `as3.sh` starts, it load the version under `~/.arthas/lib`. ### Start Arthas in specified version When there are several different version, you can use `--use-version` to specify the version of Arthas to start your debug. ```bash -./as.sh --use-version 3.0.5.20180919185025 +./as3.sh --use-version 3.0.5.20180919185025 ``` Tip: you can use `--versions` to list all available versions. ```bash -./as.sh --versions +./as3.sh --versions ``` ### Debug @@ -97,22 +97,22 @@ Tip: you can use `--versions` to list all available versions. * windows需要安装gcc -`as.sh`在启动时,会对`~/.arthas/lib`下面的目录排序,取最新的版本。`as-package.sh`在打包时,会取`pom.xml`里的版本号,再拼接上当前时间,比如: `3.0.5.20180917161808`,这样子排序时取的就是最新的版本。 +`as3.sh`在启动时,会对`~/.arthas/lib`下面的目录排序,取最新的版本。`as-package.sh`在打包时,会取`pom.xml`里的版本号,再拼接上当前时间,比如: `3.0.5.20180917161808`,这样子排序时取的就是最新的版本。 -也可以直接 `./mvnw clean package -DskipTests`打包,生成的zip在 `packaging/target/` 下面。但是注意`as.sh`启动加载的是`~/.arthas/lib`下面的版本。 +也可以直接 `./mvnw clean package -DskipTests`打包,生成的zip在 `packaging/target/` 下面。但是注意`as3.sh`启动加载的是`~/.arthas/lib`下面的版本。 ### 启动指定版本的arthas 本地开发时,可能会产生多个版本,可以用 `--use-version` 参数来指定版本,比如 ```bash -./as.sh --use-version 3.0.5.20180919185025 +./as3.sh --use-version 3.0.5.20180919185025 ``` 可以用`--versions`参数来列出所有版本: ```bash -./as.sh --versions +./as3.sh --versions ``` ### Debug @@ -133,7 +133,7 @@ Tip: you can use `--versions` to list all available versions. 发布release版本流程: * 如果 arthas-vmtool 有更新,则需要手动触发action,构建后会把新的动态库文件提交到 lib 目录。 https://github.com/alibaba/arthas/actions/workflows/build-vmtool.yaml -* 修改`as.sh`里的版本,最后修改日期, `Bootstrap.java`里的版本,Dockerfile里的版本 +* 修改`as3.sh`里的版本,最后修改日期, `Bootstrap.java`里的版本,Dockerfile里的版本 * 修改本地的maven settings.xml * mvn clean deploy -DskipTests -P full -P release @@ -146,7 +146,7 @@ Tip: you can use `--versions` to list all available versions. 版本号信息地址: https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/maven-metadata.xml * 打上tag,push tag到仓库上 -* 需要更新 gh-pages 分支下面的 arthas-boot.jar/math-game.jar/as.sh ,下载 doc.zip,解压覆盖掉文档的更新 +* 需要更新 gh-pages 分支下面的 arthas-boot3.jar/math-game.jar/as3.sh ,下载 doc.zip,解压覆盖掉文档的更新 * 需要更新docker镜像,push新的tag:https://hub.docker.com/r/hengyunabc/arthas/tags?page=1&ordering=last_updated 以 3.6.5 版本为例: diff --git a/README.md b/README.md index bd3d69df2c3..7790e6ad419 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Build Status](https://github.com/alibaba/arthas/workflows/JavaCI/badge.svg)](https://github.com/alibaba/arthas/actions) [![codecov](https://codecov.io/gh/alibaba/arthas/branch/master/graph/badge.svg)](https://codecov.io/gh/alibaba/arthas) -[![maven](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg)](https://search.maven.org/search?q=g:com.taobao.arthas) +[![maven](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging?versionPrefix=3)](https://search.maven.org/search?q=g:com.taobao.arthas) ![license](https://img.shields.io/github/license/alibaba/arthas.svg) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/arthas.svg)](http://isitmaintained.com/project/alibaba/arthas "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/arthas.svg)](http://isitmaintained.com/project/alibaba/arthas "Percentage of issues still open") @@ -43,55 +43,52 @@ Arthas was built to solve these issues. A developer can troubleshoot your produc * Supports JDK 6+. * Supports Linux/Mac/Windows. - -### [Online Tutorials(Recommended)](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en) - -* [Usages](tutorials/katacoda/README.md#online-tutorial-usages) +### [Online Tutorials(Recommended)](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en) ### Quick start -#### Use `arthas-boot`(Recommended) +#### Use `arthas-boot3`(Recommended) -Download`arthas-boot.jar`,Start with `java` command: +Download`arthas-boot3.jar`,Start with `java` command: ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` Print usage: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` -#### Use `as.sh` +#### Use `as3.sh` You can install Arthas with one single line command on Linux, Unix, and Mac. Copy the following command and paste it into the command line, then press *Enter* to run: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -The command above will download the bootstrap script `as.sh` to the current directory. You can move it any other place you want, or put its location in `$PATH`. +The command above will download the bootstrap script `as3.sh` to the current directory. You can move it any other place you want, or put its location in `$PATH`. -You can enter its interactive interface by executing `as.sh`, or execute `as.sh -h` for more help information. +You can enter its interactive interface by executing `as3.sh`, or execute `as3.sh -h` for more help information. ### Documentation -* [Online Tutorials(Recommended)](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en) -* [User manual](https://arthas.aliyun.com/doc/en) -* [Installation](https://arthas.aliyun.com/doc/en/install-detail.html) -* [Download](https://arthas.aliyun.com/doc/en/download.html) -* [Quick start](https://arthas.aliyun.com/doc/en/quick-start.html) -* [Advanced usage](https://arthas.aliyun.com/doc/en/advanced-use.html) -* [Commands](https://arthas.aliyun.com/doc/en/commands.html) -* [WebConsole](https://arthas.aliyun.com/doc/en/web-console.html) -* [Docker](https://arthas.aliyun.com/doc/en/docker.html) -* [Arthas Spring Boot Starter](https://arthas.aliyun.com/doc/en/spring-boot-starter.html) +* [Online Tutorials(Recommended)](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en) +* [User manual](https://arthas.aliyun.com/3.x/doc/en) +* [Installation](https://arthas.aliyun.com/3.x/doc/en/install-detail.html) +* [Download](https://arthas.aliyun.com/3.x/doc/en/download.html) +* [Quick start](https://arthas.aliyun.com/3.x/doc/en/quick-start.html) +* [Advanced usage](https://arthas.aliyun.com/3.x/doc/en/advanced-use.html) +* [Commands](https://arthas.aliyun.com/3.x/doc/en/commands.html) +* [WebConsole](https://arthas.aliyun.com/3.x/doc/en/web-console.html) +* [Docker](https://arthas.aliyun.com/3.x/doc/en/docker.html) +* [Arthas Spring Boot Starter](https://arthas.aliyun.com/3.x/doc/en/spring-boot-starter.html) * [User cases](https://github.com/alibaba/arthas/issues?q=label%3Auser-case) -* [FAQ](https://arthas.aliyun.com/doc/en/faq) +* [FAQ](https://arthas.aliyun.com/3.x/doc/en/faq) * [Compile and debug/How to contribute](https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md) * [Release Notes](https://github.com/alibaba/arthas/releases) @@ -100,13 +97,13 @@ You can enter its interactive interface by executing `as.sh`, or execute `as.sh #### Dashboard -* https://arthas.aliyun.com/doc/en/dashboard +* https://arthas.aliyun.com/3.x/doc/en/dashboard ![dashboard](site/docs/.vuepress/public/images/dashboard.png) #### Thread -* https://arthas.aliyun.com/doc/en/thread +* https://arthas.aliyun.com/3.x/doc/en/thread See what is eating your CPU (ranked by top CPU usage) and what is going on there in one glance: @@ -139,7 +136,7 @@ $ thread -n 3 #### jad -* https://arthas.aliyun.com/doc/en/jad +* https://arthas.aliyun.com/3.x/doc/en/jad Decompile your class with one shot: @@ -179,7 +176,7 @@ public interface Servlet { ``` #### mc -* https://arthas.aliyun.com/doc/en/mc +* https://arthas.aliyun.com/3.x/doc/en/mc Memory compiler, compiles `.java` files into `.class` files in memory. @@ -189,7 +186,7 @@ $ mc /tmp/Test.java #### retransform -* https://arthas.aliyun.com/doc/en/retransform +* https://arthas.aliyun.com/3.x/doc/en/retransform Load the external `*.class` files to retransform/hotswap the loaded classes in JVM. @@ -200,7 +197,7 @@ retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class #### sc -* https://arthas.aliyun.com/doc/en/sc +* https://arthas.aliyun.com/3.x/doc/en/sc Search any loaded class with detailed information. @@ -239,7 +236,7 @@ $ sc -d org.springframework.web.context.support.XmlWebApplicationContext #### vmtool -* https://arthas.aliyun.com/doc/en/vmtool +* https://arthas.aliyun.com/3.x/doc/en/vmtool Get objects in the heap that are instances of the specified class. @@ -261,7 +258,7 @@ $ vmtool --action getInstances --className java.lang.String --limit 10 #### stack -* https://arthas.aliyun.com/doc/en/stack +* https://arthas.aliyun.com/3.x/doc/en/stack View the call stack of `test.arthas.TestStack#doGet`: @@ -298,7 +295,7 @@ ts=2018-09-18 10:11:45;thread_name=http-bio-8080-exec-10;id=d9;is_daemon=true;pr #### Trace -* https://arthas.aliyun.com/doc/en/trace +* https://arthas.aliyun.com/3.x/doc/en/trace See what is slowing down your method invocation with trace command: @@ -306,7 +303,7 @@ See what is slowing down your method invocation with trace command: #### Watch -* https://arthas.aliyun.com/doc/en/watch +* https://arthas.aliyun.com/3.x/doc/en/watch Watch the first parameter and thrown exception of `test.arthas.TestWatch#doGet` only if it throws exception. @@ -322,7 +319,7 @@ ts=2018-09-18 10:26:28;result=@ArrayList[ #### Monitor -* https://arthas.aliyun.com/doc/en/monitor +* https://arthas.aliyun.com/3.x/doc/en/monitor Monitor a specific method invocation statistics, including the total number of invocations, average response time, success rate, and every 5 seconds: @@ -345,7 +342,7 @@ Affect(class-cnt:1 , method-cnt:1) cost in 109 ms. #### Time Tunnel(tt) -* https://arthas.aliyun.com/doc/en/tt +* https://arthas.aliyun.com/3.x/doc/en/tt Record method invocation data, so that you can check the method invocation parameters, returned value, and thrown exceptions later. It works as if you could come back and replay the past method invocation via time tunnel. @@ -368,7 +365,7 @@ Affect(class-cnt:1 , method-cnt:1) cost in 75 ms. #### Classloader -* https://arthas.aliyun.com/doc/en/classloader +* https://arthas.aliyun.com/3.x/doc/en/classloader ```bash $ classloader @@ -387,14 +384,14 @@ $ classloader #### Web Console -* https://arthas.aliyun.com/doc/en/web-console +* https://arthas.aliyun.com/3.x/doc/en/web-console ![web console](site/docs/.vuepress/public/images/web-console-local.png) #### Profiler/FlameGraph -* https://arthas.aliyun.com/doc/en/profiler +* https://arthas.aliyun.com/3.x/doc/en/profiler ```bash $ profiler start @@ -413,7 +410,7 @@ View profiler results under arthas-output via browser: #### Arthas Spring Boot Starter -* [Arthas Spring Boot Starter](https://arthas.aliyun.com/doc/spring-boot-starter.html) +* [Arthas Spring Boot Starter](https://arthas.aliyun.com/3.x/doc/spring-boot-starter.html) ### Known Users diff --git a/README_CN.md b/README_CN.md index 03e51398272..e60ba422213 100644 --- a/README_CN.md +++ b/README_CN.md @@ -6,7 +6,7 @@ [![Build Status](https://github.com/alibaba/arthas/workflows/JavaCI/badge.svg)](https://github.com/alibaba/arthas/actions) [![codecov](https://codecov.io/gh/alibaba/arthas/branch/master/graph/badge.svg)](https://codecov.io/gh/alibaba/arthas) -[![maven](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg)](https://search.maven.org/search?q=g:com.taobao.arthas) +[![maven](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging?versionPrefix=3)](https://search.maven.org/search?q=g:com.taobao.arthas) ![license](https://img.shields.io/github/license/alibaba/arthas.svg) [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/alibaba/arthas.svg)](http://isitmaintained.com/project/alibaba/arthas "Average time to resolve an issue") [![Percentage of issues still open](http://isitmaintained.com/badge/open/alibaba/arthas.svg)](http://isitmaintained.com/project/alibaba/arthas "Percentage of issues still open") @@ -29,73 +29,70 @@ English version goes [here](README.md). `Arthas`支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -### [在线教程(推荐)](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn) - -* [使用方法](tutorials/katacoda/README_CN.md#在线教程使用方法) +### [在线教程(推荐)](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn) ### 快速开始 -#### 使用`arthas-boot`(推荐) +#### 使用`arthas-boot3`(推荐) -下载`arthas-boot.jar`,然后用`java -jar`的方式启动: +下载`arthas-boot3.jar`,然后用`java -jar`的方式启动: ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` 打印帮助信息: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` -* 如果下载速度比较慢,可以使用aliyun的镜像:`java -jar arthas-boot.jar --repo-mirror aliyun --use-http` +* 如果下载速度比较慢,可以使用aliyun的镜像:`java -jar arthas-boot3.jar --repo-mirror aliyun --use-http` -#### 使用`as.sh` +#### 使用`as3.sh` Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 +上述命令会下载启动脚本文件 `as3.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 -直接在shell下面执行`./as.sh`,就会进入交互界面。 +直接在shell下面执行`./as3.sh`,就会进入交互界面。 -也可以执行`./as.sh -h`来获取更多参数信息。 +也可以执行`./as3.sh -h`来获取更多参数信息。 ### 文档 -* [在线教程(推荐)](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn) -* [用户文档](https://arthas.aliyun.com/doc/) -* [安装](https://arthas.aliyun.com/doc/install-detail.html) -* [下载](https://arthas.aliyun.com/doc/download.html) -* [快速入门](https://arthas.aliyun.com/doc/quick-start.html) -* [进阶使用](https://arthas.aliyun.com/doc/advanced-use.html) -* [命令列表](https://arthas.aliyun.com/doc/commands.html) -* [WebConsole](https://arthas.aliyun.com/doc/web-console.html) -* [Docker](https://arthas.aliyun.com/doc/docker.html) -* [Arthas Spring Boot Starter](https://arthas.aliyun.com/doc/spring-boot-starter.html) +* [在线教程(推荐)](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn) +* [用户文档](https://arthas.aliyun.com/3.x/doc/) +* [安装](https://arthas.aliyun.com/3.x/doc/install-detail.html) +* [下载](https://arthas.aliyun.com/3.x/doc/download.html) +* [快速入门](https://arthas.aliyun.com/3.x/doc/quick-start.html) +* [进阶使用](https://arthas.aliyun.com/3.x/doc/advanced-use.html) +* [命令列表](https://arthas.aliyun.com/3.x/doc/commands.html) +* [WebConsole](https://arthas.aliyun.com/3.x/doc/web-console.html) +* [Docker](https://arthas.aliyun.com/3.x/doc/docker.html) +* [Arthas Spring Boot Starter](https://arthas.aliyun.com/3.x/doc/spring-boot-starter.html) * [用户案例](https://github.com/alibaba/arthas/issues?q=label%3Auser-case) -* [FAQ/常见问题](https://arthas.aliyun.com/doc/faq) +* [FAQ/常见问题](https://arthas.aliyun.com/3.x/doc/faq) * [编译调试/参与贡献](https://github.com/alibaba/arthas/blob/master/CONTRIBUTING.md) * [Release Notes](https://github.com/alibaba/arthas/releases) -* [QQ群/钉钉群](https://arthas.aliyun.com/doc/contact-us.html) +* [QQ群/钉钉群](https://arthas.aliyun.com/3.x/doc/contact-us.html) ### 案例展示 #### Dashboard -* https://arthas.aliyun.com/doc/dashboard +* https://arthas.aliyun.com/3.x/doc/dashboard ![dashboard](site/docs/.vuepress/public/images/dashboard.png) #### Thread -* https://arthas.aliyun.com/doc/thread +* https://arthas.aliyun.com/3.x/doc/thread 一目了然的了解系统的状态,哪些线程比较占cpu?他们到底在做什么? @@ -128,7 +125,7 @@ $ thread -n 3 #### jad -* https://arthas.aliyun.com/doc/jad +* https://arthas.aliyun.com/3.x/doc/jad 对类进行反编译: @@ -168,7 +165,7 @@ public interface Servlet { ``` #### mc -* https://arthas.aliyun.com/doc/mc +* https://arthas.aliyun.com/3.x/doc/mc Memory Compiler/内存编译器,编译`.java`文件生成`.class`。 @@ -177,7 +174,7 @@ mc /tmp/Test.java ``` #### retransform -* https://arthas.aliyun.com/doc/retransform +* https://arthas.aliyun.com/3.x/doc/retransform 加载外部的`.class`文件,retransform 热更新jvm已加载的类。 @@ -187,7 +184,7 @@ retransform -c 327a647b /tmp/Test.class /tmp/Test\$Inner.class ``` #### sc -* https://arthas.aliyun.com/doc/sc +* https://arthas.aliyun.com/3.x/doc/sc 查找JVM中已经加载的类 @@ -225,7 +222,7 @@ $ sc -d org.springframework.web.context.support.XmlWebApplicationContext #### vmtool -* https://arthas.aliyun.com/doc/vmtool +* https://arthas.aliyun.com/3.x/doc/vmtool 从JVM heap中获取指定类的实例。 @@ -246,7 +243,7 @@ $ vmtool --action getInstances --className java.lang.String --limit 10 ``` #### stack -* https://arthas.aliyun.com/doc/stack +* https://arthas.aliyun.com/3.x/doc/stack 查看方法 `test.arthas.TestStack#doGet` 的调用堆栈: @@ -283,7 +280,7 @@ ts=2018-09-18 10:11:45;thread_name=http-bio-8080-exec-10;id=d9;is_daemon=true;pr #### Trace -* https://arthas.aliyun.com/doc/trace +* https://arthas.aliyun.com/3.x/doc/trace 观察方法执行的时候哪个子调用比较慢: @@ -291,7 +288,7 @@ ts=2018-09-18 10:11:45;thread_name=http-bio-8080-exec-10;id=d9;is_daemon=true;pr #### Watch -* https://arthas.aliyun.com/doc/watch +* https://arthas.aliyun.com/3.x/doc/watch 观察方法 `test.arthas.TestWatch#doGet` 执行的入参,仅当方法抛出异常时才输出。 @@ -307,7 +304,7 @@ ts=2018-09-18 10:26:28;result=@ArrayList[ #### Monitor -* https://arthas.aliyun.com/doc/monitor +* https://arthas.aliyun.com/3.x/doc/monitor 监控某个特殊方法的调用统计数据,包括总调用次数,平均rt,成功率等信息,每隔5秒输出一次。 @@ -331,7 +328,7 @@ Affect(class-cnt:1 , method-cnt:1) cost in 109 ms. #### Time Tunnel(tt) -* https://arthas.aliyun.com/doc/tt +* https://arthas.aliyun.com/3.x/doc/tt 记录方法调用信息,支持事后查看方法调用的参数,返回值,抛出的异常等信息,仿佛穿越时空隧道回到调用现场一般。 @@ -354,7 +351,7 @@ Affect(class-cnt:1 , method-cnt:1) cost in 75 ms. #### Classloader -* https://arthas.aliyun.com/doc/classloader +* https://arthas.aliyun.com/3.x/doc/classloader 了解当前系统中有多少类加载器,以及每个加载器加载的类数量,帮助您判断是否有类加载器泄露。 @@ -375,13 +372,13 @@ $ classloader #### Web Console -* https://arthas.aliyun.com/doc/web-console +* https://arthas.aliyun.com/3.x/doc/web-console ![web console](site/docs/.vuepress/public/images/web-console-local.png) #### Profiler/FlameGraph/火焰图 -* https://arthas.aliyun.com/doc/profiler +* https://arthas.aliyun.com/3.x/doc/profiler ```bash $ profiler start @@ -400,7 +397,7 @@ OK #### Arthas Spring Boot Starter -* [Arthas Spring Boot Starter](https://arthas.aliyun.com/doc/spring-boot-starter.html) +* [Arthas Spring Boot Starter](https://arthas.aliyun.com/3.x/doc/spring-boot-starter.html) ### Known Users diff --git a/arthas-agent-attach/src/main/java/com/taobao/arthas/agent/attach/ArthasAgent.java b/arthas-agent-attach/src/main/java/com/taobao/arthas/agent/attach/ArthasAgent.java index 02d065f383d..667125ecefd 100644 --- a/arthas-agent-attach/src/main/java/com/taobao/arthas/agent/attach/ArthasAgent.java +++ b/arthas-agent-attach/src/main/java/com/taobao/arthas/agent/attach/ArthasAgent.java @@ -59,7 +59,7 @@ public static void attach() { } /** - * @see https://arthas.aliyun.com/doc/arthas-properties.html + * @see https://arthas.aliyun.com/3.x/doc/arthas-properties.html * @param configMap */ public static void attach(Map configMap) { diff --git a/bin/as.sh b/bin/as3.sh old mode 100755 new mode 100644 similarity index 93% rename from bin/as.sh rename to bin/as3.sh index ccb0d40c128..da5f9fc0c70 --- a/bin/as.sh +++ b/bin/as3.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# WIKI: https://arthas.aliyun.com/doc +# WIKI: https://arthas.aliyun.com/3.x/doc # This script only supports bash, do not support posix sh. # If you have the problem like Syntax error: "(" unexpected (expecting "fi"), # Try to run "bash -version" to check the version. @@ -188,23 +188,23 @@ esac # check curl/grep/awk/telnet/unzip command if ! [ -x "$(command -v curl)" ]; then - echo 'Error: curl is not installed. Try to use java -jar arthas-boot.jar' >&2 + echo 'Error: curl is not installed. Try to use java -jar arthas-boot3.jar' >&2 exit 1 fi if ! [ -x "$(command -v grep)" ]; then - echo 'Error: grep is not installed. Try to use java -jar arthas-boot.jar' >&2 + echo 'Error: grep is not installed. Try to use java -jar arthas-boot3.jar' >&2 exit 1 fi if ! [ -x "$(command -v awk)" ]; then - echo 'Error: awk is not installed. Try to use java -jar arthas-boot.jar' >&2 + echo 'Error: awk is not installed. Try to use java -jar arthas-boot3.jar' >&2 exit 1 fi if ! [ -x "$(command -v telnet)" ]; then - echo 'Error: telnet is not installed. Try to use java -jar arthas-boot.jar' >&2 + echo 'Error: telnet is not installed. Try to use java -jar arthas-boot3.jar' >&2 exit 1 fi if ! [ -x "$(command -v unzip)" ]; then - echo 'Error: unzip is not installed. Try to use java -jar arthas-boot.jar' >&2 + echo 'Error: unzip is not installed. Try to use java -jar arthas-boot3.jar' >&2 exit 1 fi @@ -319,10 +319,10 @@ reset_for_env() } -# get latest version from local -get_local_version() +# get latest 3.x version from local +get_local_3x_version() { - ls "${ARTHAS_LIB_DIR}" | sort | tail -1 + ls "${ARTHAS_LIB_DIR}" | grep -oE '3\.[0-9]+\.[0-9]+.*' | sort -V | tail -1 | tr -d '\r\n' } get_repo_url() @@ -334,10 +334,10 @@ get_repo_url() echo "${repoUrl}" } -# get latest version from remote -get_remote_version() +# get latest 3.x version from remote +get_remote_3x_version() { - curl -sLk "https://arthas.aliyun.com/api/latest_version" + curl -sLk "https://arthas.aliyun.com/api/versions" | grep -oE '3\.[0-9]+\.[0-9]+.*' | sort -V | tail -1 | tr -d '\r\n' } # check version greater @@ -466,22 +466,22 @@ Options and Arguments: Target pid EXAMPLES: - ./as.sh - ./as.sh --telnet-port 9999 --http-port -1 - ./as.sh --username admin --password - ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --app-name demoapp - ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw - ./as.sh --stat-url 'http://192.168.10.11:8080/api/stat' - ./as.sh -c 'sysprop; thread' - ./as.sh -f batch.as - ./as.sh --use-version 3.7.2 - ./as.sh --session-timeout 3600 - ./as.sh --attach-only - ./as.sh --disabled-commands stop,dump - ./as.sh --select math-game - ./as.sh --repo-mirror aliyun --use-http + ./as3.sh + ./as3.sh --telnet-port 9999 --http-port -1 + ./as3.sh --username admin --password + ./as3.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --app-name demoapp + ./as3.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw + ./as3.sh --stat-url 'http://192.168.10.11:8080/api/stat' + ./as3.sh -c 'sysprop; thread' + ./as3.sh -f batch.as + ./as3.sh --use-version 3.7.2 + ./as3.sh --session-timeout 3600 + ./as3.sh --attach-only + ./as3.sh --disabled-commands stop,dump + ./as3.sh --select math-game + ./as3.sh --repo-mirror aliyun --use-http WIKI: - https://arthas.aliyun.com/doc + https://arthas.aliyun.com/3.x/doc Here is the list of possible java process(es) to attatch: " @@ -812,8 +812,8 @@ parse_arguments() fi if [[ ($httpPortPid) && ($TARGET_PID != $httpPortPid) ]]; then echo "Target process $TARGET_PID is not the process using port $(getHttpPortOrDefault), you will connect to an unexpected process." - echo "1. Try to restart as.sh, select process $httpPortPid, shutdown it first with running the 'stop' command." - echo "2. Try to use different http port, for example: as.sh --telnet-port 9998 --http-port 9999" + echo "1. Try to restart as3.sh, select process $httpPortPid, shutdown it first with running the 'stop' command." + echo "2. Try to use different http port, for example: as3.sh --telnet-port 9998 --http-port 9999" exit 1 fi elif [ -z ${TARGET_PID} ]; then @@ -931,8 +931,8 @@ sanity_check() { if [ "$current_user" != "$target_user" ]; then echo "The current user ($current_user) does not match with the owner of process ${TARGET_PID} ($target_user)." echo "To solve this, choose one of the following command:" - echo " 1) sudo su $target_user && ./as.sh" - echo " 2) sudo -u $target_user -EH ./as.sh" + echo " 1) sudo su $target_user && ./as3.sh" + echo " 2) sudo -u $target_user -EH ./as3.sh" exit_on_err 1 fi } @@ -972,15 +972,15 @@ port_pid_check() { print_telnet_port_pid_error() { echo "[ERROR] The telnet port $(getTelnetPortOrDefault) is used by process $telnetPortPid instead of target process $TARGET_PID, you will connect to an unexpected process." - echo "[ERROR] 1. Try to restart as.sh, select process $telnetPortPid, shutdown it first with running the 'stop' command." + echo "[ERROR] 1. Try to restart as3.sh, select process $telnetPortPid, shutdown it first with running the 'stop' command." echo "[ERROR] 2. Try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 $(getTelnetPortOrDefault) -c \"stop\"" - echo "[ERROR] 3. Try to use different telnet port, for example: as.sh --telnet-port 9998 --http-port -1" + echo "[ERROR] 3. Try to use different telnet port, for example: as3.sh --telnet-port 9998 --http-port -1" } print_telnet_port_used_error() { local error_msg=$1 echo "[ERROR] The telnet port $(getTelnetPortOrDefault) is used, but process $error_msg, you will connect to an unexpected process." - echo "[ERROR] Try to use different telnet port, for example: as.sh --telnet-port 9998 --http-port -1" + echo "[ERROR] Try to use different telnet port, for example: as3.sh --telnet-port 9998 --http-port -1" } # active console @@ -1051,13 +1051,17 @@ main() # try to find arthas home from --use-version if [[ (-z "${ARTHAS_HOME}") && (! -z "${USE_VERSION}") ]]; then + if [[ "${USE_VERSION:0:1}" != "3" ]] ; then + echo "Arthas version ${USE_VERSION} is not supported; only version 3.x is supported." 1>&2 + exit 1 + fi if [[ ! -d "${ARTHAS_LIB_DIR}/${USE_VERSION}/arthas" ]] ; then update_if_necessary "${USE_VERSION}" || echo "update fail, ignore this update." 1>&2 fi ARTHAS_HOME="${ARTHAS_LIB_DIR}/${USE_VERSION}/arthas" fi - # try to set arthas home from as.sh directory + # try to set arthas home from as3.sh directory if [ -z "${ARTHAS_HOME}" ] ; then [[ -a "${DIR}/arthas-core.jar" ]] \ && [[ -a "${DIR}/arthas-agent.jar" ]] \ @@ -1067,13 +1071,13 @@ main() # try to find arthas under ~/.arthas/lib if [ -z "${ARTHAS_HOME}" ] ; then - local remote_version=$(get_remote_version) - local arthas_local_version=$(get_local_version) - if $(version_gt $remote_version $arthas_local_version) ; then - update_if_necessary "${remote_version}" || echo "update fail, ignore this update." 1>&2 + local remote_3x_version=$(get_remote_3x_version) + local arthas_local_3x_version=$(get_local_3x_version) + if $(version_gt $remote_3x_version $arthas_local_3x_version) ; then + update_if_necessary "${remote_3x_version}" || echo "update fail, ignore this update." 1>&2 fi - local arthas_local_version=$(get_local_version) - ARTHAS_HOME="${ARTHAS_LIB_DIR}/${arthas_local_version}/arthas" + local arthas_local_3x_version=$(get_local_3x_version) + ARTHAS_HOME="${ARTHAS_LIB_DIR}/${arthas_local_3x_version}/arthas" fi echo "Arthas home: ${ARTHAS_HOME}" diff --git a/bin/install-local.sh b/bin/install-local3.sh similarity index 96% rename from bin/install-local.sh rename to bin/install-local3.sh index 20392ec1749..45938e3f68d 100644 --- a/bin/install-local.sh +++ b/bin/install-local3.sh @@ -26,7 +26,7 @@ if [[ ! -x ${ARTHAS_LIB_HOME} ]]; then cp *.jar ${ARTHAS_LIB_HOME}/ # make it -x - chmod +x ./as.sh + chmod +x ./as3.sh fi diff --git a/bin/install.sh b/bin/install3.sh similarity index 82% rename from bin/install.sh rename to bin/install3.sh index 656e11ec7fc..d9ce21df2e4 100644 --- a/bin/install.sh +++ b/bin/install3.sh @@ -1,16 +1,16 @@ #! /bin/bash -# temp file of as.sh -TEMP_ARTHAS_FILE="./as.sh.$$" +# temp file of as3.sh +TEMP_ARTHAS_FILE="./as3.sh.$$" -# target file of as.sh -TARGET_ARTHAS_FILE="./as.sh" +# target file of as3.sh +TARGET_ARTHAS_FILE="./as3.sh" # update timeout(sec) SO_TIMEOUT=60 # default downloading url -ARTHAS_FILE_URL="https://arthas.aliyun.com/as.sh" +ARTHAS_FILE_URL="https://arthas.aliyun.com/as3.sh" # exit shell with err_code # $1 : err_code @@ -40,7 +40,7 @@ curl \ || exit_on_err 1 "download failed!" # write or overwrite local file -rm -rf as.sh +rm -rf as3.sh mv ${TEMP_ARTHAS_FILE} ${TARGET_ARTHAS_FILE} chmod +x ${TARGET_ARTHAS_FILE} diff --git a/boot/pom.xml b/boot/pom.xml index 9235f89d2c8..5d128ca2dae 100644 --- a/boot/pom.xml +++ b/boot/pom.xml @@ -7,8 +7,8 @@ ${revision} ../pom.xml - arthas-boot - arthas-boot + arthas-boot3 + arthas-boot3 https://github.com/alibaba/arthas @@ -29,7 +29,7 @@ - arthas-boot + arthas-boot3 org.apache.maven.plugins diff --git a/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java b/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java index 0920bfccac9..23316a2e516 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java +++ b/boot/src/main/java/com/taobao/arthas/boot/Bootstrap.java @@ -45,21 +45,21 @@ */ @Name("arthas-boot") @Summary("Bootstrap Arthas") -@Description("EXAMPLES:\n" + " java -jar arthas-boot.jar \n" - + " java -jar arthas-boot.jar --telnet-port 9999 --http-port -1\n" - + " java -jar arthas-boot.jar --username admin --password \n" - + " java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --app-name demoapp\n" - + " java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw\n" - + " java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat'\n" - + " java -jar arthas-boot.jar -c 'sysprop; thread' \n" - + " java -jar arthas-boot.jar -f batch.as \n" - + " java -jar arthas-boot.jar --use-version 3.7.2\n" - + " java -jar arthas-boot.jar --versions\n" - + " java -jar arthas-boot.jar --select math-game\n" - + " java -jar arthas-boot.jar --session-timeout 3600\n" + " java -jar arthas-boot.jar --attach-only\n" - + " java -jar arthas-boot.jar --disabled-commands stop,dump\n" - + " java -jar arthas-boot.jar --repo-mirror aliyun --use-http\n" + "WIKI:\n" - + " https://arthas.aliyun.com/doc\n") +@Description("EXAMPLES:\n" + " java -jar arthas-boot3.jar \n" + + " java -jar arthas-boot3.jar --telnet-port 9999 --http-port -1\n" + + " java -jar arthas-boot3.jar --username admin --password \n" + + " java -jar arthas-boot3.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --app-name demoapp\n" + + " java -jar arthas-boot3.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw\n" + + " java -jar arthas-boot3.jar --stat-url 'http://192.168.10.11:8080/api/stat'\n" + + " java -jar arthas-boot3.jar -c 'sysprop; thread' \n" + + " java -jar arthas-boot3.jar -f batch.as \n" + + " java -jar arthas-boot3.jar --use-version 3.7.2\n" + + " java -jar arthas-boot3.jar --versions\n" + + " java -jar arthas-boot3.jar --select math-game\n" + + " java -jar arthas-boot3.jar --session-timeout 3600\n" + " java -jar arthas-boot3.jar --attach-only\n" + + " java -jar arthas-boot3.jar --disabled-commands stop,dump\n" + + " java -jar arthas-boot3.jar --repo-mirror aliyun --use-http\n" + "WIKI:\n" + + " https://arthas.aliyun.com/3.x/doc\n") public class Bootstrap { private static final int DEFAULT_TELNET_PORT = 3658; private static final int DEFAULT_HTTP_PORT = 8563; @@ -86,7 +86,7 @@ public class Bootstrap { *
      * The directory contains arthas-core.jar/arthas-client.jar/arthas-spy.jar.
      * 1. When use-version is not empty, try to find arthas home under ~/.arthas/lib
-     * 2. Try set the directory where arthas-boot.jar is located to arthas home
+     * 2. Try set the directory where arthas-boot3.jar is located to arthas home
      * 3. Try to download from remote repo
      * 
*/ @@ -412,7 +412,7 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE pid, bootstrap.getHttpPortOrDefault()); AnsiLog.error("1. Try to restart arthas-boot, select process {}, shutdown it first with running the 'stop' command.", httpPortPid); - AnsiLog.error("2. Or try to use different http port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port 9999"); + AnsiLog.error("2. Or try to use different http port, for example: java -jar arthas-boot3.jar --telnet-port 9998 --http-port 9999"); System.exit(1); } @@ -423,6 +423,11 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE arthasHomeDir = new File(bootstrap.getArthasHome()); } if (arthasHomeDir == null && bootstrap.getUseVersion() != null) { + // exit when useVersion is not 3.x + if (!bootstrap.getUseVersion().startsWith("3")) { + AnsiLog.error("Arthas version {} is not supported; only version 3.x is supported.", bootstrap.getUseVersion()); + System.exit(1); + } // try to find from ~/.arthas/lib File specialVersionDir = new File(System.getProperty("user.home"), ".arthas" + File.separator + "lib" + File.separator + bootstrap.getUseVersion() + File.separator + "arthas"); @@ -435,7 +440,7 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE arthasHomeDir = specialVersionDir; } - // Try set the directory where arthas-boot.jar is located to arhtas home + // Try set the directory where arthas-boot3.jar is located to arthas home if (arthasHomeDir == null) { CodeSource codeSource = Bootstrap.class.getProtectionDomain().getCodeSource(); if (codeSource != null) { @@ -461,24 +466,25 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE /** *
-             * 1. get local latest version
-             * 2. get remote latest version
+             * 1. get local latest 3.x version
+             * 2. get remote latest 3.x version
              * 3. compare two version
              * 
*/ List versionList = listNames(ARTHAS_LIB_DIR); - Collections.sort(versionList); - String localLastestVersion = null; - if (!versionList.isEmpty()) { - localLastestVersion = versionList.get(versionList.size() - 1); + String localLatest3xVersion = null; + for (String version : versionList) { + if (version.startsWith("3") && (localLatest3xVersion == null || version.compareTo(localLatest3xVersion) > 0)) { + localLatest3xVersion = version; + } } - String remoteLastestVersion = DownloadUtils.readLatestReleaseVersion(); + String remoteLatest3xVersion = DownloadUtils.readLatest3xReleaseVersion(); boolean needDownload = false; - if (localLastestVersion == null) { - if (remoteLastestVersion == null) { + if (localLatest3xVersion == null) { + if (remoteLatest3xVersion == null) { // exit AnsiLog.error("Can not find Arthas under local: {} and remote repo mirror: {}", ARTHAS_LIB_DIR, bootstrap.getRepoMirror()); @@ -489,10 +495,10 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE needDownload = true; } } else { - if (remoteLastestVersion != null) { - if (localLastestVersion.compareTo(remoteLastestVersion) < 0) { - AnsiLog.info("local lastest version: {}, remote lastest version: {}, try to download from remote.", - localLastestVersion, remoteLastestVersion); + if (remoteLatest3xVersion != null) { + if (localLatest3xVersion.compareTo(remoteLatest3xVersion) < 0) { + AnsiLog.info("local latest 3.x version: {}, remote latest 3.x version: {}, try to download from remote.", + localLatest3xVersion, remoteLatest3xVersion); needDownload = true; } } @@ -500,12 +506,12 @@ public static void main(String[] args) throws ParserConfigurationException, SAXE if (needDownload) { // try to download arthas from remote server. DownloadUtils.downArthasPackaging(bootstrap.getRepoMirror(), bootstrap.isuseHttp(), - remoteLastestVersion, ARTHAS_LIB_DIR.getAbsolutePath()); - localLastestVersion = remoteLastestVersion; + remoteLatest3xVersion, ARTHAS_LIB_DIR.getAbsolutePath()); + localLatest3xVersion = remoteLatest3xVersion; } - // get the latest version - arthasHomeDir = new File(ARTHAS_LIB_DIR, localLastestVersion + File.separator + "arthas"); + // get the latest 3.x version + arthasHomeDir = new File(ARTHAS_LIB_DIR, localLatest3xVersion + File.separator + "arthas"); } verifyArthasHome(arthasHomeDir.getAbsolutePath()); @@ -640,7 +646,7 @@ private static void checkTelnetPortPid(Bootstrap bootstrap, long telnetPortPid, AnsiLog.error("1. Try to restart arthas-boot, select process {}, shutdown it first with running the 'stop' command.", telnetPortPid); AnsiLog.error("2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 {} -c \"stop\"", bootstrap.getTelnetPortOrDefault()); - AnsiLog.error("3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1"); + AnsiLog.error("3. Or try to use different telnet port, for example: java -jar arthas-boot3.jar --telnet-port 9998 --http-port -1"); System.exit(1); } } @@ -671,7 +677,7 @@ private static long findProcessByTelnetClient(String arthasHomeDir, int telnetPo } if (error != null) { AnsiLog.error("The telnet port {} is used, but process {}, you will connect to an unexpected process.", telnetPort, error); - AnsiLog.error("Try to use a different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1"); + AnsiLog.error("Try to use a different telnet port, for example: java -jar arthas-boot3.jar --telnet-port 9998 --http-port -1"); System.exit(1); } diff --git a/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java b/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java index 4800d9b1887..8df902abb3c 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java +++ b/boot/src/main/java/com/taobao/arthas/boot/DownloadUtils.java @@ -44,6 +44,19 @@ public static String readLatestReleaseVersion() { return null; } + public static String readLatest3xReleaseVersion() { + List versions = readRemoteVersions(); + String latest3xReleaseVersion = null; + if (versions != null) { + for (String version : versions) { + if (version.startsWith("3") && (latest3xReleaseVersion == null || version.compareTo(latest3xReleaseVersion) > 0)) { + latest3xReleaseVersion = version; + } + } + } + return latest3xReleaseVersion; + } + public static List readRemoteVersions() { InputStream inputStream = null; try { diff --git a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java index 33a94e21b3e..3c67df5d81e 100644 --- a/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java +++ b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java @@ -220,7 +220,7 @@ public static String findJavaHome() { } throw new IllegalArgumentException("Can not find tools.jar under java home: " + javaHome - + ", please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar"); + + ", please try to start arthas-boot3 with full path java. Such as /opt/jdk/bin/java -jar arthas-boot3.jar"); } } else { FOUND_JAVA_HOME = javaHome; diff --git a/core/src/main/java/arthas.properties b/core/src/main/java/arthas.properties index 98457d5ba9e..2c846520604 100644 --- a/core/src/main/java/arthas.properties +++ b/core/src/main/java/arthas.properties @@ -8,7 +8,7 @@ arthas.sessionTimeout=1800 #arthas.enhanceLoaders=java.lang.ClassLoader -# https://arthas.aliyun.com/doc/en/auth +# https://arthas.aliyun.com/3.x/doc/en/auth # arthas.username=arthas # arthas.password=arthas diff --git a/core/src/main/java/com/taobao/arthas/core/command/Constants.java b/core/src/main/java/com/taobao/arthas/core/command/Constants.java index a65fd534705..a3c4d548337 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/Constants.java +++ b/core/src/main/java/com/taobao/arthas/core/command/Constants.java @@ -25,7 +25,7 @@ public interface Constants { String WIKI = "\nWIKI:\n"; - String WIKI_HOME = " https://arthas.aliyun.com/doc/"; + String WIKI_HOME = " https://arthas.aliyun.com/3.x/doc/"; String EXPRESS_EXAMPLES = "Examples:\n" + " params\n" + diff --git a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java index dca33b96a6e..ebf0746f8c0 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ArthasBanner.java @@ -28,8 +28,8 @@ public class ArthasBanner { private static final String LOGO_LOCATION = "/com/taobao/arthas/core/res/logo.txt"; private static final String CREDIT_LOCATION = "/com/taobao/arthas/core/res/thanks.txt"; private static final String VERSION_LOCATION = "/com/taobao/arthas/core/res/version"; - private static final String WIKI = "https://arthas.aliyun.com/doc"; - private static final String TUTORIALS = "https://arthas.aliyun.com/doc/arthas-tutorials.html"; + private static final String WIKI = "https://arthas.aliyun.com/3.x/doc"; + private static final String TUTORIALS = "https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html"; private static final String ARTHAS_LATEST_VERSIONS_URL = "https://arthas.aliyun.com/api/latest_version"; private static final int CONNECTION_TIMEOUT = 1000; diff --git a/katacoda.yaml b/katacoda.yaml deleted file mode 100644 index fbd68804ce2..00000000000 --- a/katacoda.yaml +++ /dev/null @@ -1 +0,0 @@ -scenario_root : tutorials/katacoda \ No newline at end of file diff --git a/packaging/pom.xml b/packaging/pom.xml index dbc6e47ce5b..0420a2b3d03 100644 --- a/packaging/pom.xml +++ b/packaging/pom.xml @@ -110,7 +110,7 @@ - ${project.build.directory}/arthas-bin/as.sh + ${project.build.directory}/arthas-bin/as3.sh file perm @@ -206,7 +206,7 @@ root - /usr/share/arthas/as.sh + /usr/share/arthas/as3.sh diff --git a/packaging/src/main/assembly/assembly.xml b/packaging/src/main/assembly/assembly.xml index 9c8c91d13be..d39e333dfef 100644 --- a/packaging/src/main/assembly/assembly.xml +++ b/packaging/src/main/assembly/assembly.xml @@ -34,8 +34,8 @@ arthas-client.jar - ../boot/target/arthas-boot-jar-with-dependencies.jar - arthas-boot.jar + ../boot/target/arthas-boot3-jar-with-dependencies.jar + arthas-boot3.jar ../math-game/target/math-game.jar @@ -43,12 +43,12 @@ - ../bin/install-local.sh + ../bin/install-local3.sh 0755 true - ../bin/as.sh + ../bin/as3.sh 0755 diff --git a/site/docs/.vuepress/config.js b/site/docs/.vuepress/config.js index 10dd75aa1cd..0572504a41a 100644 --- a/site/docs/.vuepress/config.js +++ b/site/docs/.vuepress/config.js @@ -12,6 +12,7 @@ export default defineUserConfig({ title: "arthas", description: "arthas user document", head, + base: "/3.x/", locales: { "/": { lang: "zh-CN", diff --git a/site/docs/.vuepress/configs/navbar/en.js b/site/docs/.vuepress/configs/navbar/en.js index 9b2a7265fb6..4c79a83a8ee 100644 --- a/site/docs/.vuepress/configs/navbar/en.js +++ b/site/docs/.vuepress/configs/navbar/en.js @@ -20,4 +20,13 @@ export const navbarEN = [ text: "DOWNLOAD", link: "/en/doc/download.md", }, + { + text: "VERSIONS", + children: [ + { + text: "v4.x", + link: "https://arthas.aliyun.com/en/", + }, + ], + }, ]; diff --git a/site/docs/.vuepress/configs/navbar/zh.js b/site/docs/.vuepress/configs/navbar/zh.js index 9f3d1d06ac0..d02b9c91b42 100644 --- a/site/docs/.vuepress/configs/navbar/zh.js +++ b/site/docs/.vuepress/configs/navbar/zh.js @@ -20,4 +20,13 @@ export const navbarZH = [ text: "下载", link: "/doc/download.md", }, + { + text: "版本", + children: [ + { + text: "v4.x", + link: "https://arthas.aliyun.com/", + }, + ], + }, ]; diff --git a/site/docs/.vuepress/public/doc/arthas-tutorials.html b/site/docs/.vuepress/public/doc/arthas-tutorials.html index e00bf1aac03..b8fd5b3a544 100644 --- a/site/docs/.vuepress/public/doc/arthas-tutorials.html +++ b/site/docs/.vuepress/public/doc/arthas-tutorials.html @@ -41,7 +41,7 @@ @@ -1103,9 +1103,9 @@ }, docUrl: function () { if (this.language === "en") { - return "https://arthas.aliyun.com/doc/en"; + return "https://arthas.aliyun.com/3.x/doc/en"; } else { - return "https://arthas.aliyun.com/doc"; + return "https://arthas.aliyun.com/3.x/doc"; } }, tutorialsStr: function () { diff --git a/site/docs/doc/advanced-use.md b/site/docs/doc/advanced-use.md index 1f96687b92b..2fc35486976 100644 --- a/site/docs/doc/advanced-use.md +++ b/site/docs/doc/advanced-use.md @@ -69,11 +69,11 @@ Http API 提供结构化的数据,支持更复杂的交互功能,方便自 - [批处理功能](batch-support.md) -## as.sh 和 arthas-boot 技巧 +## as3.sh 和 arthas-boot3 技巧 - 通过`select`功能选择 attach 的进程。 -正常情况下,每次执行`as.sh`/`arthas-boot.jar`需要选择,或者指定 PID。这样会比较麻烦,因为每次启动应用,它的 PID 会变化。 +正常情况下,每次执行`as3.sh`/`arthas-boot3.jar`需要选择,或者指定 PID。这样会比较麻烦,因为每次启动应用,它的 PID 会变化。 比如,已经启动了`math-game.jar`,使用`jps`命令查看: @@ -86,7 +86,7 @@ $ jps 通过`select`参数可以指定进程名字,非常方便。 ```bash -$ ./as.sh --select math-game +$ ./as3.sh --select math-game Arthas script version: 3.3.6 [INFO] JAVA_HOME: /tmp/java/8.0.222-zulu Arthas home: /Users/admin/.arthas/lib/3.3.6/arthas @@ -108,8 +108,8 @@ Escape character is '^]'. `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.3.6 pid 58883 ``` @@ -118,7 +118,7 @@ pid 58883 在`3.1.4`版本后,增加了用户数据回报功能,方便统一做安全或者历史数据统计。 -在启动时,指定`stat-url`,就会回报执行的每一行命令,比如: `./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'` +在启动时,指定`stat-url`,就会回报执行的每一行命令,比如: `./as3.sh --stat-url 'http://192.168.10.11:8080/api/stat'` 在 tunnel server 里有一个示例的回报代码,用户可以自己在服务器上实现。 diff --git a/site/docs/doc/arthas-properties.md b/site/docs/doc/arthas-properties.md index d437acce1bc..f36aeea4338 100644 --- a/site/docs/doc/arthas-properties.md +++ b/site/docs/doc/arthas-properties.md @@ -56,7 +56,7 @@ arthas.disabledCommands=stop,dump 比如: -- `./as.sh --telnet-port 9999` 传入的配置会覆盖掉`arthas.properties`里的默认值`arthas.telnetPort=3658`。 +- `./as3.sh --telnet-port 9999` 传入的配置会覆盖掉`arthas.properties`里的默认值`arthas.telnetPort=3658`。 - 如果应用自身设置了 system properties `arthas.telnetPort=8888`,则会覆盖掉`arthas.properties`里的默认值`arthas.telnetPort=3658`。 如果想要 `arthas.properties`的优先级最高,则可以配置 `arthas.config.overrideAll=true` 。 diff --git a/site/docs/doc/arthas3.md b/site/docs/doc/arthas3.md index 1289f22fc9e..4fd40f3586f 100644 --- a/site/docs/doc/arthas3.md +++ b/site/docs/doc/arthas3.md @@ -28,7 +28,7 @@ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "params + 为了避免这个问题,Arthas 3.0 中使用了 ognl 这个更加轻量的表达式求值库来代替 groovy,彻底解决了 groovy 引起的 FGC 风险。但由于这个替换,导致原来使用 groovy 脚本编写的自定义脚本失效。这个问题留待后续解决。 -在 3.0 中,watch 命令的表达式部分的书写有了一些改变,详见[这里](https://arthas.aliyun.com/doc/watch) +在 3.0 中,watch 命令的表达式部分的书写有了一些改变,详见[这里](https://arthas.aliyun.com/3.x/doc/watch) #### 提升 rt 统计精度 diff --git a/site/docs/doc/async.md b/site/docs/doc/async.md index b7ad245f2e1..36f803293c2 100644 --- a/site/docs/doc/async.md +++ b/site/docs/doc/async.md @@ -1,6 +1,6 @@ # Arthas 后台异步任务 -[`后台异步任务`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=case-async-jobs) +[`后台异步任务`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=case-async-jobs) arthas 中的后台异步任务,使用了仿 linux 系统任务相关的命令。[linux 任务相关介绍](https://ehlxr.me/2017/01/18/Linux-%E4%B8%AD-fg%E3%80%81bg%E3%80%81jobs%E3%80%81-%E6%8C%87%E4%BB%A4/)。 diff --git a/site/docs/doc/auth.md b/site/docs/doc/auth.md index 7eeb2ee2987..5539f785e76 100644 --- a/site/docs/doc/auth.md +++ b/site/docs/doc/auth.md @@ -9,7 +9,7 @@ 在 attach 时,可以在命令行指定密码。比如: ``` -java -jar arthas-boot.jar --password ppp +java -jar arthas-boot3.jar --password ppp ``` - 可以通过 `--username` 选项来指定用户,默认值是`arthas`。 diff --git a/site/docs/doc/batch-support.md b/site/docs/doc/batch-support.md index e723cc452d1..87d7b80acbd 100644 --- a/site/docs/doc/batch-support.md +++ b/site/docs/doc/batch-support.md @@ -32,13 +32,13 @@ sc -d org.apache.commons.lang.StringUtils 通过`-f`执行脚本文件,批处理脚本默认会输出到标准输出中,可以将结果重定向到文件中。 ```bash -./as.sh -f /var/tmp/test.as > test.out # pid 可以通过 jps 命令查看 +./as3.sh -f /var/tmp/test.as > test.out # pid 可以通过 jps 命令查看 ``` 也可以通过 `-c` 来指定指行的命令,比如 ```bash -./as.sh -c 'sysprop; thread' > test.out # pid 可以通过 jps 命令查看 +./as3.sh -c 'sysprop; thread' > test.out # pid 可以通过 jps 命令查看 ``` ### 第三步:查看运行结果 diff --git a/site/docs/doc/cat.md b/site/docs/doc/cat.md index 0a3ae34d896..fd1be0d4c53 100644 --- a/site/docs/doc/cat.md +++ b/site/docs/doc/cat.md @@ -1,6 +1,6 @@ # cat -[`cat`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-cat) +[`cat`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-cat) ::: tip 打印文件内容,和 linux 里的 cat 命令类似。 diff --git a/site/docs/doc/classloader.md b/site/docs/doc/classloader.md index 0871a00bcc0..db9f18c2075 100644 --- a/site/docs/doc/classloader.md +++ b/site/docs/doc/classloader.md @@ -1,6 +1,6 @@ # classloader -[`classloader`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-classloader) +[`classloader`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-classloader) ::: tip 查看 classloader 的继承树,urls,类加载信息 diff --git a/site/docs/doc/dashboard.md b/site/docs/doc/dashboard.md index c367c36aba7..00f030f386e 100644 --- a/site/docs/doc/dashboard.md +++ b/site/docs/doc/dashboard.md @@ -1,6 +1,6 @@ # dashboard -[`dashboard`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-dashboard) +[`dashboard`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-dashboard) ::: tip 当前系统的实时数据面板,按 ctrl+c 退出。 diff --git a/site/docs/doc/docker.md b/site/docs/doc/docker.md index 897f3984847..c58e4fba311 100644 --- a/site/docs/doc/docker.md +++ b/site/docs/doc/docker.md @@ -67,10 +67,10 @@ RUN export JAVA_HOME $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar" ``` -1. 启动`arthas-boot`来进行诊断 +1. 启动`arthas-boot3`来进行诊断 ```sh - $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar" + $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot3.jar" * [1]: 9 jar [INFO] arthas home: /opt/arthas @@ -84,7 +84,7 @@ RUN export JAVA_HOME `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' - wiki: https://arthas.aliyun.com/doc + wiki: https://arthas.aliyun.com/3.x/doc version: 3.0.5 pid: 9 time: 2018-12-18 11:30:36 @@ -93,13 +93,13 @@ RUN export JAVA_HOME ## 诊断 Docker 里的 Java 进程 ```sh -docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" +docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot3.jar && java -jar arthas-boot3.jar" ``` ## 诊断 k8s 里容器里的 Java 进程 ```sh -kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" +kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot3.jar && java -jar arthas-boot3.jar" ``` ## 把 Arthas 安装到基础镜像里 diff --git a/site/docs/doc/download.md b/site/docs/doc/download.md index a9191eb9d34..7cf07aadb1c 100644 --- a/site/docs/doc/download.md +++ b/site/docs/doc/download.md @@ -2,42 +2,34 @@ ## 下载全量包 -### 从 Maven 仓库下载 - -最新版本,点击下载:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version?mirror=aliyun) - ### 从 Github Releases 页下载 [https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) -### 用 as.sh 启动 +### 用 as3.sh 启动 -解压后,在文件夹里有`as.sh`,直接用`./as.sh`的方式启动: +解压后,在文件夹里有`as3.sh`,直接用`./as3.sh`的方式启动: ```bash -./as.sh +./as3.sh ``` 打印帮助信息: ```bash -./as.sh -h +./as3.sh -h ``` -### 用 arthas-boot 启动 +### 用 arthas-boot3 启动 -或者在解压后,在文件夹里有`arthas-boot.jar`,直接用`java -jar`的方式启动: +或者在解压后,在文件夹里有`arthas-boot3.jar`,直接用`java -jar`的方式启动: ```bash -java -jar arthas-boot.jar +java -jar arthas-boot3.jar ``` 打印帮助信息: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` - -## 下载离线文档 - -下载文档:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/doc/latest_version?mirror=aliyun) diff --git a/site/docs/doc/dump.md b/site/docs/doc/dump.md index 7ccc685bf32..e67c95a412a 100644 --- a/site/docs/doc/dump.md +++ b/site/docs/doc/dump.md @@ -1,6 +1,6 @@ # dump -[`dump`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-dump) +[`dump`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-dump) ::: tip dump 已加载类的 bytecode 到特定目录 diff --git a/site/docs/doc/echo.md b/site/docs/doc/echo.md index 702dbe55ed1..08863dace46 100644 --- a/site/docs/doc/echo.md +++ b/site/docs/doc/echo.md @@ -1,6 +1,6 @@ # echo -[`echo`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-echo) +[`echo`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-echo) ::: tip 打印参数,和 linux 里的 echo 命令类似。 diff --git a/site/docs/doc/faq.md b/site/docs/doc/faq.md index 920056dd119..2530297c288 100644 --- a/site/docs/doc/faq.md +++ b/site/docs/doc/faq.md @@ -106,6 +106,6 @@ ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")' ### 为什么下载了新版本的 Arthas,连接的却是旧版本? -比如启动的 `as.sh/arthas-boot.jar` 版本是 3.5._ 的,但是连接上之后,打印的 arthas 版本是 3.4._ 的。 +比如启动的 `as3.sh/arthas-boot3.jar` 版本是 3.5._ 的,但是连接上之后,打印的 arthas 版本是 3.4._ 的。 可能是之前使用旧版本的 arthas 诊断过目标进程。可以先执行`stop`停止掉旧版本的 arthas,再重新使用新版本 attach。 diff --git a/site/docs/doc/getstatic.md b/site/docs/doc/getstatic.md index 0b60dda2607..f618d2d82b9 100644 --- a/site/docs/doc/getstatic.md +++ b/site/docs/doc/getstatic.md @@ -1,6 +1,6 @@ # getstatic -[`getstatic`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-getstatic) +[`getstatic`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-getstatic) ### 使用参考 diff --git a/site/docs/doc/grep.md b/site/docs/doc/grep.md index 81ec7ebae1b..dd8b541f968 100644 --- a/site/docs/doc/grep.md +++ b/site/docs/doc/grep.md @@ -1,6 +1,6 @@ # grep -[`grep`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-grep) +[`grep`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-grep) ::: tip 类似传统的`grep`命令。 @@ -24,7 +24,7 @@ thread | grep -m 10 -e "TIMED_WAITING|WAITING" WIKI: - https://arthas.aliyun.com/doc/grep + https://arthas.aliyun.com/3.x/doc/grep OPTIONS: -A, --after-context Print NUM lines of trailing context) diff --git a/site/docs/doc/heapdump.md b/site/docs/doc/heapdump.md index 1e7827cd1c7..cd9bdb40423 100644 --- a/site/docs/doc/heapdump.md +++ b/site/docs/doc/heapdump.md @@ -1,6 +1,6 @@ # heapdump -[`heapdump`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-heapdump) +[`heapdump`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-heapdump) ::: tip dump java heap, 类似 jmap 命令的 heap dump 功能。 diff --git a/site/docs/doc/help.md b/site/docs/doc/help.md index f86689e0cac..bba6f8f50b6 100644 --- a/site/docs/doc/help.md +++ b/site/docs/doc/help.md @@ -78,7 +78,7 @@ $ help dashboard -i 2000 WIKI: - https://arthas.aliyun.com/doc/dashboard + https://arthas.aliyun.com/3.x/doc/dashboard OPTIONS: -h, --help this help diff --git a/site/docs/doc/http-api.md b/site/docs/doc/http-api.md index d5f721af545..1f2c2527eee 100644 --- a/site/docs/doc/http-api.md +++ b/site/docs/doc/http-api.md @@ -1,6 +1,6 @@ # Http API -[`Http API`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=case-http-api) +[`Http API`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=case-http-api) ## 概览 @@ -253,12 +253,12 @@ while true; do curl -Ss -XPOST http://localhost:8563/api -d ' "message": "Welcome to arthas!" }, { - "tutorials": "https://arthas.aliyun.com/doc/arthas-tutorials.html", + "tutorials": "https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html", "time": "2020-08-06 15:56:43", "type": "welcome", "jobId": 0, "pid": "7909", - "wiki": "https://arthas.aliyun.com/doc", + "wiki": "https://arthas.aliyun.com/3.x/doc", "version": "3.3.7" }, { diff --git a/site/docs/doc/install-detail.md b/site/docs/doc/install-detail.md index 2b4818b3a68..ac18dd82495 100644 --- a/site/docs/doc/install-detail.md +++ b/site/docs/doc/install-detail.md @@ -2,55 +2,57 @@ ## 快速安装 -### 使用`arthas-boot`(推荐) +### 使用`arthas-boot3`(推荐) -下载`arthas-boot.jar`,然后用`java -jar`的方式启动: +下载`arthas-boot3.jar`,然后用`java -jar`的方式启动: ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` 打印帮助信息: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` - 如果下载速度比较慢,可以使用 aliyun 的镜像: ```bash - java -jar arthas-boot.jar --repo-mirror aliyun --use-http + java -jar arthas-boot3.jar --repo-mirror aliyun --use-http ``` -### 使用`as.sh` +### 使用`as3.sh` Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 +上述命令会下载启动脚本文件 `as3.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 -直接在 shell 下面执行`./as.sh`,就会进入交互界面。 +直接在 shell 下面执行`./as3.sh`,就会进入交互界面。 -也可以执行`./as.sh -h`来获取更多参数信息。 +也可以执行`./as3.sh -h`来获取更多参数信息。 ## 全量安装 -最新版本,点击下载:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version?mirror=aliyun) +从 Github Releases 页下载 -解压后,在文件夹里有`arthas-boot.jar`,直接用`java -jar`的方式启动: +[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) + +解压后,在文件夹里有`arthas-boot3.jar`,直接用`java -jar`的方式启动: ```bash -java -jar arthas-boot.jar +java -jar arthas-boot3.jar ``` 打印帮助信息: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` ## 手动安装 @@ -78,17 +80,13 @@ sudo rpm -i arthas*.rpm 在安装后,可以直接执行: ```bash -as.sh +as3.sh ``` ## 通过 Cloud Toolkit 插件使用 Arthas - [通过 Cloud Toolkit 插件使用 Arthas 一键诊断远程服务器](https://github.com/alibaba/arthas/issues/570) -## 离线帮助文档 - -最新版本离线文档下载:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/doc/latest_version?mirror=aliyun) - ## 卸载 - 在 Linux/Unix/Mac 平台 diff --git a/site/docs/doc/jad.md b/site/docs/doc/jad.md index 28665ea3a9c..035b22d1fac 100644 --- a/site/docs/doc/jad.md +++ b/site/docs/doc/jad.md @@ -1,6 +1,6 @@ # jad -[`jad`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-jad) +[`jad`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-jad) ::: tip 反编译指定已加载类的源码 diff --git a/site/docs/doc/jfr.md b/site/docs/doc/jfr.md index 5b66d98d439..304f85bbdab 100644 --- a/site/docs/doc/jfr.md +++ b/site/docs/doc/jfr.md @@ -1,6 +1,6 @@ # jfr -[`jfr`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-jfr) +[`jfr`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-jfr) ::: tip Java Flight Recorder (JFR) 是一种用于收集有关正在运行的 Java 应用程序的诊断和分析数据的工具。它集成到 Java 虚拟机 (JVM) 中,几乎不会造成性能开销,因此即使在负载较重的生产环境中也可以使用。 diff --git a/site/docs/doc/jvm.md b/site/docs/doc/jvm.md index 18796374e64..0a1d9d06b22 100644 --- a/site/docs/doc/jvm.md +++ b/site/docs/doc/jvm.md @@ -1,6 +1,6 @@ # jvm -[`jvm`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-jvm) +[`jvm`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-jvm) ::: tip 查看当前 JVM 信息 diff --git a/site/docs/doc/keymap.md b/site/docs/doc/keymap.md index 3fb51666a99..5d577cc26a5 100644 --- a/site/docs/doc/keymap.md +++ b/site/docs/doc/keymap.md @@ -1,6 +1,6 @@ # keymap -[`keymap`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-keymap) +[`keymap`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-keymap) `keymap`命令输出当前的快捷键映射表: diff --git a/site/docs/doc/logger.md b/site/docs/doc/logger.md index 86bf30f9839..8ec8a2df502 100644 --- a/site/docs/doc/logger.md +++ b/site/docs/doc/logger.md @@ -1,6 +1,6 @@ # logger -[`logger`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-logger) +[`logger`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-logger) ::: tip 查看 logger 信息,更新 logger level diff --git a/site/docs/doc/manual-install.md b/site/docs/doc/manual-install.md index 3d133b4ce79..8a5a969b681 100644 --- a/site/docs/doc/manual-install.md +++ b/site/docs/doc/manual-install.md @@ -2,7 +2,9 @@ 1. 下载最新版本 - **最新版本,点击下载**:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version?mirror=aliyun) +从 Github Releases 页下载 + +[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) 2. 解压缩 arthas 的压缩包 @@ -18,7 +20,7 @@ sudo su admin rm -rf /home/admin/.arthas/lib/* cd arthas - ./install-local.sh + ./install-local3.sh ``` ::: warning @@ -30,24 +32,24 @@ 启动之前,请确保老版本的 Arthas 已经`stop`. ``` - ./as.sh + ./as3.sh ``` -## 以脚本的方式启动 as.sh/as.bat +## 以脚本的方式启动 as3.sh/as.bat ### Linux/Unix/Mac Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 +上述命令会下载启动脚本文件 `as3.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 -直接在 shell 下面执行`./as.sh`,就会进入交互界面。 +直接在 shell 下面执行`./as3.sh`,就会进入交互界面。 -也可以执行`./as.sh -h`来获取更多参数信息。 +也可以执行`./as3.sh -h`来获取更多参数信息。 ### Windows diff --git a/site/docs/doc/mbean.md b/site/docs/doc/mbean.md index 4980ed77605..71ce0722be4 100644 --- a/site/docs/doc/mbean.md +++ b/site/docs/doc/mbean.md @@ -1,6 +1,6 @@ # mbean -[`mbean`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-mbean) +[`mbean`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-mbean) ::: tip 查看 Mbean 的信息 diff --git a/site/docs/doc/mc.md b/site/docs/doc/mc.md index ee0713b0261..1cad8b40f72 100644 --- a/site/docs/doc/mc.md +++ b/site/docs/doc/mc.md @@ -1,6 +1,6 @@ # mc -[`mc-retransform`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform) +[`mc-retransform`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-mc-retransform) ## 使用参考 diff --git a/site/docs/doc/monitor.md b/site/docs/doc/monitor.md index 0d71db6888a..f361c761a2e 100644 --- a/site/docs/doc/monitor.md +++ b/site/docs/doc/monitor.md @@ -1,6 +1,6 @@ # monitor -[`monitor`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-monitor) +[`monitor`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-monitor) ::: tip 方法执行监控 diff --git a/site/docs/doc/ognl.md b/site/docs/doc/ognl.md index 62acaeddb0a..b82ec716e74 100644 --- a/site/docs/doc/ognl.md +++ b/site/docs/doc/ognl.md @@ -1,6 +1,6 @@ # ognl -[`ognl`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-ognl) +[`ognl`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-ognl) ::: tip 执行 ognl 表达式 diff --git a/site/docs/doc/options.md b/site/docs/doc/options.md index 910ed728181..4ccaa36fbcc 100644 --- a/site/docs/doc/options.md +++ b/site/docs/doc/options.md @@ -1,6 +1,6 @@ # options -[`options`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-options) +[`options`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-options) ::: tip 全局开关 diff --git a/site/docs/doc/perfcounter.md b/site/docs/doc/perfcounter.md index 9343d59b798..c1a5e152239 100644 --- a/site/docs/doc/perfcounter.md +++ b/site/docs/doc/perfcounter.md @@ -1,6 +1,6 @@ # perfcounter -[`perfcounter`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-perfcounter) +[`perfcounter`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-perfcounter) ::: tip 查看当前 JVM 的 Perf Counter 信息 diff --git a/site/docs/doc/profiler.md b/site/docs/doc/profiler.md index 9af3f839f43..4161f347e1e 100644 --- a/site/docs/doc/profiler.md +++ b/site/docs/doc/profiler.md @@ -1,6 +1,6 @@ # profiler -[`profiler`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-profiler) +[`profiler`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-profiler) ::: tip 使用[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)生成火焰图 diff --git a/site/docs/doc/pwd.md b/site/docs/doc/pwd.md index 4d9aa055392..736776c468b 100644 --- a/site/docs/doc/pwd.md +++ b/site/docs/doc/pwd.md @@ -1,6 +1,6 @@ # pwd -[`pwd`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-pwd) +[`pwd`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-pwd) ::: tip 返回当前的工作目录,和 linux 命令类似 diff --git a/site/docs/doc/quick-start.md b/site/docs/doc/quick-start.md index 2c197012a6b..957df0aa4e2 100644 --- a/site/docs/doc/quick-start.md +++ b/site/docs/doc/quick-start.md @@ -1,6 +1,6 @@ # 快速入门 -可以通过下面的方式自己动手实践,也可以通过我们的[在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-basics),跟随教程快速入门。 +可以通过下面的方式自己动手实践,也可以通过我们的[在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=arthas-basics),跟随教程快速入门。 ## 1. 启动 math-game @@ -18,19 +18,19 @@ java -jar math-game.jar 在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败): ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` -- 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot.jar` 或 `sudo -u admin -EH java -jar arthas-boot.jar`。 +- 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot3.jar` 或 `sudo -u admin -EH java -jar arthas-boot3.jar`。 - 如果 attach 不上目标进程,可以查看`~/logs/arthas/` 目录下的日志。 -- 如果下载速度比较慢,可以使用 aliyun 的镜像:`java -jar arthas-boot.jar --repo-mirror aliyun --use-http` -- `java -jar arthas-boot.jar -h` 打印更多参数信息。 +- 如果下载速度比较慢,可以使用 aliyun 的镜像:`java -jar arthas-boot3.jar --repo-mirror aliyun --use-http` +- `java -jar arthas-boot3.jar -h` 打印更多参数信息。 选择应用 java 进程: ```bash -$ $ java -jar arthas-boot.jar +$ $ java -jar arthas-boot3.jar * [1]: 35542 [2]: 71560 math-game.jar ``` @@ -48,7 +48,7 @@ $ $ java -jar arthas-boot.jar `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki: https://arthas.aliyun.com/doc +wiki: https://arthas.aliyun.com/3.x/doc version: 3.0.5.20181127201536 pid: 71560 time: 2018-11-28 19:16:24 @@ -223,7 +223,7 @@ ts=2018-11-28 19:22:35; [cost=29.969732ms] result=@ArrayList[ ] ``` -更多的功能可以查看[进阶教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-advanced)。 +更多的功能可以查看[进阶教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=arthas-advanced)。 ## 7. 退出 arthas diff --git a/site/docs/doc/redefine.md b/site/docs/doc/redefine.md index 3895b13fb0a..0fb918a22df 100644 --- a/site/docs/doc/redefine.md +++ b/site/docs/doc/redefine.md @@ -4,7 +4,7 @@ 推荐使用 [retransform](retransform.md) 命令 ::: -[`mc-redefine`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-redefine) +[`mc-redefine`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-mc-redefine) ::: tip 加载外部的`.class`文件,redefine jvm 已加载的类。 diff --git a/site/docs/doc/reset.md b/site/docs/doc/reset.md index e5d0c126717..f5d558b186d 100644 --- a/site/docs/doc/reset.md +++ b/site/docs/doc/reset.md @@ -1,6 +1,6 @@ # reset -[`reset`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-reset) +[`reset`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-reset) ::: tip 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端`stop`时会重置所有增强过的类 diff --git a/site/docs/doc/retransform.md b/site/docs/doc/retransform.md index 53f4217480b..b10b11bd9a9 100644 --- a/site/docs/doc/retransform.md +++ b/site/docs/doc/retransform.md @@ -1,6 +1,6 @@ # retransform -[`mc-retransform`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-mc-retransform) +[`mc-retransform`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-mc-retransform) ::: tip 加载外部的`.class`文件,retransform jvm 已加载的类。 diff --git a/site/docs/doc/save-log.md b/site/docs/doc/save-log.md index 6d5faa53164..c71629a1d27 100644 --- a/site/docs/doc/save-log.md +++ b/site/docs/doc/save-log.md @@ -1,6 +1,6 @@ # 执行结果存日志 -[`执行结果存日志`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=save-log) +[`执行结果存日志`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=save-log) ::: tip 将命令的结果完整保存在日志文件中,便于后续进行分析 diff --git a/site/docs/doc/sc.md b/site/docs/doc/sc.md index 1484f39f05f..f8a5e8daf44 100644 --- a/site/docs/doc/sc.md +++ b/site/docs/doc/sc.md @@ -1,6 +1,6 @@ # sc -[`sc`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-sc) +[`sc`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-sc) ::: tip 查看 JVM 已加载的类信息 diff --git a/site/docs/doc/sm.md b/site/docs/doc/sm.md index 438213248ed..505ee39eeec 100644 --- a/site/docs/doc/sm.md +++ b/site/docs/doc/sm.md @@ -1,6 +1,6 @@ # sm -[`sm`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials?language=cn&id=command-sm) +[`sm`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=cn&id=command-sm) ::: tip 查看已加载类的方法信息 diff --git a/site/docs/doc/stack.md b/site/docs/doc/stack.md index b640ec13e09..2e92864998d 100644 --- a/site/docs/doc/stack.md +++ b/site/docs/doc/stack.md @@ -1,6 +1,6 @@ # stack -[`stack`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-stack) +[`stack`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-stack) ::: tip 输出当前方法被调用的调用路径 diff --git a/site/docs/doc/start-arthas.md b/site/docs/doc/start-arthas.md index fc79ddfadb7..8529363e1e3 100644 --- a/site/docs/doc/start-arthas.md +++ b/site/docs/doc/start-arthas.md @@ -3,11 +3,11 @@ ## 交互模式启动 ```bash -./as.sh +./as3.sh ``` ```bash -➜ bin git:(develop) ✗ ./as.sh +➜ bin git:(develop) ✗ ./as3.sh Found existing java process, please choose one and input the serial number of the process, eg: 1 . Then hit ENTER. [1]: 3088 org.jetbrains.idea.maven.server.RemoteMavenServer * [2]: 12872 org.apache.catalina.startup.Bootstrap @@ -26,7 +26,7 @@ $ 启动脚本如下: ```bash -./as.sh [@IP:PORT] +./as3.sh [@IP:PORT] ``` ### 参数说明 @@ -39,11 +39,11 @@ $ - 如果不指定 IP 和 PORT,默认是 127.0.0.1 和 3658 - > ./as.sh 12345 + > ./as3.sh 12345 上述命令等价于: - > ./as.sh 12356@127.0.0.1:3658 + > ./as3.sh 12356@127.0.0.1:3658 ### 远程诊断 @@ -55,10 +55,10 @@ telnet 192.168.1.119 3658 ### sudo 支持 -成熟的线上管理环境一般都不会直接开放 JVM 部署用户权限给你,而是通过 sudo-list 来控制和监控用户的越权操作。由于 as.sh 脚本中会对当前用户的环境变量产生感知,所以需要加上 -H 参数 +成熟的线上管理环境一般都不会直接开放 JVM 部署用户权限给你,而是通过 sudo-list 来控制和监控用户的越权操作。由于 as3.sh 脚本中会对当前用户的环境变量产生感知,所以需要加上 -H 参数 ```bash -sudo -u admin -H ./as.sh 12345 +sudo -u admin -H ./as3.sh 12345 ``` ### Windows 环境支持 diff --git a/site/docs/doc/sysenv.md b/site/docs/doc/sysenv.md index 8a73087a86d..6493a1aaacd 100644 --- a/site/docs/doc/sysenv.md +++ b/site/docs/doc/sysenv.md @@ -1,6 +1,6 @@ # sysenv -[`sysenv`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-sysenv) +[`sysenv`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-sysenv) ::: tip 查看当前 JVM 的环境属性(`System Environment Variables`) @@ -20,7 +20,7 @@ sysenv USER WIKI: - https://arthas.aliyun.com/doc/sysenv + https://arthas.aliyun.com/3.x/doc/sysenv OPTIONS: -h, --help this help diff --git a/site/docs/doc/sysprop.md b/site/docs/doc/sysprop.md index 0412b4b626a..1c37f687430 100644 --- a/site/docs/doc/sysprop.md +++ b/site/docs/doc/sysprop.md @@ -1,6 +1,6 @@ # sysprop -[`sysprop`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-sysprop) +[`sysprop`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-sysprop) ::: tip 查看当前 JVM 的系统属性(`System Property`) @@ -21,7 +21,7 @@ sysprop production.mode true WIKI: - https://arthas.aliyun.com/doc/sysprop + https://arthas.aliyun.com/3.x/doc/sysprop OPTIONS: -h, --help this help diff --git a/site/docs/doc/tee.md b/site/docs/doc/tee.md index d865191995e..5c4c69667c0 100644 --- a/site/docs/doc/tee.md +++ b/site/docs/doc/tee.md @@ -1,6 +1,6 @@ # tee -[`tee`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-tee) +[`tee`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-tee) ::: tip 类似传统的`tee`命令, 用于读取标准输入的数据,并将其内容输出成文件。 @@ -22,7 +22,7 @@ tee 指令会从标准输入设备读取数据,将其内容输出到标准输 sysprop | tee -a /path/to/logfile | grep java WIKI: - https://arthas.aliyun.com/doc/tee + https://arthas.aliyun.com/3.x/doc/tee OPTIONS: -a, --append Append to file diff --git a/site/docs/doc/thread.md b/site/docs/doc/thread.md index 8e902749285..38524c4d643 100644 --- a/site/docs/doc/thread.md +++ b/site/docs/doc/thread.md @@ -1,6 +1,6 @@ # thread -[`thread`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-thread) +[`thread`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-thread) ::: tip 查看当前线程信息,查看线程的堆栈 diff --git a/site/docs/doc/trace.md b/site/docs/doc/trace.md index dc301ea8f89..cdf4140844c 100644 --- a/site/docs/doc/trace.md +++ b/site/docs/doc/trace.md @@ -1,6 +1,6 @@ # trace -[`trace`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-trace) +[`trace`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-trace) ::: tip 方法内部调用路径,并输出方法路径上的每个节点上耗时 diff --git a/site/docs/doc/tt.md b/site/docs/doc/tt.md index fee9833ece3..c99320dbf49 100644 --- a/site/docs/doc/tt.md +++ b/site/docs/doc/tt.md @@ -1,6 +1,6 @@ # tt -[`tt`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-tt) +[`tt`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-tt) ::: tip 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 diff --git a/site/docs/doc/tunnel.md b/site/docs/doc/tunnel.md index 991f38e81c7..838b56fff41 100644 --- a/site/docs/doc/tunnel.md +++ b/site/docs/doc/tunnel.md @@ -15,8 +15,6 @@ [https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) -- 从 Maven 仓库下载:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/arthas-tunnel-server/latest_version?mirror=aliyun) - - 从 Github Releases 页下载: [https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) Arthas tunnel server 是一个 spring boot fat jar 应用,直接`java -jar`启动: @@ -42,13 +40,13 @@ Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2 在启动 arthas,可以传递`--tunnel-server`参数,比如: ```bash -as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' +as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' ``` 也可以使用下面的测试地址(不保证一直可用): ```bash -as.sh --tunnel-server 'ws://47.75.156.201:80/ws' +as3.sh --tunnel-server 'ws://47.75.156.201:80/ws' ``` - 如果有特殊需求,可以通过`--agent-id`参数里指定 agentId。默认情况下,会生成随机 ID。 @@ -63,8 +61,8 @@ attach 成功之后,会打印出 agentId,比如: `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.1.2 pid 86183 time 2019-08-30 15:40:53 @@ -95,7 +93,7 @@ id URJZ5L48RPBR2ALI5K4V 如果 arthas agent 配置了 `appName`,则生成的 agentId 会带上`appName`的前缀。 -比如在加上启动参数:`as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp` ,则生成的 agentId 可能是`demoapp_URJZ5L48RPBR2ALI5K4V`。 +比如在加上启动参数:`as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp` ,则生成的 agentId 可能是`demoapp_URJZ5L48RPBR2ALI5K4V`。 Tunnel server 会以`_`做分隔符,提取出`appName`,方便按应用进行管理。 @@ -111,10 +109,10 @@ Tunnel server 会以`_`做分隔符,提取出`appName`,方便按应用进行 **注意,开放管理页面有风险!管理页面没有安全拦截功能,务必自行增加安全措施。** ::: -在本地启动 tunnel-server,然后使用`as.sh` attach,并且指定应用名`--app-name test`: +在本地启动 tunnel-server,然后使用`as3.sh` attach,并且指定应用名`--app-name test`: ``` -$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test +$ as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test telnet connecting to arthas server... current timestamp is 1627539688 Trying 127.0.0.1... Connected to 127.0.0.1. @@ -126,8 +124,8 @@ Escape character is '^]'. `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.5.3 main_class demo.MathGame pid 65825 diff --git a/site/docs/doc/vmoption.md b/site/docs/doc/vmoption.md index 42690bf0611..cf2c6a51963 100644 --- a/site/docs/doc/vmoption.md +++ b/site/docs/doc/vmoption.md @@ -1,6 +1,6 @@ # vmoption -[`vmoption`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-vmoption) +[`vmoption`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-vmoption) ::: tip 查看,更新 VM 诊断相关的参数 diff --git a/site/docs/doc/vmtool.md b/site/docs/doc/vmtool.md index a173b65691d..0336cf485be 100644 --- a/site/docs/doc/vmtool.md +++ b/site/docs/doc/vmtool.md @@ -4,7 +4,7 @@ @since 3.5.1 ::: -[`vmtool`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-vmtool) +[`vmtool`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-vmtool) `vmtool` 利用`JVMTI`接口,实现查询内存对象,强制 GC 等功能。 diff --git a/site/docs/doc/watch.md b/site/docs/doc/watch.md index 3f94a4ee31a..719a24cdd37 100644 --- a/site/docs/doc/watch.md +++ b/site/docs/doc/watch.md @@ -1,6 +1,6 @@ # watch -[`watch`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-watch) +[`watch`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=command-watch) ::: tip 函数执行数据观测 diff --git a/site/docs/doc/web-console.md b/site/docs/doc/web-console.md index 755cccd54df..e7bce55471c 100644 --- a/site/docs/doc/web-console.md +++ b/site/docs/doc/web-console.md @@ -1,6 +1,6 @@ # Web Console -[`Web Console`在线教程](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=case-web-console) +[`Web Console`在线教程](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=cn&id=case-web-console) ## 通过浏览器连接 arthas diff --git a/site/docs/en/doc/advanced-use.md b/site/docs/en/doc/advanced-use.md index 437ccd687db..acbbd239a68 100644 --- a/site/docs/en/doc/advanced-use.md +++ b/site/docs/en/doc/advanced-use.md @@ -69,11 +69,11 @@ It is convenient for running multiple commands in bulk with custom scripts. It c - [Batch Processing](batch-support.md) -## as.sh and arthas-boot tips +## as3.sh and arthas-boot3 tips - Select the process to be attached via the `select` option. -Normally, `as.sh`/`arthas-boot.jar` needs to a pid, bacause the pid will change. +Normally, `as3.sh`/`arthas-boot3.jar` needs to a pid, bacause the pid will change. For example, with `math-game.jar` already started, use the `jps` command to see. @@ -86,7 +86,7 @@ $ jps The `select` option allows you to specify a process name, which is very convenient. ```bash -$ ./as.sh --select math-game +$ ./as3.sh --select math-game Arthas script version: 3.3.6 [INFO] JAVA_HOME: /tmp/java/8.0.222-zulu Arthas home: /Users/admin/.arthas/lib/3.3.6/arthas @@ -108,8 +108,8 @@ Escape character is '^]'. `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.3.6 pid 58883 ``` @@ -118,7 +118,7 @@ pid 58883 After the `3.1.4` version, arthas support user data report. -At startup, use the `stat-url` option, such as: `./as.sh --stat-url 'http://192.168.10.11:8080/api/stat'` +At startup, use the `stat-url` option, such as: `./as3.sh --stat-url 'http://192.168.10.11:8080/api/stat'` There is a sample data report in the tunnel server that users can implement on their own. diff --git a/site/docs/en/doc/arthas-properties.md b/site/docs/en/doc/arthas-properties.md index 65e2168bc4f..73a9d1d890f 100644 --- a/site/docs/en/doc/arthas-properties.md +++ b/site/docs/en/doc/arthas-properties.md @@ -56,7 +56,7 @@ The order of configuration is: command line parameters > System Env > System Pro such as: -- `./as.sh --telnet-port 9999` command line configuration will overwrite the default value `arthas.telnetPort=3658` in `arthas.properties`. +- `./as3.sh --telnet-port 9999` command line configuration will overwrite the default value `arthas.telnetPort=3658` in `arthas.properties`. - If the application itself sets system properties `arthas.telnetPort=8888`, it will override the default value `arthas.telnetPort=3658` in `arthas.properties`. If you want `arthas.properties` to have the highest order, you can configure `arthas.config.overrideAll=true`. diff --git a/site/docs/en/doc/async.md b/site/docs/en/doc/async.md index a93cd21df68..2901a27ffe3 100644 --- a/site/docs/en/doc/async.md +++ b/site/docs/en/doc/async.md @@ -1,6 +1,6 @@ # Arthas Async Jobs -[`Async Jobs` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=case-async-jobs) +[`Async Jobs` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=case-async-jobs) Asynchronous jobs in arthas. The idea is borrowed from [linux jobs](http://man7.org/linux/man-pages/man1/jobs.1p.html). diff --git a/site/docs/en/doc/auth.md b/site/docs/en/doc/auth.md index 9e7580be8d8..f16a01b5444 100644 --- a/site/docs/en/doc/auth.md +++ b/site/docs/en/doc/auth.md @@ -9,7 +9,7 @@ Authenticates the current session When attaching, you can specify a password on the command line. such as: ``` -java -jar arthas-boot.jar --password ppp +java -jar arthas-boot3.jar --password ppp ``` - The user can be specified by the `--username` option, the default value is `arthas`. diff --git a/site/docs/en/doc/batch-support.md b/site/docs/en/doc/batch-support.md index 2c400cce10b..3298be0bd64 100644 --- a/site/docs/en/doc/batch-support.md +++ b/site/docs/en/doc/batch-support.md @@ -30,13 +30,13 @@ Note: Use `-f` to specify the script file. By default the result will be output to the standard output, but you can redirect the output to the file like this: ```bash -./as.sh -f /var/tmp/test.as 56328 > test.out +./as3.sh -f /var/tmp/test.as 56328 > test.out ``` Use `-c` also can specify the commands, like this: ```bash -./as.sh -c 'sysprop; thread' 56328 > test.out +./as3.sh -c 'sysprop; thread' 56328 > test.out ``` ### Step 3: Check the output diff --git a/site/docs/en/doc/cat.md b/site/docs/en/doc/cat.md index 7179875a78c..b9dfd17acb1 100644 --- a/site/docs/en/doc/cat.md +++ b/site/docs/en/doc/cat.md @@ -1,6 +1,6 @@ # cat -[`cat` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-cat) +[`cat` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-cat) ::: tip Concatenate and print files diff --git a/site/docs/en/doc/classloader.md b/site/docs/en/doc/classloader.md index 7ba94174aea..caf88dffd2d 100644 --- a/site/docs/en/doc/classloader.md +++ b/site/docs/en/doc/classloader.md @@ -1,6 +1,6 @@ # classloader -[`classloader` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-classloader) +[`classloader` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-classloader) ::: tip View hierarchy, urls and classes-loading info for the class-loaders. diff --git a/site/docs/en/doc/dashboard.md b/site/docs/en/doc/dashboard.md index 6cd283d1ccc..cf402572589 100644 --- a/site/docs/en/doc/dashboard.md +++ b/site/docs/en/doc/dashboard.md @@ -1,6 +1,6 @@ # dashboard -[`dashboard` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-dashboard) +[`dashboard` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-dashboard) ::: tip This is the real time statistics dashboard for the current system, press `Ctrl+C` to exit. diff --git a/site/docs/en/doc/docker.md b/site/docs/en/doc/docker.md index 194918a7409..e86780e5408 100644 --- a/site/docs/en/doc/docker.md +++ b/site/docs/en/doc/docker.md @@ -67,10 +67,10 @@ RUN export JAVA_HOME $ docker run --name math-game -it hengyunabc/arthas:latest /bin/sh -c "java -jar /opt/arthas/math-game.jar" ``` -1. Start `arthas-boot` for diagnosis +1. Start `arthas-boot3` for diagnosis ```sh - $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar" + $ docker exec -it math-game /bin/sh -c "java -jar /opt/arthas/arthas-boot3.jar" * [1]: 9 jar [INFO] arthas home: /opt/arthas @@ -84,7 +84,7 @@ RUN export JAVA_HOME `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' - wiki: https://arthas.aliyun.com/doc + wiki: https://arthas.aliyun.com/3.x/doc version: 3.0.5 pid: 9 time: 2018-12-18 11:30:36 @@ -93,13 +93,13 @@ RUN export JAVA_HOME ## Diagnose the Java process in Docker ```sh -docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" +docker exec -it ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot3.jar && java -jar arthas-boot3.jar" ``` ## Diagnose the Java process in the container in k8s ```sh -kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar" +kubectl exec -it ${pod} --container ${containerId} -- /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot3.jar && java -jar arthas-boot3.jar" ``` ## Install Arthas into the base Docker image diff --git a/site/docs/en/doc/download.md b/site/docs/en/doc/download.md index 7626e66cb52..9a97aac696c 100644 --- a/site/docs/en/doc/download.md +++ b/site/docs/en/doc/download.md @@ -2,42 +2,34 @@ ## Download full package -### Download from maven central - -Latest Version, Click To Download: [![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version) - ### Download from Github Releases [https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) -### Use as.sh +### Use as3.sh -Download and unzip, find `as.sh` in the directory. Start it in bash: +Download and unzip, find `as3.sh` in the directory. Start it in bash: ```bash -./as.sh +./as3.sh ``` Print usage: ```bash -./as.sh -h +./as3.sh -h ``` -### Use arthas-boot.jar +### Use arthas-boot3.jar -Download and unzip, find `arthas-boot.jar` in the directory. Start with `java` command: +Download and unzip, find `arthas-boot3.jar` in the directory. Start with `java` command: ```bash -java -jar arthas-boot.jar +java -jar arthas-boot3.jar ``` Print usage: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` - -## Download Offline Help Documentation - -Latest Version Documentation, Click To Download:[![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/doc/latest_version) diff --git a/site/docs/en/doc/dump.md b/site/docs/en/doc/dump.md index f0ccd146af2..5b6340a734b 100644 --- a/site/docs/en/doc/dump.md +++ b/site/docs/en/doc/dump.md @@ -1,6 +1,6 @@ # dump -[`dump` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-dump) +[`dump` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-dump) ::: tip Dump the bytecode for the particular classes to the specified directory. diff --git a/site/docs/en/doc/echo.md b/site/docs/en/doc/echo.md index 90fe16a14f8..7882a3af854 100644 --- a/site/docs/en/doc/echo.md +++ b/site/docs/en/doc/echo.md @@ -1,6 +1,6 @@ # echo -[`echo` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-echo) +[`echo` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-echo) ::: tip write arguments to the standard output. diff --git a/site/docs/en/doc/faq.md b/site/docs/en/doc/faq.md index 8f6bb9ab800..fe0ac9ca60b 100644 --- a/site/docs/en/doc/faq.md +++ b/site/docs/en/doc/faq.md @@ -106,6 +106,6 @@ Reference: [https://github.com/alibaba/arthas/issues/362#issuecomment-448185416] ### Why is the new version of Arthas downloaded, but the old version is connected? -For example, the started version of `as.sh/arthas-boot.jar` is 3.5._, but after connecting, the printed arthas version is 3.4._. +For example, the started version of `as3.sh/arthas-boot3.jar` is 3.5._, but after connecting, the printed arthas version is 3.4._. It may be that the target process has been diagnosed with the old version of arthas before. You can execute `stop` to stop the old version of arthas, and then reuse the new version to attach. diff --git a/site/docs/en/doc/getstatic.md b/site/docs/en/doc/getstatic.md index 73c8033d317..cc4f5dc1733 100644 --- a/site/docs/en/doc/getstatic.md +++ b/site/docs/en/doc/getstatic.md @@ -1,6 +1,6 @@ # getstatic -[`getstatic` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-getstatic) +[`getstatic` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-getstatic) ## Usage diff --git a/site/docs/en/doc/grep.md b/site/docs/en/doc/grep.md index bea8e58c48c..7b3ea3fa561 100644 --- a/site/docs/en/doc/grep.md +++ b/site/docs/en/doc/grep.md @@ -1,6 +1,6 @@ # grep -[`grep` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-grep) +[`grep` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-grep) ::: tip Similar to the traditional `grep` command. @@ -24,7 +24,7 @@ Similar to the traditional `grep` command. thread | grep -m 10 -e "TIMED_WAITING|WAITING" WIKI: - https://arthas.aliyun.com/doc/grep + https://arthas.aliyun.com/3.x/doc/grep OPTIONS: -A, --after-context Print NUM lines of trailing context) diff --git a/site/docs/en/doc/heapdump.md b/site/docs/en/doc/heapdump.md index 9bdcf549586..c9c521a58e5 100644 --- a/site/docs/en/doc/heapdump.md +++ b/site/docs/en/doc/heapdump.md @@ -1,6 +1,6 @@ # heapdump -[`heapdump` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-heapdump) +[`heapdump` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-heapdump) ::: tip dump java heap in hprof binary format, like `jmap`. diff --git a/site/docs/en/doc/help.md b/site/docs/en/doc/help.md index 99bf0eda931..3089165805b 100644 --- a/site/docs/en/doc/help.md +++ b/site/docs/en/doc/help.md @@ -78,7 +78,7 @@ $ help dashboard -i 2000 WIKI: - https://arthas.aliyun.com/doc/dashboard + https://arthas.aliyun.com/3.x/doc/dashboard OPTIONS: -h, --help this help diff --git a/site/docs/en/doc/http-api.md b/site/docs/en/doc/http-api.md index 1afbe917522..06efd8b0ddc 100644 --- a/site/docs/en/doc/http-api.md +++ b/site/docs/en/doc/http-api.md @@ -1,6 +1,6 @@ # Http API -[`Http API` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=case-http-api) +[`Http API` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=case-http-api) ## Overview @@ -301,12 +301,12 @@ The response content is as follows: "message": "Welcome to arthas!" }, { - "tutorials": "https://arthas.aliyun.com/doc/arthas-tutorials.html", + "tutorials": "https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html", "time": "2020-08-06 15:56:43", "type": "welcome", "jobId": 0, "pid": "7909", - "wiki": "https://arthas.aliyun.com/doc", + "wiki": "https://arthas.aliyun.com/3.x/doc", "version": "3.3.7" }, { diff --git a/site/docs/en/doc/install-detail.md b/site/docs/en/doc/install-detail.md index 9dfd8e64c21..7eff96eb678 100644 --- a/site/docs/en/doc/install-detail.md +++ b/site/docs/en/doc/install-detail.md @@ -2,47 +2,49 @@ ## Quick installation -### Use `arthas-boot`(Recommended) +### Use `arthas-boot3`(Recommended) -Download`arthas-boot.jar`,Start with `java` command: +Download`arthas-boot3.jar`,Start with `java` command: ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` Print usage: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` -### Use `as.sh` +### Use `as3.sh` You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press _Enter_ to run: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -The command above will download the bootstrap script `as.sh` to the current directory. You can move it to any other place you want, or put its location in `$PATH`. +The command above will download the bootstrap script `as3.sh` to the current directory. You can move it to any other place you want, or put its location in `$PATH`. -You can enter its interactive interface by executing `as.sh`, or execute `as.sh -h` for more help information. +You can enter its interactive interface by executing `as3.sh`, or execute `as3.sh -h` for more help information. ## Full installation -Latest Version, Click To Download: [![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version) +Download from Github Releases -Download and unzip, find `arthas-boot.jar` in the directory. Start with `java` command: +[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) + +Download and unzip, find `arthas-boot3.jar` in the directory. Start with `java` command: ```bash -java -jar arthas-boot.jar +java -jar arthas-boot3.jar ``` Print usage: ```bash -java -jar arthas-boot.jar -h +java -jar arthas-boot3.jar -h ``` ## Manual Installation @@ -71,7 +73,7 @@ sudo rpm -i arthas*.rpm After the installation of packages, execute ```bash -as.sh +as3.sh ``` ## Offline Help Documentation diff --git a/site/docs/en/doc/jad.md b/site/docs/en/doc/jad.md index 1a4c72d466b..9ac93ff3996 100644 --- a/site/docs/en/doc/jad.md +++ b/site/docs/en/doc/jad.md @@ -1,6 +1,6 @@ # jad -[`jad` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-jad) +[`jad` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-jad) ::: tip Decompile the specified classes. diff --git a/site/docs/en/doc/jfr.md b/site/docs/en/doc/jfr.md index e9058256240..7e4cb415c81 100644 --- a/site/docs/en/doc/jfr.md +++ b/site/docs/en/doc/jfr.md @@ -1,6 +1,6 @@ # jfr -[`jfr` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-jfr) +[`jfr` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-jfr) ::: tip Java Flight Recorder (JFR) is a tool for collecting diagnostic and profiling data about a running Java application. It is integrated into the Java Virtual Machine (JVM) and causes almost no performance overhead, so it can be used even in heavily loaded production environments. diff --git a/site/docs/en/doc/jvm.md b/site/docs/en/doc/jvm.md index 5695c8619b4..09ca655eb18 100644 --- a/site/docs/en/doc/jvm.md +++ b/site/docs/en/doc/jvm.md @@ -1,6 +1,6 @@ # jvm -[`jvm` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-jvm) +[`jvm` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-jvm) ::: tip Check the current JVM's info diff --git a/site/docs/en/doc/keymap.md b/site/docs/en/doc/keymap.md index 3414c95c9cb..514c51ac911 100644 --- a/site/docs/en/doc/keymap.md +++ b/site/docs/en/doc/keymap.md @@ -1,6 +1,6 @@ # keymap -[`keymap` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-keymap) +[`keymap` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-keymap) Use `keymap` command to print the current keymap: diff --git a/site/docs/en/doc/logger.md b/site/docs/en/doc/logger.md index 736ed77e54f..9d6655b4929 100644 --- a/site/docs/en/doc/logger.md +++ b/site/docs/en/doc/logger.md @@ -1,6 +1,6 @@ # logger -[`logger` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-logger) +[`logger` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-logger) ::: tip Print the logger information, update the logger level diff --git a/site/docs/en/doc/manual-install.md b/site/docs/en/doc/manual-install.md index 90b1c4d99c4..3ff2ccbb8be 100644 --- a/site/docs/en/doc/manual-install.md +++ b/site/docs/en/doc/manual-install.md @@ -2,7 +2,9 @@ 1. Download the latest version - **Latest version, Click To Download**: [![](https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square "Arthas")](https://arthas.aliyun.com/download/latest_version) +Download from Github Releases + +[https://github.com/alibaba/arthas/releases](https://github.com/alibaba/arthas/releases) 2. Unzip zip file @@ -18,7 +20,7 @@ sudo su admin rm -rf /home/admin/.arthas/lib/* # remove all the leftover of the old outdated Arthas cd arthas - ./install-local.sh # switch the user based on the owner of the target Java process. + ./install-local3.sh # switch the user based on the owner of the target Java process. ``` 4. Start Arthas @@ -26,22 +28,22 @@ Make sure `stop` the old Arthas server before start. ```bash - ./as.sh + ./as3.sh ``` -## Startup with as.sh/as.bat +## Startup with as3.sh/as.bat ### Linux/Unix/Mac You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press _Enter_ to run: ```bash -curl -L https://arthas.aliyun.com/install.sh | sh +curl -L https://arthas.aliyun.com/install3.sh | sh ``` -The command above will download the bootstrap script `as.sh` to the current directory. You can move it the any other place you want, or put its location in `$PATH`. +The command above will download the bootstrap script `as3.sh` to the current directory. You can move it the any other place you want, or put its location in `$PATH`. -You can enter its interactive interface by executing `as.sh`, or execute `as.sh -h` for more help information. +You can enter its interactive interface by executing `as3.sh`, or execute `as3.sh -h` for more help information. ### Windows diff --git a/site/docs/en/doc/mbean.md b/site/docs/en/doc/mbean.md index 7f4ed58dc12..5e1c9e3abed 100644 --- a/site/docs/en/doc/mbean.md +++ b/site/docs/en/doc/mbean.md @@ -1,6 +1,6 @@ # mbean -[`mbean` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-mbean) +[`mbean` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-mbean) ::: tip show Mbean information diff --git a/site/docs/en/doc/mc.md b/site/docs/en/doc/mc.md index c5d17914216..d3379f77e28 100644 --- a/site/docs/en/doc/mc.md +++ b/site/docs/en/doc/mc.md @@ -1,6 +1,6 @@ # mc -[`mc-retransform` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-retransform) +[`mc-retransform` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-mc-retransform) ## Usage diff --git a/site/docs/en/doc/monitor.md b/site/docs/en/doc/monitor.md index 9d00ec41cee..5001f178ae1 100644 --- a/site/docs/en/doc/monitor.md +++ b/site/docs/en/doc/monitor.md @@ -1,6 +1,6 @@ # monitor -[`monitor` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-monitor) +[`monitor` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-monitor) ::: tip Monitor method invocation. diff --git a/site/docs/en/doc/ognl.md b/site/docs/en/doc/ognl.md index 2ce1fb44c52..21a08a4b1f9 100644 --- a/site/docs/en/doc/ognl.md +++ b/site/docs/en/doc/ognl.md @@ -1,6 +1,6 @@ # ognl -[`ognl` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-ognl) +[`ognl` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-ognl) ::: tip Execute ognl expression. diff --git a/site/docs/en/doc/options.md b/site/docs/en/doc/options.md index 59c38070135..de54713d5ac 100644 --- a/site/docs/en/doc/options.md +++ b/site/docs/en/doc/options.md @@ -1,6 +1,6 @@ # options -[`options` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-options) +[`options` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-options) ::: tip Global options diff --git a/site/docs/en/doc/perfcounter.md b/site/docs/en/doc/perfcounter.md index 491b7e143f7..94932b23a96 100644 --- a/site/docs/en/doc/perfcounter.md +++ b/site/docs/en/doc/perfcounter.md @@ -1,6 +1,6 @@ # perfcounter -[`perfcounter` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-perfcounter) +[`perfcounter` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-perfcounter) ::: tip Check the current JVM Perf Counter information. diff --git a/site/docs/en/doc/profiler.md b/site/docs/en/doc/profiler.md index 031aed182b0..529ef354aab 100644 --- a/site/docs/en/doc/profiler.md +++ b/site/docs/en/doc/profiler.md @@ -1,6 +1,6 @@ # profiler -[`profiler` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-profiler) +[`profiler` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-profiler) ::: tip Generate a flame graph using [async-profiler](https://github.com/jvm-profiling-tools/async-profiler) diff --git a/site/docs/en/doc/pwd.md b/site/docs/en/doc/pwd.md index a53a811c4cb..33b4cd96f62 100644 --- a/site/docs/en/doc/pwd.md +++ b/site/docs/en/doc/pwd.md @@ -1,6 +1,6 @@ # pwd -[`pwd` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-pwd) +[`pwd` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-pwd) ::: tip Return working directory name diff --git a/site/docs/en/doc/quick-start.md b/site/docs/en/doc/quick-start.md index 378afa61b2b..12bf2db90a8 100644 --- a/site/docs/en/doc/quick-start.md +++ b/site/docs/en/doc/quick-start.md @@ -1,6 +1,6 @@ # Quick Start -You can practice it yourself by following the instructions below, or you can use our [online tutorials](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=arthas-basics) to get started quickly. +You can practice it yourself by following the instructions below, or you can use our [online tutorials](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=arthas-basics) to get started quickly. ## 1. Start math-game @@ -20,18 +20,18 @@ The source code of `math-game`: [View](https://github.com/alibaba/arthas/blob/ma Execute the following command in the command line: ```bash -curl -O https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar +curl -O https://arthas.aliyun.com/arthas-boot3.jar +java -jar arthas-boot3.jar ``` -- The user to run this command _MUST_ have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot.jar` or `sudo -u admin -EH java -jar arthas-boot.jar` +- The user to run this command _MUST_ have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot3.jar` or `sudo -u admin -EH java -jar arthas-boot3.jar` - If you cannot be able to attach to the target process, please check the logs under `~/logs/arthas` for troubleshooting. -- `java -jar arthas-boot.jar -h` print usage. +- `java -jar arthas-boot3.jar -h` print usage. Select the target Java process to attach: ```bash -$ $ java -jar arthas-boot.jar +$ $ java -jar arthas-boot3.jar * [1]: 35542 [2]: 71560 math-game.jar ``` @@ -49,7 +49,7 @@ The `math-game` process is the second as shown above, press '2' then 'Enter'. Ar `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki: https://arthas.aliyun.com/doc +wiki: https://arthas.aliyun.com/3.x/doc version: 3.0.5.20181127201536 pid: 71560 time: 2018-11-28 19:16:24 @@ -224,7 +224,7 @@ ts=2018-11-28 19:22:35; [cost=29.969732ms] result=@ArrayList[ ] ``` -Pls. refer to [Arthas advanced](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=arthas-advanced) for more information. +Pls. refer to [Arthas advanced](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=arthas-advanced) for more information. ## 7. Exit Arthas diff --git a/site/docs/en/doc/redefine.md b/site/docs/en/doc/redefine.md index dc35bd8c735..28d05c200d5 100644 --- a/site/docs/en/doc/redefine.md +++ b/site/docs/en/doc/redefine.md @@ -4,7 +4,7 @@ Recommend to use the [retransform](retransform.md) command. ::: -[`mc-redefine` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-redefine) +[`mc-redefine` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-mc-redefine) ::: tip Load the external `*.class` files to re-define the loaded classes in JVM. diff --git a/site/docs/en/doc/reset.md b/site/docs/en/doc/reset.md index 39c2357f322..be25d92db86 100644 --- a/site/docs/en/doc/reset.md +++ b/site/docs/en/doc/reset.md @@ -1,6 +1,6 @@ # reset -[`reset` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-reset) +[`reset` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-reset) ::: tip Reset all classes that have been enhanced by Arthas. These enhanced classes will also be reset when Arthas server is `stop`. diff --git a/site/docs/en/doc/retransform.md b/site/docs/en/doc/retransform.md index 888fad26e6f..e5d50a753fb 100644 --- a/site/docs/en/doc/retransform.md +++ b/site/docs/en/doc/retransform.md @@ -1,6 +1,6 @@ # retransform -[`mc-retransform` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-mc-retransform) +[`mc-retransform` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-mc-retransform) ::: tip Load the external `*.class` files to retransform the loaded classes in JVM. diff --git a/site/docs/en/doc/save-log.md b/site/docs/en/doc/save-log.md index a3c8791d444..9564933de1e 100644 --- a/site/docs/en/doc/save-log.md +++ b/site/docs/en/doc/save-log.md @@ -1,6 +1,6 @@ # Log command outputs -[`Log command outputs` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=save-log) +[`Log command outputs` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=save-log) ::: tip Log command outputs for later analysis diff --git a/site/docs/en/doc/sc.md b/site/docs/en/doc/sc.md index 2d961222fb9..eb50968a363 100644 --- a/site/docs/en/doc/sc.md +++ b/site/docs/en/doc/sc.md @@ -1,6 +1,6 @@ # sc -[`sc` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-sc) +[`sc` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-sc) ::: tip Search classes loaded by JVM. diff --git a/site/docs/en/doc/sm.md b/site/docs/en/doc/sm.md index 68f7d0def50..125bbe70eaf 100644 --- a/site/docs/en/doc/sm.md +++ b/site/docs/en/doc/sm.md @@ -1,6 +1,6 @@ # sm -[`sm` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials?language=en&id=command-sm) +[`sm` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials?language=en&id=command-sm) ::: tip Search method from the loaded classes. diff --git a/site/docs/en/doc/stack.md b/site/docs/en/doc/stack.md index 61e48bed15a..322d4c7b616 100644 --- a/site/docs/en/doc/stack.md +++ b/site/docs/en/doc/stack.md @@ -1,6 +1,6 @@ # stack -[`stack` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-stack) +[`stack` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-stack) ::: tip Print out the full call stack of the current method. diff --git a/site/docs/en/doc/start-arthas.md b/site/docs/en/doc/start-arthas.md index 564fe4b341c..12767bbfe6b 100644 --- a/site/docs/en/doc/start-arthas.md +++ b/site/docs/en/doc/start-arthas.md @@ -3,11 +3,11 @@ ## Interactive Mode ```bash -./as.sh +./as3.sh ``` ```bash -➜ bin git:(develop) ✗ ./as.sh +➜ bin git:(develop) ✗ ./as3.sh Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. [1]: 3088 org.jetbrains.idea.maven.server.RemoteMavenServer * [2]: 12872 org.apache.catalina.startup.Bootstrap @@ -26,7 +26,7 @@ $ Startup script is as follows: ```bash -./as.sh [@IP:PORT] +./as3.sh [@IP:PORT] ``` ### Parameter Description @@ -39,11 +39,11 @@ Startup script is as follows: - If IP and PORT are not specified, then the default values are 127.0.0.1 and 3658 - > ./as.sh 12345 + > ./as3.sh 12345 Equivalent to: - > ./as.sh 12356@127.0.0.1:3658 + > ./as3.sh 12356@127.0.0.1:3658 ### Remote Diagnosis @@ -55,10 +55,10 @@ telnet 192.168.1.119 3658 ### sudo Support -Usually online environment will only grant users privilege as low as possible, instead, all advanced operations are through sudo-list. Since `as.sh` script takes into account the current effective user, it is possible to run the script in the other rule, by specifying `-H` option like this: +Usually online environment will only grant users privilege as low as possible, instead, all advanced operations are through sudo-list. Since `as3.sh` script takes into account the current effective user, it is possible to run the script in the other rule, by specifying `-H` option like this: ```bash -sudo -u admin -H ./as.sh 12345 +sudo -u admin -H ./as3.sh 12345 ``` ### Windows Support diff --git a/site/docs/en/doc/sysenv.md b/site/docs/en/doc/sysenv.md index 378ea38c9ec..e631b73f932 100644 --- a/site/docs/en/doc/sysenv.md +++ b/site/docs/en/doc/sysenv.md @@ -1,6 +1,6 @@ # sysenv -[`sysenv` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-sysenv) +[`sysenv` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-sysenv) ::: tip View the current JVM environment variables. @@ -20,7 +20,7 @@ View the current JVM environment variables. sysenv USER WIKI: - https://arthas.aliyun.com/doc/sysenv + https://arthas.aliyun.com/3.x/doc/sysenv OPTIONS: -h, --help this help diff --git a/site/docs/en/doc/sysprop.md b/site/docs/en/doc/sysprop.md index 08990e8bdf2..c270ace2670 100644 --- a/site/docs/en/doc/sysprop.md +++ b/site/docs/en/doc/sysprop.md @@ -1,6 +1,6 @@ # sysprop -[`sysprop` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-sysprop) +[`sysprop` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-sysprop) ::: tip Examine the system properties from the target JVM @@ -21,7 +21,7 @@ Examine the system properties from the target JVM sysprop production.mode true WIKI: - https://arthas.aliyun.com/doc/sysprop + https://arthas.aliyun.com/3.x/doc/sysprop OPTIONS: -h, --help this help diff --git a/site/docs/en/doc/tee.md b/site/docs/en/doc/tee.md index 2b9d4a6f054..71d32db4af8 100644 --- a/site/docs/en/doc/tee.md +++ b/site/docs/en/doc/tee.md @@ -1,6 +1,6 @@ # tee -[`tee` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-tee) +[`tee` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-tee) ::: tip Similar to the traditional `tee` command, it is used to read standard input data and output its contents into a file. @@ -22,7 +22,7 @@ Similar to the traditional `tee` command, it is used to read standard input data sysprop | tee -a /path/to/logfile | grep java WIKI: - https://arthas.aliyun.com/doc/tee + https://arthas.aliyun.com/3.x/doc/tee OPTIONS: -a, --append Append to file diff --git a/site/docs/en/doc/thread.md b/site/docs/en/doc/thread.md index d3a4007c117..f64e10ade7e 100644 --- a/site/docs/en/doc/thread.md +++ b/site/docs/en/doc/thread.md @@ -1,6 +1,6 @@ # thread -[`thread` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-thread) +[`thread` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-thread) ::: tip Check the basic info and stack trace of the target thread. diff --git a/site/docs/en/doc/trace.md b/site/docs/en/doc/trace.md index ad842ec4e2c..be04c47c375 100644 --- a/site/docs/en/doc/trace.md +++ b/site/docs/en/doc/trace.md @@ -1,6 +1,6 @@ # trace -[`trace` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-trace) +[`trace` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-trace) ::: tip Trace method calling path, and output the time cost for each node in the path. diff --git a/site/docs/en/doc/tt.md b/site/docs/en/doc/tt.md index 6af5909d677..7564d5ef14d 100644 --- a/site/docs/en/doc/tt.md +++ b/site/docs/en/doc/tt.md @@ -1,6 +1,6 @@ # tt -[`tt` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-tt) +[`tt` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-tt) Check the `parameters`, `return values` and `exceptions` of the methods at different times. diff --git a/site/docs/en/doc/tunnel.md b/site/docs/en/doc/tunnel.md index 2319ffd44f7..a3b45e6ad68 100644 --- a/site/docs/en/doc/tunnel.md +++ b/site/docs/en/doc/tunnel.md @@ -38,13 +38,13 @@ Using generated security password: f1dca050-3777-48f4-a577-6367e55a78a2 When starting arthas, you can use the `--tunnel-server` parameter, for example: ```bash -as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' +as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' ``` You can also use the following test address (not guaranteed to be available all the time): ```bash -as.sh --tunnel-server 'ws://47.75.156.201:80/ws' +as3.sh --tunnel-server 'ws://47.75.156.201:80/ws' ``` - You can specify the agentId by the `--agent-id` parameter. By default, a random ID is generated. @@ -59,8 +59,8 @@ After Arthas attach succeeds, the agentId will be printed, such as: `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.1.2 pid 86183 time 2019-08-30 15:40:53 @@ -91,7 +91,7 @@ Note that the agentId must be unique, otherwise it will conflict on the tunnel s If the arthas agent is configured with `appName`, the generated agentId will be prefixed with `appName`. -For example, if you add the startup parameter `as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp`, the generated agentId might be `demoapp_URJZ5L48RPBR2ALI5K4V`. +For example, if you add the startup parameter `as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name demoapp`, the generated agentId might be `demoapp_URJZ5L48RPBR2ALI5K4V`. Tunnel server will use `_` as a delimiter to extract `appName`, which is convenient to manage by application. @@ -107,10 +107,10 @@ Need to configure `arthas.enable-detail-pages=true` in `application.properties` **Attention, opening admin pages is risky! There is no security blocking function on the management page, you must add security measures by yourself.** ::: -Start the tunnel-server locally, then use `as.sh` attach, and specify the application name `--app-name test`: +Start the tunnel-server locally, then use `as3.sh` attach, and specify the application name `--app-name test`: ``` -$ as.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test +$ as3.sh --tunnel-server 'ws://127.0.0.1:7777/ws' --app-name test telnet connecting to arthas server... current timestamp is 1627539688 Trying 127.0.0.1... Connected to 127.0.0.1. @@ -122,8 +122,8 @@ Escape character is '^]'. `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' -wiki https://arthas.aliyun.com/doc -tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html +wiki https://arthas.aliyun.com/3.x/doc +tutorials https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html version 3.5.3 main_class demo.MathGame pid 65825 diff --git a/site/docs/en/doc/vmoption.md b/site/docs/en/doc/vmoption.md index 1ee11770081..fadf5fdb7f6 100644 --- a/site/docs/en/doc/vmoption.md +++ b/site/docs/en/doc/vmoption.md @@ -1,6 +1,6 @@ # vmoption -[`vmoption` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-vmoption) +[`vmoption` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-vmoption) ::: tip Display, and update the vm diagnostic options. diff --git a/site/docs/en/doc/vmtool.md b/site/docs/en/doc/vmtool.md index 6bd2f9a8151..402e870e47e 100644 --- a/site/docs/en/doc/vmtool.md +++ b/site/docs/en/doc/vmtool.md @@ -4,7 +4,7 @@ @since 3.5.1 ::: -[`vmtool` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-vmtool) +[`vmtool` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-vmtool) `vmtool` uses the `JVMTI` to support `getInstances` in jvm and `forceGc`. diff --git a/site/docs/en/doc/watch.md b/site/docs/en/doc/watch.md index 808ed244da4..9e300454aec 100644 --- a/site/docs/en/doc/watch.md +++ b/site/docs/en/doc/watch.md @@ -1,6 +1,6 @@ # watch -[`watch` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-watch) +[`watch` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=command-watch) Monitor methods in data aspect including `return values`, `exceptions` and `parameters`. diff --git a/site/docs/en/doc/web-console.md b/site/docs/en/doc/web-console.md index 29eac2d9283..17f7ab9c229 100644 --- a/site/docs/en/doc/web-console.md +++ b/site/docs/en/doc/web-console.md @@ -1,6 +1,6 @@ # Web Console -[`Web Console` online tutorial](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=case-web-console) +[`Web Console` online tutorial](https://arthas.aliyun.com/3.x/doc/arthas-tutorials.html?language=en&id=case-web-console) ## Connect arthas through the browser diff --git a/site/yarn.lock b/site/yarn.lock index 19f5015f790..678a41700fe 100644 --- a/site/yarn.lock +++ b/site/yarn.lock @@ -76,7 +76,7 @@ "@algolia/requester-common" "4.14.2" "@algolia/transporter" "4.14.2" -"@algolia/client-search@4.14.2": +"@algolia/client-search@^4.9.1", "@algolia/client-search@4.14.2": version "4.14.2" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz" integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== @@ -130,7 +130,7 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz" integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== -"@docsearch/css@3.2.1", "@docsearch/css@^3.2.1": +"@docsearch/css@^3.2.1", "@docsearch/css@3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz" integrity sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g== @@ -143,7 +143,7 @@ "@docsearch/react" "3.2.1" preact "^10.0.0" -"@docsearch/react@3.2.1", "@docsearch/react@^3.2.1": +"@docsearch/react@^3.2.1", "@docsearch/react@3.2.1": version "3.2.1" resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz" integrity sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ== @@ -153,16 +153,6 @@ "@docsearch/css" "3.2.1" algoliasearch "^4.0.0" -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - -"@esbuild/linux-loong64@0.15.5": - version "0.15.5" - resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82" - integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A== - "@mdit-vue/plugin-component@^0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-0.10.0.tgz" @@ -220,7 +210,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/shared@0.10.0", "@mdit-vue/shared@^0.10.0": +"@mdit-vue/shared@^0.10.0", "@mdit-vue/shared@0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/shared/-/shared-0.10.0.tgz" integrity sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg== @@ -229,7 +219,7 @@ "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/types@0.10.0", "@mdit-vue/types@^0.10.0": +"@mdit-vue/types@^0.10.0", "@mdit-vue/types@0.10.0": version "0.10.0" resolved "https://registry.npmjs.org/@mdit-vue/types/-/types-0.10.0.tgz" integrity sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw== @@ -242,7 +232,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -409,7 +399,7 @@ "@vue/compiler-ssr" "3.2.38" "@vue/shared" "3.2.38" -"@vue/shared@3.2.38", "@vue/shared@^3.2.37": +"@vue/shared@^3.2.37", "@vue/shared@3.2.38": version "3.2.38" resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.38.tgz" integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg== @@ -445,7 +435,7 @@ envinfo "^7.8.1" esbuild "^0.15.5" -"@vuepress/client@2.0.0-beta.51": +"@vuepress/client@^2.0.0-beta.50", "@vuepress/client@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-beta.51.tgz" integrity sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw== @@ -488,7 +478,7 @@ markdown-it-emoji "^2.0.2" mdurl "^1.0.1" -"@vuepress/plugin-active-header-links@2.0.0-beta.51", "@vuepress/plugin-active-header-links@^2.0.0-beta.51": +"@vuepress/plugin-active-header-links@^2.0.0-beta.51", "@vuepress/plugin-active-header-links@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.51.tgz" integrity sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw== @@ -600,7 +590,7 @@ "@vuepress/core" "2.0.0-beta.51" prismjs "^1.28.0" -"@vuepress/plugin-theme-data@2.0.0-beta.51", "@vuepress/plugin-theme-data@^2.0.0-beta.51": +"@vuepress/plugin-theme-data@^2.0.0-beta.51", "@vuepress/plugin-theme-data@2.0.0-beta.51": version "2.0.0-beta.51" resolved "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.51.tgz" integrity sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ== @@ -683,7 +673,7 @@ dependencies: vue-demi "*" -algoliasearch@^4.0.0: +algoliasearch@^4.0.0, algoliasearch@^4.9.1: version "4.14.2" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz" integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== @@ -771,7 +761,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: +browserslist@^4.21.3, "browserslist@>= 4.21.0": version "4.21.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== @@ -804,7 +794,7 @@ chalk@^5.0.0, chalk@^5.0.1: resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -901,206 +891,6 @@ envinfo@^7.8.1: resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8" - integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-android-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193" - integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d" - integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-darwin-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz" - integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a" - integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-freebsd-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd" - integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - -esbuild-linux-32@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32" - integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ== - -esbuild-linux-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" - integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== - -esbuild-linux-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9" - integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg== - -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d" - integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-arm@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5" - integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-mips64le@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981" - integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-ppc64le@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474" - integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-riscv64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896" - integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-linux-s390x@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae" - integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-netbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8" - integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-openbsd-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035" - integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA== - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-sunos-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141" - integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-32@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7" - integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9" - integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - -esbuild-windows-arm64@0.15.5: - version "0.15.5" - resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b" - integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA== - esbuild@^0.14.47: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -1246,11 +1036,6 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -1446,7 +1231,7 @@ markdown-it-emoji@^2.0.2: resolved "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz" integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== -markdown-it@^13.0.1: +markdown-it@*, markdown-it@^13.0.1: version "13.0.1" resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz" integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== @@ -1605,7 +1390,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.10, postcss@^8.4.16: +postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.16: version "8.4.16" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== @@ -1672,13 +1457,6 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -"rollup@>=2.75.6 <2.77.0 || ~2.77.0": - version "2.77.3" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz" - integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== - optionalDependencies: - fsevents "~2.3.2" - rollup@^2.78.1: version "2.78.1" resolved "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz" @@ -1686,6 +1464,13 @@ rollup@^2.78.1: optionalDependencies: fsevents "~2.3.2" +"rollup@>=2.75.6 <2.77.0 || ~2.77.0": + version "2.77.3" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" @@ -1698,7 +1483,7 @@ safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.54.5, sass@^1.54.8: +sass@*, sass@^1.54.5, sass@^1.54.8: version "1.54.8" resolved "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz" integrity sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww== @@ -1742,7 +1527,7 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -1831,7 +1616,7 @@ util-deprecate@^1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -vite@~3.0.9: +vite@^3.0.0, vite@~3.0.9: version "3.0.9" resolved "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz" integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw== @@ -1860,7 +1645,7 @@ vue-router@^4.1.4, vue-router@^4.1.5: dependencies: "@vue/devtools-api" "^6.1.4" -vue@^3.2.37, vue@^3.2.38: +"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.37, vue@^3.2.38, vue@3.2.38: version "3.2.38" resolved "https://registry.npmjs.org/vue/-/vue-3.2.38.tgz" integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q== diff --git a/tutorials/katacoda/README.md b/tutorials/katacoda/README.md deleted file mode 100644 index 8a447967054..00000000000 --- a/tutorials/katacoda/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Interactive Katacoda Online Tutorials for Arthas - -[![](http://shields.katacoda.com/katacoda/arthas/count.svg)](https://www.katacoda.com/arthas "Get your profile on Katacoda.com") - -[中文说明/Chinese Documentation](README_CN.md) - -## Online Tutorial Usages - -1. First visit the online tutorial: https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en , select the course you want to study from the menu: -![](https://user-images.githubusercontent.com/43995067/90310125-2a9bf480-df21-11ea-819d-2713f22f4145.png) - -2. The course introduction page will indicate the difficulty of the course and the time required to help you understand the basic information of the course. click `START SCENARIO` to start learning. -![](https://user-images.githubusercontent.com/43995067/90310168-9ed69800-df21-11ea-93cf-a01b4a41c66b.png) - -3. Enter the course, the left side is the description of this step, and the right side is a ready terminal, which can be used directly. Click the black blocks on the left to execute commands in the right: -![](https://user-images.githubusercontent.com/43995067/90310223-3d62f900-df22-11ea-936c-deb950e61f9e.png) - -4. Click the tab on the right to switch between terminals. Then follow the step-by-step instructions to complete the learning step by step: -![](https://user-images.githubusercontent.com/43995067/90310282-b8c4aa80-df22-11ea-8052-3799277b748e.png) - -## Contribution Guide - -If you want to contribute to the Arthas online tutorials, you are welcome to submit pull requests for the Arthas online tutorials. - -Visit https://www.katacoda.com/docs to learn more about creating Katacoda scenarios. You can also refer to the article of Alibaba cloud developer community here(In Chinese): https://developer.aliyun.com/article/752183 - -For examples of the scenarios folder, visit https://github.com/katacoda/scenario-example - -After that, if you have finished doing writing jobs, You just need to put your scenarios folder here in this folder, and add links in the related pages, that's all. - -Menu page source code is at https://github.com/alibaba/arthas/blob/master/site/src/site/sphinx/_include_html/arthas-tutorials.html - -## About - -This project is a part of [Alibaba Summer of Code 2020](https://www.alibabacloud.com/campaign/summerofcode2020) done by [@HollowMan6](https://github.com/HollowMan6), for more information please visit: https://github.com/HollowMan6/My-Alibaba-Summer-of-Code - -Issue: [#847](https://github.com/alibaba/arthas/issues/847) diff --git a/tutorials/katacoda/README_CN.md b/tutorials/katacoda/README_CN.md deleted file mode 100644 index 6950c28257c..00000000000 --- a/tutorials/katacoda/README_CN.md +++ /dev/null @@ -1,37 +0,0 @@ -# Arthas交互式Katacoda在线教程 - -[![](http://shields.katacoda.com/katacoda/arthas/count.svg)](https://www.katacoda.com/arthas "Get your profile on Katacoda.com") - -English version goes [here](README.md). - -## 在线教程使用方法 - -1. 首先访问在线教程:https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn ,从菜单中选择你想要学习的课程: -![](https://images.gitee.com/uploads/images/2020/0814/211330_e71ef0ca_7637131.png) - -2. 课程介绍页面会标明课程的难度和需要的时间,帮助你了解该课程的基本信息。点击`START SCENARIO`开始学习。 -![](https://images.gitee.com/uploads/images/2020/0814/212507_4a02d8aa_7637131.png) - -3. 进入课程,左侧是该步骤说明,右侧是一个已经准备好的终端,直接可以使用。点击左侧黑块部分就可以在右侧执行: -![](https://images.gitee.com/uploads/images/2020/0814/213005_62d85818_7637131.png) - -4. 点击右侧标签可以切换终端。之后就是跟着步骤说明,一步步的完成学习即可: -![](https://images.gitee.com/uploads/images/2020/0814/213458_43bb4e3f_7637131.png) - -## 贡献指南 - -如果你想为Arthas在线教程做出贡献,欢迎为Arthas在线教程提交Pull Request。 - -访问https://www.katacoda.com/docs 来了解更多创建Katacoda教程的信息,也可以参考这里的一篇阿里云开发者社区的推送:https://developer.aliyun.com/article/752183 - -Katacoda教程文件夹的示例:https://github.com/katacoda/scenario-example - -之后,如果你已经完成了编写,你只需要把你的教程文件夹放在此文件夹,并在相关页面中添加链接。 - -菜单页面源代码位于:https://github.com/alibaba/arthas/blob/master/site/src/site/sphinx/_include_html/arthas-tutorials.html - -## 关于 - -此项目为[阿里巴巴编程之夏2020](https://developer.aliyun.com/topic/summerofcode2020)的一部分,由[@HollowMan6](https://github.com/HollowMan6)完成,更多信息请参见https://github.com/HollowMan6/My-Alibaba-Summer-of-Code - -Issue: [#847](https://github.com/alibaba/arthas/issues/847) diff --git a/tutorials/katacoda/arthas-advanced-cn/arthas-boot-details.md b/tutorials/katacoda/arthas-advanced-cn/arthas-boot-details.md deleted file mode 100644 index 7ae4f74362a..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/arthas-boot-details.md +++ /dev/null @@ -1,30 +0,0 @@ - - -`arthas-boot.jar` 支持很多参数,可以执行 `java -jar arthas-boot.jar -h`{{execute T2}} 来查看。 - -## 允许外部访问 - -默认情况下, arthas server侦听的是 `127.0.0.1` 这个IP,如果希望远程可以访问,可以使用`--target-ip`的参数。 - -`java -jar arthas-boot.jar --target-ip`{{execute T2}} - - -## 列出所有的版本 - - -`java -jar arthas-boot.jar --versions`{{execute T2}} - -使用指定版本: - -`java -jar arthas-boot.jar --use-version 3.1.0`{{execute T2}} - -## 只侦听Telnet端口,不侦听HTTP端口 - -`java -jar arthas-boot.jar --telnet-port 9999 --http-port -1`{{execute T2}} - -## 打印运行的详情 - -`java -jar arthas-boot.jar -v`{{execute T2}} - - - diff --git a/tutorials/katacoda/arthas-advanced-cn/arthas-boot.md b/tutorials/katacoda/arthas-advanced-cn/arthas-boot.md deleted file mode 100644 index bd42b144e6d..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/arthas-advanced-cn/case-classloader.md b/tutorials/katacoda/arthas-advanced-cn/case-classloader.md deleted file mode 100644 index a7754a2775b..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-classloader.md +++ /dev/null @@ -1,139 +0,0 @@ - - -下面介绍`classloader`命令的功能。 - -先访问一个jsp网页,触发jsp的加载: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### 列出所有ClassLoader - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* TomcatEmbeddedWebappClassLoader 加载的class数量是0,所以在spring boot embedded tomcat里,它只是一个空壳,所有的类加载都是`LaunchedURLClassLoader`完成的 - - -### 列出ClassLoader里加载的所有类 - -列出上面的`org.apache.jasper.servlet.JasperLoader`加载的类: - -`classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader`{{execute T2}} - -```bash -$ classloader -a --classLoaderClass apache.jasper.servlet.JasperLoader - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -* 注:同ognl, 也可用`-c `而不用`--classLoaderClass`指定 - -### 反编译jsp的代码 - -`jad org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -```bash -$ jad org.apache.jsp.jsp.hello_jsp - -ClassLoader: -+-org.apache.jasper.servlet.JasperLoader@65361d9a - +-TomcatEmbeddedWebappClassLoader - context: ROOT -... -``` - -### 查看ClassLoader树 - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` -注意:请使用你的classLoaderHash值覆盖 `` ,然后手动执行下面相关命令: - -### 列出ClassLoader的urls - -比如上面查看到的spring LaunchedURLClassLoader的 hashcode是`1be6f5c3`,可以通过`-c`或者`--classLoaderClass`参数来列出它的所有urls: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### 加载指定ClassLoader里的资源文件 - -查找指定的资源文件: `classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` - -### 尝试加载指定的类 - -比如用上面的spring LaunchedURLClassLoader 尝试加载 `java.lang.String` : - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load java.lang.String`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load java.lang.String -load class success. - class-info java.lang.String - code-source - name java.lang.String - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name String - modifier final,public - annotation - interfaces java.io.Serializable,java.lang.Comparable,java.lang.CharSequence - super-class +-java.lang.Object - class-loader - classLoaderHash null -``` - diff --git a/tutorials/katacoda/arthas-advanced-cn/case-get-spring-context.md b/tutorials/katacoda/arthas-advanced-cn/case-get-spring-context.md deleted file mode 100644 index c689020e6df..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-get-spring-context.md +++ /dev/null @@ -1,54 +0,0 @@ - - -在这个案例里,展示获取spring context,再获取bean,然后调用函数。 - -### 使用tt命令获取到spring context - -`tt`即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。 - -* https://arthas.aliyun.com/doc/tt.html - -`tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod`{{execute T2}} - -访问:https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 - -可以看到`tt`命令捕获到了一个请求: - -```bash -$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdaptePress Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 252 ms. - INDE TIMESTAMP COST( IS-R IS- OBJECT CLASS METHOD - X ms) ET EXP ------------------------------------------------------------------------------------------ - 1000 2019-02-15 4.583 true fal 0xc93cf1a RequestMappingHand invokeHandlerMethod - 15:38:32 923 se lerAdapter -``` - -### 使用tt命令从调用记录里获取到spring context - -输入 `Q`{{execute T2}} 或者 `Ctrl + C` 退出上面的 `tt -t`命令。 - -`tt -i 1000 -w 'target.getApplicationContext()'`{{execute T2}} - -```bash -$ tt -i 1000 -w 'target.getApplicationContext()' -@AnnotationConfigEmbeddedWebApplicationContext[ - reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@2e457641], - scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@6eb38026], - annotatedClasses=null, - basePackages=null, -] -Affect(row-cnt:1) cost in 439 ms. -``` - -## 获取spring bean,并调用函数 - -`tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'`{{execute T2}} - -结果是: - -```bash -$ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' -@String[Hello World] -Affect(row-cnt:1) cost in 52 ms. -``` diff --git a/tutorials/katacoda/arthas-advanced-cn/case-http-401.md b/tutorials/katacoda/arthas-advanced-cn/case-http-401.md deleted file mode 100644 index 50ace4e7ced..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-http-401.md +++ /dev/null @@ -1,53 +0,0 @@ - - -在这个案例里,展示排查HTTP 401问题的技巧。 - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -结果是: - -``` -Something went wrong: 401 Unauthorized -``` - -我们知道`401`通常是被权限管理的`Filter`拦截了,那么到底是哪个`Filter`处理了这个请求,返回了401? - - -### 跟踪所有的Filter函数 - -开始trace: - -`trace javax.servlet.Filter *`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -可以在调用树的最深层,找到`AdminFilterConfig$AdminFilter`返回了`401`: - -``` -+---[3.806273ms] javax.servlet.FilterChain:doFilter() -| `---[3.447472ms] com.example.demo.arthas.AdminFilterConfig$AdminFilter:doFilter() -| `---[0.17259ms] javax.servlet.http.HttpServletResponse:sendError() -``` - -### 通过stack获取调用栈 - -上面是通过`trace`命令来获取信息,从结果里,我们可以知道通过`stack`跟踪`HttpServletResponse:sendError()`,同样可以知道是哪个`Filter`返回了`401` - -执行: - -`stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401'`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -```bash -$ stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401' -Press Q or Ctrl+C to abort. -Affect(class-cnt:2 , method-cnt:4) cost in 87 ms. -ts=2019-02-15 16:44:06;thread_name=http-nio-8080-exec-6;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@8546cd5 - @org.apache.catalina.connector.ResponseFacade.sendError() - at com.example.demo.arthas.AdminFilterConfig$AdminFilter.doFilter(AdminFilterConfig.java:38) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) -``` diff --git a/tutorials/katacoda/arthas-advanced-cn/case-http-404.md b/tutorials/katacoda/arthas-advanced-cn/case-http-404.md deleted file mode 100644 index 79abcb7e380..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-http-404.md +++ /dev/null @@ -1,39 +0,0 @@ - - -在这个案例里,展示排查HTTP 404问题的技巧。 - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -结果是: - -``` -Something went wrong: 404 Not Found -``` - -那么到底是哪个Servlet处理了这个请求,返回了404? - -### 跟踪所有的Servlet函数 - -开始trace: - -`trace javax.servlet.Servlet * > /tmp/servlet.txt`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -在`Terminal 3`里,查看`/tmp/servlet.txt`的内容: - -`less /tmp/servlet.txt`{{execute T3}} - -`/tmp/servlet.txt`里的内容会比较多,需要耐心找到调用树里最长的地方。 - -可以发现请求最终是被`freemarker`处理的: - -``` -`---[13.974188ms] org.springframework.web.servlet.ViewResolver:resolveViewName() - +---[0.045561ms] javax.servlet.GenericServlet:() - +---[min=0.045545ms,max=0.074342ms,total=0.119887ms,count=2] org.springframework.web.servlet.view.freemarker.FreeMarkerView$GenericServletAdapter:() - +---[0.170895ms] javax.servlet.GenericServlet:init() - | `---[0.068578ms] javax.servlet.GenericServlet:init() - | `---[0.021793ms] javax.servlet.GenericServlet:init() - `---[0.164035ms] javax.servlet.GenericServlet:getServletContext() -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md b/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md deleted file mode 100644 index 74650eb6dc8..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-jad-mc-redefine.md +++ /dev/null @@ -1,89 +0,0 @@ -下面介绍通过`jad`/`mc`/`redefine` 命令实现动态更新代码的功能。 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -下面通过热更新代码,修改这个逻辑。 - -### jad反编译UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -jad反编译的结果保存在 `/tmp/UserController.java`文件里了。 - -再打开一个`Terminal 3`,然后用vim来编辑`/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -比如当 user id 小于1时,也正常返回,不抛出异常: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### sc查找加载UserController的ClassLoader - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -可以发现是 spring boot `LaunchedURLClassLoader@1be6f5c3` 加载的。 - -请记下你的classLoaderHash,后面需要使用它。在这里,它是 `1be6f5c3`。 - -### mc - -保存好`/tmp/UserController.java`之后,使用`mc`(Memory Compiler)命令来编译,并且通过`-c`或者`--classLoaderClass`参数指定ClassLoader: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -也可以通过`mc -c /tmp/UserController.java -d /tmp`,使用`-c`参数指定ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -再使用`redefine`命令重新加载新编译好的`UserController.class`: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### 热修改代码结果 - -`redefine`成功之后,再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,结果是: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md b/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md deleted file mode 100644 index da6ad4dc2a0..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-logger-config-problem.md +++ /dev/null @@ -1,52 +0,0 @@ - - -在这个案例里,展示排查logger冲突的方法。 - -### 确认应用使用的logger系统 - -以`UserController`为例,它使用的是slf4j api,但实际使用到的logger系统是logback。 - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 获取logback实际加载的配置文件 - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### 使用classloader命令查找可能存在的logger配置文件 - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -可以知道加载的配置的具体来源。 - -可以尝试加载容易冲突的文件: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md b/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md deleted file mode 100644 index a2c3fcca850..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-ognl-update-logger-level.md +++ /dev/null @@ -1,66 +0,0 @@ - - -在这个案例里,动态修改应用的Logger Level。 - - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -### 用ognl获取logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -可以知道`UserController@logger`实际使用的是logback。可以看到`level=null`,则说明实际最终的level是从`root` logger里来的。 - -### 单独设置UserController的logger level - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -再次获取`UserController@logger`,可以发现已经是`DEBUG`了: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 修改logback的全局logger level - -通过获取`root` logger,可以修改全局的logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/arthas-advanced-cn/case-thread.md b/tutorials/katacoda/arthas-advanced-cn/case-thread.md deleted file mode 100644 index 6d268d7ec7e..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-thread.md +++ /dev/null @@ -1,25 +0,0 @@ - - -### 查看所有线程信息 - -`thread`{{execute T2}} - - -### 查看具体线程的栈 - -查看线程ID 16的栈: - -`thread 16`{{execute T2}} - -### 查看CPU使用率top n线程的栈 - -`thread -n 3`{{execute T2}} - -查看5秒内的CPU使用率top n线程栈 - -`thread -n 3 -i 5000`{{execute T2}} - - -### 查找线程是否有阻塞 - -`thread -b`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-cn/case-watch-method-exception.md b/tutorials/katacoda/arthas-advanced-cn/case-watch-method-exception.md deleted file mode 100644 index d64e2ffbf3a..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/case-watch-method-exception.md +++ /dev/null @@ -1,100 +0,0 @@ - - -### 现象 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -但请求的具体参数,异常栈是什么呢? - -### 查看UserController的 参数/异常 - -在Arthas里执行: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}'`{{execute T2}} - - -1. 第一个参数是类名,支持通配 -2. 第二个参数是函数名,支持通配 - - -访问 `curl http://localhost/user/0`{{execute T3}} ,`watch`命令会打印调用的参数和异常 - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 53 ms. -ts=2019-02-15 01:35:25; [cost=0.996655ms] result=@ArrayList[ - @Object[][isEmpty=false;size=1], - @IllegalArgumentException[java.lang.IllegalArgumentException: id < 1], -] -``` - -可以看到实际抛出的异常是`IllegalArgumentException`。 - -可以输入 `Q`{{execute T2}} 或者 `Ctrl+C` 退出watch命令。 - -如果想把获取到的结果展开,可以用`-x`参数: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2`{{execute T2}} - -### 返回值表达式 - -在上面的例子里,第三个参数是`返回值表达式`,它实际上是一个`ognl`表达式,它支持一些内置对象: - -* loader -* clazz -* method -* target -* params -* returnObj -* throwExp -* isBefore -* isThrow -* isReturn - -你可以利用这些内置对象来组成不同的表达式。比如返回一个数组: - -`watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'`{{execute T2}} - - -更多参考: https://arthas.aliyun.com/doc/advice-class.html - - -### 条件表达式 - -`watch`命令支持在第4个参数里写条件表达式,比如: - -`watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'`{{execute T2}} - -当访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 时,`watch`命令没有输出 - -当访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/101 时,`watch`会打印出结果。 - -```bash -$ watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 47 ms. -ts=2019-02-13 19:42:12; [cost=0.821443ms] result=@User[ - id=@Integer[101], - name=@String[name101], -] -``` - -### 当异常时捕获 - -`watch`命令支持`-e`选项,表示只捕获抛出异常时的请求: - -`watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e`{{execute T2}} - - -### 按照耗时进行过滤 - -watch命令支持按请求耗时进行过滤,比如: - -`watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/exit.md b/tutorials/katacoda/arthas-advanced-cn/exit.md deleted file mode 100644 index 22ee3b9842a..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/exit.md +++ /dev/null @@ -1,19 +0,0 @@ - - -## reset - -Arthas在 watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 `reset`{{execute T2}} 命令,可以清除掉这些增强代码。 - -## 退出Arthas - -用 `exit`{{execute interrupt}} 或者 `quit`{{execute interrupt}} 命令可以退出Arthas。 - -退出Arthas之后,还可以再次用 `java -jar arthas-boot.jar`{{execute interrupt}} 来连接。 - - -## 彻底退出Arthas - -`exit/quit`命令只是退出当前session,arthas server还在目标进程中运行。 - -想完全退出Arthas,可以执行 `stop`{{execute interrupt}} 命令。 - diff --git a/tutorials/katacoda/arthas-advanced-cn/finish.md b/tutorials/katacoda/arthas-advanced-cn/finish.md deleted file mode 100644 index 4c7b503c222..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“进阶教程”,演示了Arthas的大部分高级用法,希望对大家排查问题有帮助。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/index.json b/tutorials/katacoda/arthas-advanced-cn/index.json deleted file mode 100644 index 337c44695dd..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/index.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "title": "Arthas 进阶", - "description": "Arthas 进阶", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "start-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "查看JVM信息", - "text": "jvm-info.md" - }, - { - "title": "Tips", - "text": "tips.md" - }, - { - "title": "sc/sm 查看已加载的类", - "text": "sc-sm.md" - }, - { - "title": "Jad", - "text": "jad.md" - }, - { - "title": "Ognl", - "text": "ognl.md" - }, - { - "title": "案例: 排查函数调用异常", - "text": "case-watch-method-exception.md" - }, - { - "title": "案例: 热更新代码", - "text": "case-jad-mc-redefine.md" - }, - { - "title": "案例: 动态更新应用Logger Level", - "text": "case-ognl-update-logger-level.md" - }, - { - "title": "案例: 排查logger冲突问题", - "text": "case-logger-config-problem.md" - }, - { - "title": "案例: 获取Spring Context", - "text": "case-get-spring-context.md" - }, - { - "title": "案例: 排查HTTP请求返回401", - "text": "case-http-401.md" - }, - { - "title": "案例: 排查HTTP请求返回404", - "text": "case-http-404.md" - }, - { - "title": "案例: 理解Spring Boot应用的ClassLoader结构", - "text": "case-classloader.md" - }, - { - "title": "案例:查找Top N线程", - "text": "case-thread.md" - }, - { - "title": "Web Console", - "text": "web-console.md" - }, - { - "title": "Exit/Stop", - "text": "exit.md" - }, - { - "title": "arthas-boot支持的参数", - "text": "arthas-boot-details.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/intro.md b/tutorials/katacoda/arthas-advanced-cn/intro.md deleted file mode 100644 index c90d07b8087..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/intro.md +++ /dev/null @@ -1,11 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。 - -本教程会以一个普通的Spring Boot应用为例,演示Arthas命令的详细用法。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/jad.md b/tutorials/katacoda/arthas-advanced-cn/jad.md deleted file mode 100644 index 4c479c67bcc..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/jad.md +++ /dev/null @@ -1,9 +0,0 @@ - -可以通过 `jad` 命令来反编译代码: - -`jad com.example.demo.arthas.user.UserController`{{execute T2}} - - -通过`--source-only`参数可以只打印出在反编译的源代码: - -`jad --source-only com.example.demo.arthas.user.UserController`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-cn/jvm-info.md b/tutorials/katacoda/arthas-advanced-cn/jvm-info.md deleted file mode 100644 index 8fbaa93bdc3..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/jvm-info.md +++ /dev/null @@ -1,30 +0,0 @@ - -下面介绍Arthas里查看`JVM`信息的命令。 - -### sysprop - -`sysprop`{{execute T2}} 可以打印所有的System Properties信息。 - -也可以指定单个key: `sysprop java.version`{{execute T2}} - -也可以通过`grep`来过滤: `sysprop | grep user`{{execute T2}} - -可以设置新的value: `sysprop testKey testValue`{{execute T2}} - -### sysenv - -`sysenv`{{execute T2}} 命令可以获取到环境变量。和`sysprop`命令类似。 - - - -### jvm - -`jvm`{{execute T2}} 命令会打印出`JVM`的各种详细信息。 - - -### dashboard - - -`dashboard`{{execute T2}} 命令可以查看当前系统的实时数据面板。 - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 可以退出dashboard命令。 \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/ognl.md b/tutorials/katacoda/arthas-advanced-cn/ognl.md deleted file mode 100644 index 7c7d23e534a..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/ognl.md +++ /dev/null @@ -1,71 +0,0 @@ - -在Arthas里,有一个单独的`ognl`命令,可以动态执行代码。 - - -### 调用static函数 - -`ognl '@java.lang.System@out.println("hello ognl")'`{{execute T2}} - -可以检查`Terminal 1`(不是arthas的Terminal 2)里的进程输出,可以发现打印出了`hello ognl`。 - - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - - `--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### 获取静态类的静态字段 - -获取`UserController`类里的`logger`字段: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -还可以通过`-x`参数控制返回值的展开层数。比如: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -### 执行多行表达式,赋值给临时变量,返回一个List - -`ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'`{{execute T2}} - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -### 更多 - -在Arthas里`ognl`表达式是很重要的功能,在很多命令里都可以使用`ognl`表达式。 - -一些更复杂的用法,可以参考: - -* OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71 -* OGNL表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/options.md b/tutorials/katacoda/arthas-advanced-cn/options.md deleted file mode 100644 index 96394d4bd3b..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/options.md +++ /dev/null @@ -1,37 +0,0 @@ - - - -在Arthas里有一些开关,可以通过 `options`{{execute T2}} 命令来查看。 - - -查看单个option的值,比如 - -`options unsafe`{{execute T2}} - - -## 允许增强JDK的类 - -默认情况下`unsafe`为false,即watch/trace等命令不会增强JVM的类,即`java.*`下面的类。 - -如果想增强JVM里的类,可以执行 `options unsafe true`{{execute T2}} ,设置`unsafe`为true。 - - -## 以JSON格式打印对象 - -当 `json-format` 为false时,输出结果是: - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/usr/lib/jvm/java-8-oracle/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -`options json-format true`{{execute T2}} - -当 `json-format` 为true时,输出结果是: - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#v["/usr/lib/jvm/java-8-oracle/jre","Java(TM) SE Runtime Environment"] -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/sc-sm.md b/tutorials/katacoda/arthas-advanced-cn/sc-sm.md deleted file mode 100644 index e8801323da4..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/sc-sm.md +++ /dev/null @@ -1,34 +0,0 @@ - -下面介绍Arthas里查找已加载类的命令。 - -### sc - -`sc` 命令可以查找到所有JVM已经加载到的类。 - - -如果搜索的是接口,还会搜索所有的实现类。比如查看所有的`Filter`实现类: - -`sc javax.servlet.Filter`{{execute T2}} - -通过`-d`参数,可以打印出类加载的具体信息,很方便查找类加载问题。 - -`sc -d javax.servlet.Filter`{{execute T2}} - -`sc`支持通配,比如搜索所有的`StringUtils`: - -`sc *StringUtils`{{execute T2}} - -### sm - -`sm`命令则是查找类的具体函数。比如: - -`sm java.math.RoundingMode`{{execute T2}} - -通过`-d`参数可以打印函数的具体属性: - -`sm -d java.math.RoundingMode`{{execute T2}} - -也可以查找特定的函数,比如查找构造函数: - -`sm java.math.RoundingMode `{{execute T2}} - diff --git a/tutorials/katacoda/arthas-advanced-cn/start-demo.md b/tutorials/katacoda/arthas-advanced-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/tips.md b/tutorials/katacoda/arthas-advanced-cn/tips.md deleted file mode 100644 index b3eff5ea9b3..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/tips.md +++ /dev/null @@ -1,47 +0,0 @@ - -为了更好使用Arthas,下面先介绍Arthas里的一些使用技巧。 - -### help - -Arthas里每一个命令都有详细的帮助信息。可以用`-h`来查看。帮助信息里有`EXAMPLES`和`WIKI`链接。 - -比如: - -`sysprop -h`{{execute T2}} - -### 自动补全 - -Arthas支持丰富的自动补全功能,在使用有疑惑时,可以输入`Tab`来获取更多信息。 - -比如输入 `sysprop java.` 之后,再输入`Tab`,会补全出对应的key: - -``` -$ sysprop java. -java.runtime.name java.protocol.handler.pkgs java.vm.version -java.vm.vendor java.vendor.url java.vm.name -... -``` - - -### readline的快捷键支持 - -Arthas支持常见的命令行快捷键,比如`Ctrl + A`跳转行首,`Ctrl + E`跳转行尾。 - -更多的快捷键可以用 `keymap`{{execute T2}} 命令查看。 - -### 历史命令的补全 - -如果想再执行之前的命令,可以在输入一半时,按`Up/↑` 或者 `Ddown/↓`,来匹配到之前的命令。 - -比如之前执行过`sysprop java.version`,那么在输入`sysprop ja`之后,可以输入`Up/↑`,就会自动补全为`sysprop java.version`。 - -如果想查看所有的历史命令,也可以通过 `history`{{execute T2}} 命令查看到。 - - -### pipeline - -Arthas支持在pipeline之后,执行一些简单的命令,比如: - -`sysprop | grep java`{{execute T2}} - -`sysprop | wc -l`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-cn/web-console.md b/tutorials/katacoda/arthas-advanced-cn/web-console.md deleted file mode 100644 index 43e0b6656da..00000000000 --- a/tutorials/katacoda/arthas-advanced-cn/web-console.md +++ /dev/null @@ -1,19 +0,0 @@ - - -Arthas支持通过Web Socket来连接。 - - -## 教程里的Web Console - - -http://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/?ip=[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com&port=80 - -> 注意:教程里访问的是80端口,因为做了端口转发。在本地体验时,需要访问8563端口。 - -## 本地体验 - -当在本地启动时,可以访问 http://127.0.0.1:8563/ ,通过浏览器来使用Arthas。 - -![Arthas WebConsole](/arthas/scenarios/common-resources/assets/web-console.png) - -推荐通过“快速入门”来体验: https://arthas.aliyun.com/doc/quick-start.html \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/arthas-boot-details.md b/tutorials/katacoda/arthas-advanced-en/arthas-boot-details.md deleted file mode 100644 index 610ce44e6b4..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/arthas-boot-details.md +++ /dev/null @@ -1,30 +0,0 @@ - - -`arthas-boot.jar` supports many parameters and can be viewed by `java -jar arthas-boot.jar -h`{{execute T2}}. - -## Allow external network access - -By default, the arthas server listens for the IP of `127.0.0.1`. If you want remote access, you can use the `--target-ip` option. - -`java -jar arthas-boot.jar --target-ip`{{execute T2}} - - -## List all versions - - -`java -jar arthas-boot.jar --versions`{{execute T2}} - -Use the specified version: - -`java -jar arthas-boot.jar --use-version 3.1.0`{{execute T2}} - -## Only listens at the Telnet port and does not listen at the HTTP port. - -`java -jar arthas-boot.jar --telnet-port 9999 --http-port -1`{{execute T2}} - -## Print verbose information - -`java -jar arthas-boot.jar -v`{{execute T2}} - - - diff --git a/tutorials/katacoda/arthas-advanced-en/arthas-boot.md b/tutorials/katacoda/arthas-advanced-en/arthas-boot.md deleted file mode 100644 index 1726fe72727..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/arthas-advanced-en/case-classloader.md b/tutorials/katacoda/arthas-advanced-en/case-classloader.md deleted file mode 100644 index d93257918fa..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-classloader.md +++ /dev/null @@ -1,140 +0,0 @@ - - -The following describes the usage of the `classloader` command. - -First visit the jsp page: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### List all ClassLoaders - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* The number of classes loaded by TomcatEmbeddedWebappClassLoader is 0, so in spring boot embedded tomcat, it is just an empty ClassLoader, all the classes are loaded by `LaunchedURLClassLoader` - - -### List all classes loaded in ClassLoader - -List all classes loaded by `org.apache.jasper.servlet.JasperLoader`: - -`classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader`{{execute T2}} - -```bash -$ classloader -a --classLoaderClass apache.jasper.servlet.JasperLoader - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -* PS: Same as `ognl`, you can also use `-c ` instead of `--classLoaderClass` to specify - -### Decompile dynamically generated jsp classes - -`jad org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -```bash -$ jad org.apache.jsp.jsp.hello_jsp - -ClassLoader: -+-org.apache.jasper.servlet.JasperLoader@65361d9a - +-TomcatEmbeddedWebappClassLoader - context: ROOT -... -``` - -### View the ClassLoader tree - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` - -Note: Please replace `` with your classLoaderHash above, then execute the related commands manually in the following steps: - -### List the urls of the ClassLoader - -For example, the hashcode of spring `LaunchedURLClassLoader` viewed above is `1be6f5c3`, and all its urls can be listed by the `-c` parameter: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### Load the resource file in the specified ClassLoader - -Load the specified resource file: `classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` - -### Try to load the specified class - -For example, try loading `java.lang.String` with spring LaunchedURLClassLoader : - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load java.lang.String`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load java.lang.String -load class success. - class-info java.lang.String - code-source - name java.lang.String - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name String - modifier final,public - annotation - interfaces java.io.Serializable,java.lang.Comparable,java.lang.CharSequence - super-class +-java.lang.Object - class-loader - classLoaderHash null -``` - diff --git a/tutorials/katacoda/arthas-advanced-en/case-get-spring-context.md b/tutorials/katacoda/arthas-advanced-en/case-get-spring-context.md deleted file mode 100644 index 0deb22dfc8d..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-get-spring-context.md +++ /dev/null @@ -1,54 +0,0 @@ - - -In this case, the user can get the spring context, get the bean, and invoke the method. - -### Use the tt command to record the invocation of the specified method - -`tt` is TimeTunnel, which records the parameters and return value of each invocation of the specified method. - -* https://arthas.aliyun.com/doc/tt.html - -`tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 - -You can see that the `tt` command record an invocation: - -```bash -$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdaptePress Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 252 ms. - INDE TIMESTAMP COST( IS-R IS- OBJECT CLASS METHOD - X ms) ET EXP ------------------------------------------------------------------------------------------ - 1000 2019-02-15 4.583 true fal 0xc93cf1a RequestMappingHand invokeHandlerMethod - 15:38:32 923 se lerAdapter -``` - -### Use the tt command to get the spring context from the invocation record. - -Type `Q`{{execute T2}} or `Ctrl + C` to exit the `tt -t` command above. - -`tt -i 1000 -w 'target.getApplicationContext()'`{{execute T2}} - -```bash -$ tt -i 1000 -w 'target.getApplicationContext()' -@AnnotationConfigEmbeddedWebApplicationContext[ - reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@2e457641], - scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@6eb38026], - annotatedClasses=null, - basePackages=null, -] -Affect(row-cnt:1) cost in 439 ms. -``` - -## Get the spring bean and invoke method - -`tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'`{{execute T2}} - -The result is: - -```bash -$ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' -@String[Hello World] -Affect(row-cnt:1) cost in 52 ms. -``` diff --git a/tutorials/katacoda/arthas-advanced-en/case-http-401.md b/tutorials/katacoda/arthas-advanced-en/case-http-401.md deleted file mode 100644 index 2d12a5a99b8..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-http-401.md +++ /dev/null @@ -1,56 +0,0 @@ - - -In this case, the user will resolve the HTTP 401 issue. - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -The result is: - -``` -Something went wrong: 401 Unauthorized -``` - -We know that `401` is usually intercepted by the permission-managed `Filter`, so which `Filter` returns 401? - - -### Track all Filter methods - -Start trace: - -`trace javax.servlet.Filter *`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -At the deepest level of the call tree, you can find `AdminFilterConfig$AdminFilter` which returns `401`: - -``` -+---[3.806273ms] javax.servlet.FilterChain:doFilter() -| `---[3.447472ms] com.example.demo.arthas.AdminFilterConfig$AdminFilter:doFilter() -| `---[0.17259ms] javax.servlet.http.HttpServletResponse:sendError() -``` - -### Get the call stack through stack command - -From the above result, we can find the method: `HttpServletResponse:sendError()`. So we can use `stack` command to resolved the HTTP `401` issue. - - -Run: - -`stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401'`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -The Result: - -```bash -$ stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401' -Press Q or Ctrl+C to abort. -Affect(class-cnt:2 , method-cnt:4) cost in 87 ms. -ts=2019-02-15 16:44:06;thread_name=http-nio-8080-exec-6;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@8546cd5 - @org.apache.catalina.connector.ResponseFacade.sendError() - at com.example.demo.arthas.AdminFilterConfig$AdminFilter.doFilter(AdminFilterConfig.java:38) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) -``` diff --git a/tutorials/katacoda/arthas-advanced-en/case-http-404.md b/tutorials/katacoda/arthas-advanced-en/case-http-404.md deleted file mode 100644 index b7e1d1c25fe..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-http-404.md +++ /dev/null @@ -1,39 +0,0 @@ - - -In this case, the user will resolve the HTTP 404 issue. - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -The result is: - -``` -Something went wrong: 404 Not Found -``` - -So which servlet is handle this request and returning 404? - -### Trace all the Servlet methods - -Start trace: - -`trace javax.servlet.Servlet * > /tmp/servlet.txt`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -In `Terminal 3`, view the contents of `/tmp/servlet.txt`: - -`less /tmp/servlet.txt`{{execute T3}} - -The contents of `/tmp/servlet.txt` will be more, and you need to be patient to find the longest level in the call tree. - -It can be found that the request is handled by `freemarker`: - -``` -`---[13.974188ms] org.springframework.web.servlet.ViewResolver:resolveViewName() - +---[0.045561ms] javax.servlet.GenericServlet:() - +---[min=0.045545ms,max=0.074342ms,total=0.119887ms,count=2] org.springframework.web.servlet.view.freemarker.FreeMarkerView$GenericServletAdapter:() - +---[0.170895ms] javax.servlet.GenericServlet:init() - | `---[0.068578ms] javax.servlet.GenericServlet:init() - | `---[0.021793ms] javax.servlet.GenericServlet:init() - `---[0.164035ms] javax.servlet.GenericServlet:getServletContext() -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md b/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md deleted file mode 100644 index 5de8a5036d7..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-jad-mc-redefine.md +++ /dev/null @@ -1,92 +0,0 @@ -This case introduces the ability to dynamically update code via the `jad`/`mc`/`redefine` command. - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -This logic will be modified by `redefine` command below. - -### Use jad command to decompile UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -The result of jad command will be saved in the `/tmp/UserController.java` file. - - -Then open `Terminal 3`, use `vim` to edit `/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -For example, when the user id is less than 1, it also returns normally without throwing an exception: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### Use sc command to find the ClassLoader that loads the UserController - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -It can be found that it is loaded by spring boot `LaunchedURLClassLoader@1be6f5c3`. - -Please write down your classLoaderHash here, in the case here, it's `1be6f5c3`. It will be used in the future steps. - -### mc - -After saving `/tmp/UserController.java`, compile with the `mc` (Memory Compiler) command and specify the ClassLoader with the `-c` or `--classLoaderClass` option: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -You can also execute `mc -c /tmp/UserController.java -d /tmp`,using `-c` to specify ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -Then reload the newly compiled `UserController.class` with the `redefine` command: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### Check the results of the hotswap code - -After the `redefine` command is executed successfully, visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 again. - -The result is: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md b/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md deleted file mode 100644 index 908298d5041..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-logger-config-problem.md +++ /dev/null @@ -1,53 +0,0 @@ - - - -In this case, show how to troubleshoot logger conflicts. - -### View the logger system used by the app - -Take `UserController` as an example, it uses slf4j api, but the actual logger system used is logback. - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Find the configuration file actually loaded by the logback - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### Use the classloader command to find possible logger configuration files - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -You can know the specific source of the loaded configuration. - -You can try to load files that are prone to conflict: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md b/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md deleted file mode 100644 index ac3fe73a511..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-ognl-update-logger-level.md +++ /dev/null @@ -1,66 +0,0 @@ - -In this case, show how to dynamically modify the Logger Level. - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -### Use ognl command to get the logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -可以知道`UserController@logger`实际使用的是logback。可以看到`level=null`,则说明实际最终的level是从`root` logger里来的。 - -The user can know that `UserController@logger` actually uses logback. Because `level=null`, the actual final level is from the `root` logger. - -### Change the logger level of UserController - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -Get `UserController@logger` again, the user can see that it is already `DEBUG`: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Change the global logger level of the logback - -By getting the `root` logger, the user can modify the global logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/arthas-advanced-en/case-thread.md b/tutorials/katacoda/arthas-advanced-en/case-thread.md deleted file mode 100644 index 45819b3f1d4..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-thread.md +++ /dev/null @@ -1,24 +0,0 @@ - - -### View all thread information - -`thread`{{execute T2}} - - -### View the stack of specific threads - -View the stack of thread ID 16: - -`thread 16`{{execute T2}} - -### View the stack of CPU usage TOP N threads - -`thread -n 3`{{execute T2}} - -View the CPU usage TOP N thread stack in 5 seconds - -`thread -n 3 -i 5000`{{execute T2}} - -### Find if the thread is blocked - -`thread -b`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-en/case-watch-method-exception.md b/tutorials/katacoda/arthas-advanced-en/case-watch-method-exception.md deleted file mode 100644 index 9a0e1c2c185..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/case-watch-method-exception.md +++ /dev/null @@ -1,98 +0,0 @@ - - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -But what are the specific parameters of the request, what is the exception stack? - -### View the parameters/exception of UserController - -Execute in Arthas: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}'`{{execute T2}} - - -1. The first argument is the class name, which supports wildcards. -2. The second argument is the function name, which supports wildcards. - -Visit `curl http://localhost/user/0`{{execute T3}} , the `watch` command will print the parameters and exception - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 53 ms. -ts=2019-02-15 01:35:25; [cost=0.996655ms] result=@ArrayList[ - @Object[][isEmpty=false;size=1], - @IllegalArgumentException[java.lang.IllegalArgumentException: id < 1], -] -``` - - -The user can see that the actual thrown exception is `IllegalArgumentException`. - -The user can exit the watch command by typing `Q`{{execute T2}} or `Ctrl+C`. - -If the user want to expand the result, can use the `-x` option: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2`{{execute T2}} - -### The return value expression - -In the above example, the third argument is the `return value expression`, which is actually an `ognl` expression that supports some built-in objects: - -* loader -* clazz -* method -* target -* params -* returnObj -* throwExp -* isBefore -* isThrow -* isReturn - -You can use these built-in objects in the expressions. For example, return an array: - -`watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'`{{execute T2}} - - -More references: https://arthas.aliyun.com/doc/en/advice-class.html - - -### The conditional expression - -The `watch` command supports conditional expressions in the fourth argument, such as: - -`watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'`{{execute T2}} - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 , the `watch` command print nothing. - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/101 , the `watch` command will print: - -```bash -$ watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 47 ms. -ts=2019-02-13 19:42:12; [cost=0.821443ms] result=@User[ - id=@Integer[101], - name=@String[name101], -] -``` - -### Capture when an exception occurs - -The `watch` command supports the `-e` option, which means that only requests that throw an exception are caught: - -`watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e`{{execute T2}} - - -### Filter by cost - -The watch command supports filtering by cost, such as: - -`watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/exit.md b/tutorials/katacoda/arthas-advanced-en/exit.md deleted file mode 100644 index ca368bf55de..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/exit.md +++ /dev/null @@ -1,18 +0,0 @@ - - -## reset - -When Arthas executes commands such as watch/trace, it actually modifies the application's bytecode and inserts the enhanced code. These enhancement codes can be removed by explicitly executing the `reset`{{execute T2}} command. - -## Exit/Stop Arthas - -Arthas can be exited with the `exit`{{execute interrupt}} or `quit`{{execute interrupt}} command. - -After exiting Arthas, you can also connect with `java -jar arthas-boot.jar`{{execute interrupt}} again. - -## Stop Arthas - -The `exit/quit` command simply exits the current session and the arthas server still runs in the target process. - -To completely exit Arthas, you can execute the `stop`{{execute interrupt}} command. - diff --git a/tutorials/katacoda/arthas-advanced-en/finish.md b/tutorials/katacoda/arthas-advanced-en/finish.md deleted file mode 100644 index d0dd39ed354..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/finish.md +++ /dev/null @@ -1,8 +0,0 @@ - -In the `Advanced Tutorial`, there are most of the advanced usages of Arthas and hope to help you troubleshoot the issue. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/index.json b/tutorials/katacoda/arthas-advanced-en/index.json deleted file mode 100644 index eba999d7132..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/index.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "title": "Arthas Advanced", - "description": "Arthas Advanced", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "JVM Infomation", - "text": "jvm-info.md" - }, - { - "title": "Tips", - "text": "tips.md" - }, - { - "title": "sc/sm view loaded classes", - "text": "sc-sm.md" - }, - { - "title": "Jad", - "text": "jad.md" - }, - { - "title": "Ognl", - "text": "ognl.md" - }, - { - "title": "Case: Troubleshooting method invoke exception", - "text": "case-watch-method-exception.md" - }, - { - "title": "Case: Hotswap code", - "text": "case-jad-mc-redefine.md" - }, - { - "title": "Case: Change Logger Level", - "text": "case-ognl-update-logger-level.md" - }, - { - "title": "Case: Troubleshoot logger conflicts", - "text": "case-logger-config-problem.md" - }, - { - "title": "Case: Get the Spring Context", - "text": "case-get-spring-context.md" - }, - { - "title": "Case: Troubleshooting HTTP request returns 401", - "text": "case-http-401.md" - }, - { - "title": "Case: Troubleshooting HTTP request returns 404", - "text": "case-http-404.md" - }, - { - "title": "Case: The ClassLoaders in Spring Boot application", - "text": "case-classloader.md" - }, - { - "title": "Case: Find CPU usage Top N threads", - "text": "case-thread.md" - }, - { - "title": "Web Console", - "text": "web-console.md" - }, - { - "title": "Exit/Stop", - "text": "exit.md" - }, - { - "title": "arthas-boot supported options", - "text": "arthas-boot-details.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/intro.md b/tutorials/katacoda/arthas-advanced-en/intro.md deleted file mode 100644 index 10955f53e11..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/intro.md +++ /dev/null @@ -1,11 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -This tutorial takes a normal Spring Boot application as an example to demonstrate the advanced usage of the Arthas. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/jad.md b/tutorials/katacoda/arthas-advanced-en/jad.md deleted file mode 100644 index 0753fa20112..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/jad.md +++ /dev/null @@ -1,8 +0,0 @@ -The user can decompile the code with the `jad` command: - -`jad com.example.demo.arthas.user.UserController`{{execute T2}} - - -The `--source-only` option can only print out the source code: - -`jad --source-only com.example.demo.arthas.user.UserController`{{execute T2}} diff --git a/tutorials/katacoda/arthas-advanced-en/jvm-info.md b/tutorials/katacoda/arthas-advanced-en/jvm-info.md deleted file mode 100644 index b73dc5e1697..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/jvm-info.md +++ /dev/null @@ -1,29 +0,0 @@ - -The following describes the commands for viewing `JVM` information in Arthas. - -### sysprop - -`sysprop`{{execute T2}} can print all System Properties information. - -Specify a single key: `sysprop java.version`{{execute T2}} - -It can also be filtered by `grep`: `sysprop | grep user`{{execute T2}} - -Set a new value: `sysprop testKey testValue`{{execute T2}} - -### sysenv - -The `sysenv`{{execute T2}} command gets the environment variable. Similar to the `sysprop` command. - - -### jvm - -The `jvm`{{execute T2}} command prints out various details of the `JVM`. - - -### dashboard - - -The `dashboard`{{execute T2}} command can view the real-time data panel of the current system. - -Enter `Q`{{execute T2}} or `Ctrl+C` to exit the dashboard command. \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/ognl.md b/tutorials/katacoda/arthas-advanced-en/ognl.md deleted file mode 100644 index 9743945ac9b..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/ognl.md +++ /dev/null @@ -1,71 +0,0 @@ - -The `ognl` command can execute code dynamically. - -### Invoke the static method - -`ognl '@java.lang.System@out.println("hello ognl")'`{{execute T2}} - -The `Terminal 1` will print `hello ognl`. - - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -Please write down your classLoaderHash here since it's dynamic. In the case here, it's `1be6f5c3`. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### Get static fields of static classes - -Get the `logger` field of the `UserController` class: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -Control the number of expansion layers of the return value with the `-x` parameter. such as: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -### Execute multi-line expressions - -Return a list: - -`ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'`{{execute T2}} - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -### More - -The `ognl` expression in Arthas is an important feature, and the `ognl` expression can be used in many commands. - -For some more complicated usages, refer to: - -* For special usage of OGNL, please refer to: https://github.com/alibaba/arthas/issues/71 -* Official Guide to OGNL Expressions: https://commons.apache.org/proper/commons-ognl/language-guide.html diff --git a/tutorials/katacoda/arthas-advanced-en/options.md b/tutorials/katacoda/arthas-advanced-en/options.md deleted file mode 100644 index 00b6d9a102a..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/options.md +++ /dev/null @@ -1,36 +0,0 @@ - - - -There are some switches in Arthas that can be viewed with the `options`{{execute T2}} command. - - -View the value of a single option, such as - -`options unsafe`{{execute T2}} - - -## Allow to enhance the classes of JDK - -By default, `unsafe` is false, ie commands such as `watch`/`trace` do not enhance the JVM class, which is the class starting with `java.*`. - -To enhance the classes in the JVM, execute `options unsafe true`{{execute T2}} to set `unsafe` to true. - -## Print objects in JSON format - -When `json-format` is false, the output is: - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/usr/lib/jvm/java-8-oracle/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -`options json-format true`{{execute T2}} - -When `json-format` is true, the output is: - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#v["/usr/lib/jvm/java-8-oracle/jre","Java(TM) SE Runtime Environment"] -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/sc-sm.md b/tutorials/katacoda/arthas-advanced-en/sc-sm.md deleted file mode 100644 index fa7dc628761..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/sc-sm.md +++ /dev/null @@ -1,33 +0,0 @@ - -The commands in Arthas for finding loaded classes. - -### sc - -The `sc` command finds all the classes that the JVM has loaded. - -When search an interface, it also search all implementation classes. For example, look at all the `Filter` implementation classes: - -`sc javax.servlet.Filter`{{execute T2}} - -With the `-d` option, it will print out the specific information of the loaded classes, which is very convenient for finding the class loading problem. - -`sc -d javax.servlet.Filter`{{execute T2}} - -`sc` supports wildcards, such as searching for all `StringUtils`: - -`sc *StringUtils`{{execute T2}} - -### sm - -The `sm` command find the specific method of the class. such as: - -`sm java.math.RoundingMode`{{execute T2}} - -With `-d` option, it will print the deatils of the method. - -`sm -d java.math.RoundingMode`{{execute T2}} - -Find specific methods, such as the constructors: - -`sm java.math.RoundingMode `{{execute T2}} - diff --git a/tutorials/katacoda/arthas-advanced-en/start-demo.md b/tutorials/katacoda/arthas-advanced-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/tips.md b/tutorials/katacoda/arthas-advanced-en/tips.md deleted file mode 100644 index 2c925194528..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/tips.md +++ /dev/null @@ -1,47 +0,0 @@ - -Some tips on using Arthas. - -### help - -Every command in Arthas has help doc. Can be viewed with `-h`. There are `EXAMPLES` and `WIKI` links in the help doc. - -such as: - -`sysprop -h`{{execute T2}} - -### Auto completion - -Arthas supports a wide range of auto-completion features, and you can type `Tab` to get more information when you have doubts about your use. - -For example, after typing `sysprop java.`, enter `Tab`, which will complete the corresponding key: - -``` -$ sysprop java. -java.runtime.name java.protocol.handler.pkgs java.vm.version -java.vm.vendor java.vendor.url java.vm.name -... -``` - - -### Readline shortcut key support - -Arthas supports common command line shortcuts, such as `Ctrl + A` to jump to the beginning of the line, and `Ctrl + E` to jump to the end of the line. - -More shortcuts can be viewed with the `keymap`{{execute T2}} command. - - -### Completion of history commands - -If you want to execute the previous command again, you can match the previous command by pressing `Up/↑` or `Ddown/↓` when you enter halfway. - -For example, if `sysprop java.version` was executed before, then after entering `sysprop ja`, you can type `Up/↑`, and it will be automatically completed as `sysprop java.version`. - -If you want to see all the history commands, you can also view them with the `history`{{execute T2}} command. - -### pipeline - -Arthas supports some simple commands after the pipeline, such as: - -`sysprop | grep java`{{execute T2}} - -`sysprop | wc -l`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-advanced-en/web-console.md b/tutorials/katacoda/arthas-advanced-en/web-console.md deleted file mode 100644 index c14e90f1e3c..00000000000 --- a/tutorials/katacoda/arthas-advanced-en/web-console.md +++ /dev/null @@ -1,20 +0,0 @@ - - -Arthas supports connections via a Web Socket. - - -## The Web Console in the tutorial - -http://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/?ip=[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com&port=80 - -> Note: The 80 port is accessed in the tutorial because port forwarding. In the local, you need to access port 8563. - -## Local - - -When launching locally, you can access Arthas through a browser by visiting http://127.0.0.1:8563/. - -![Arthas WebConsole](/arthas/scenarios/common-resources/assets/web-console.png) - - -It is recommended to experience it through "Quick Start": https://arthas.aliyun.com/doc/en/quick-start.html \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-cn/arthas-boot.md b/tutorials/katacoda/arthas-basics-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/arthas-basics-cn/arthas-demo.md b/tutorials/katacoda/arthas-basics-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/arthas-basics-cn/dashboard.md b/tutorials/katacoda/arthas-basics-cn/dashboard.md deleted file mode 100644 index 339491adb57..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/dashboard.md +++ /dev/null @@ -1,3 +0,0 @@ -`dashboard`{{execute T2}} 命令可以查看当前系统的实时数据面板。 - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 可以退出dashboard命令。 \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-cn/exit.md b/tutorials/katacoda/arthas-basics-cn/exit.md deleted file mode 100644 index 99dfde4719f..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/exit.md +++ /dev/null @@ -1,15 +0,0 @@ - - -## 退出Arthas - -用 `exit`{{execute interrupt}} 或者 `quit`{{execute interrupt}} 命令可以退出Arthas。 - -退出Arthas之后,还可以再次用 `java -jar arthas-boot.jar`{{execute interrupt}} 来连接。 - - -## 彻底退出Arthas - -`exit/quit`命令只是退出当前session,arthas server还在目标进程中运行。 - -想完全退出Arthas,可以执行 `stop`{{execute interrupt}} 命令。 - diff --git a/tutorials/katacoda/arthas-basics-cn/finish.md b/tutorials/katacoda/arthas-basics-cn/finish.md deleted file mode 100644 index 2efe6cb4b09..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/finish.md +++ /dev/null @@ -1,10 +0,0 @@ - -通过本教程基本掌握了Arthas的用法。更多高级特性,可以在下面的进阶指南里继续了解。 - -* [Arthas进阶](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=arthas-advanced) -* [Arthas Github](https://github.com/alibaba/arthas) -* [Arthas 文档](https://arthas.aliyun.com/doc/) - -欢迎关注公众号,获取Arthas项目的信息,源码分析,案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/arthas-basics-cn/index.json b/tutorials/katacoda/arthas-basics-cn/index.json deleted file mode 100644 index cc719f6cad8..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas 基础教程", - "description": "Arthas 基础教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Dashboard", - "text": "dashboard.md" - }, - { - "title": "Thread", - "text": "thread.md" - }, - { - "title": "Sc", - "text": "sc.md" - }, - { - "title": "Jad", - "text": "jad.md" - }, - { - "title": "Watch", - "text": "watch.md" - }, - { - "title": "Vmtool", - "text": "vmtool.md" - }, - { - "title": "Exit/Stop", - "text": "exit.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-cn/intro.md b/tutorials/katacoda/arthas-basics-cn/intro.md deleted file mode 100644 index 305296638ba..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/intro.md +++ /dev/null @@ -1,11 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-cn/jad.md b/tutorials/katacoda/arthas-basics-cn/jad.md deleted file mode 100644 index a1bb934f030..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/jad.md +++ /dev/null @@ -1,4 +0,0 @@ - -可以通过 `jad` 命令来反编译代码: - -`jad demo.MathGame`{{execute T2}} diff --git a/tutorials/katacoda/arthas-basics-cn/sc.md b/tutorials/katacoda/arthas-basics-cn/sc.md deleted file mode 100644 index b8d9270d798..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/sc.md +++ /dev/null @@ -1,4 +0,0 @@ - -可以通过 `sc` 命令来查找JVM里已加载的类: - -`sc -d *MathGame`{{execute T2}} diff --git a/tutorials/katacoda/arthas-basics-cn/thread.md b/tutorials/katacoda/arthas-basics-cn/thread.md deleted file mode 100644 index 515737b87a4..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/thread.md +++ /dev/null @@ -1,11 +0,0 @@ -`thread 1`{{execute interrupt}} 命令会打印线程ID 1的栈。 - - -Arthas支持管道,可以用 `thread 1 | grep 'main('`{{execute T2}} 查找到`main class`。 - -可以看到`main class`是`demo.MathGame`: - -``` -$ thread 1 | grep 'main(' - at demo.MathGame.main(MathGame.java:17) -``` diff --git a/tutorials/katacoda/arthas-basics-cn/vmtool.md b/tutorials/katacoda/arthas-basics-cn/vmtool.md deleted file mode 100644 index 5aed3cfe312..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/vmtool.md +++ /dev/null @@ -1,20 +0,0 @@ - -通过`vmtool`命令,可以搜索内存对象。 - -`vmtool --action getInstances --className java.lang.String --limit 10`{{execute T2}} - -```bash -$ vmtool --action getInstances --className java.lang.String --limit 10 -@String[][ - @String[com/taobao/arthas/core/shell/session/Session], - @String[com.taobao.arthas.core.shell.session.Session], - @String[com/taobao/arthas/core/shell/session/Session], - @String[com/taobao/arthas/core/shell/session/Session], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/], - @String[java/util/concurrent/ConcurrentHashMap$ValueIterator], - @String[java/util/concurrent/locks/LockSupport], -] -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-cn/watch.md b/tutorials/katacoda/arthas-basics-cn/watch.md deleted file mode 100644 index 1871af58910..00000000000 --- a/tutorials/katacoda/arthas-basics-cn/watch.md +++ /dev/null @@ -1,6 +0,0 @@ - -通过`watch`命令可以查看函数的参数/返回值/异常信息。 - -`watch demo.MathGame primeFactors returnObj`{{execute T2}} - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 退出watch命令。 diff --git a/tutorials/katacoda/arthas-basics-en/arthas-boot.md b/tutorials/katacoda/arthas-basics-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/arthas-basics-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/arthas-basics-en/arthas-demo.md b/tutorials/katacoda/arthas-basics-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/arthas-basics-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/dashboard.md b/tutorials/katacoda/arthas-basics-en/dashboard.md deleted file mode 100644 index b35a85ac1b1..00000000000 --- a/tutorials/katacoda/arthas-basics-en/dashboard.md +++ /dev/null @@ -1,3 +0,0 @@ -The `dashboard`{{execute T2}} command allows you to view the real-time data panel of the current system. - -Enter `Q`{{execute T2}} or `Ctrl+C` to exit the dashboard command. \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/exit.md b/tutorials/katacoda/arthas-basics-en/exit.md deleted file mode 100644 index 3217105e190..00000000000 --- a/tutorials/katacoda/arthas-basics-en/exit.md +++ /dev/null @@ -1,13 +0,0 @@ - - -## Exit/Stop Arthas - -Arthas can be exited with the `exit`{{execute interrupt}} or `quit`{{execute interrupt}} command. - -After exiting Arthas, you can also connect with `java -jar arthas-boot.jar`{{execute interrupt}} again. - -## Stop Arthas - -The `exit/quit` command simply exits the current session and the arthas server still runs in the target process. - -To completely exit Arthas, you can execute the `stop`{{execute interrupt}} command. \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/finish.md b/tutorials/katacoda/arthas-basics-en/finish.md deleted file mode 100644 index 6bf9a7fdb7a..00000000000 --- a/tutorials/katacoda/arthas-basics-en/finish.md +++ /dev/null @@ -1,6 +0,0 @@ - -Through this tutorial, now you know how to use Arthas. More advanced features can be found in the Advanced Guide below. - -* [Arthas Advanced](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=arthas-advanced) -* [Arthas Github](https://github.com/alibaba/arthas) -* [Arthas Documentation](https://arthas.aliyun.com/doc/en) diff --git a/tutorials/katacoda/arthas-basics-en/index.json b/tutorials/katacoda/arthas-basics-en/index.json deleted file mode 100644 index a5de80d5a53..00000000000 --- a/tutorials/katacoda/arthas-basics-en/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas Basics", - "description": "Arthas Basics", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Dashboard", - "text": "dashboard.md" - }, - { - "title": "Thread", - "text": "thread.md" - }, - { - "title": "Sc", - "text": "sc.md" - }, - { - "title": "Jad", - "text": "jad.md" - }, - { - "title": "Watch", - "text": "watch.md" - }, - { - "title": "Vmtool", - "text": "vmtool.md" - }, - { - "title": "Exit/Stop", - "text": "exit.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/intro.md b/tutorials/katacoda/arthas-basics-en/intro.md deleted file mode 100644 index c27afd3323a..00000000000 --- a/tutorials/katacoda/arthas-basics-en/intro.md +++ /dev/null @@ -1,11 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/jad.md b/tutorials/katacoda/arthas-basics-en/jad.md deleted file mode 100644 index c346f46e5ea..00000000000 --- a/tutorials/katacoda/arthas-basics-en/jad.md +++ /dev/null @@ -1,4 +0,0 @@ - -The `jad` command can be used to decompile the byte code: - -`jad demo.MathGame`{{execute T2}} diff --git a/tutorials/katacoda/arthas-basics-en/sc.md b/tutorials/katacoda/arthas-basics-en/sc.md deleted file mode 100644 index c39cb58d962..00000000000 --- a/tutorials/katacoda/arthas-basics-en/sc.md +++ /dev/null @@ -1,4 +0,0 @@ - -The `sc` command can be used to find the loaded classes in the JVM: - -`sc -d *MathGame`{{execute T2}} diff --git a/tutorials/katacoda/arthas-basics-en/thread.md b/tutorials/katacoda/arthas-basics-en/thread.md deleted file mode 100644 index 4e5174645cb..00000000000 --- a/tutorials/katacoda/arthas-basics-en/thread.md +++ /dev/null @@ -1,10 +0,0 @@ -The `thread 1`{{execute interrupt}} command prints the stack of thread ID 1. - -Arthas supports pipes, and you can find `main class` with `thread 1 | grep 'main('`{{execute T2}}. - -You can see that `main class` is `demo.MathGame`: - -``` -$ thread 1 | grep 'main(' - at demo.MathGame.main(MathGame.java:17) -``` diff --git a/tutorials/katacoda/arthas-basics-en/vmtool.md b/tutorials/katacoda/arthas-basics-en/vmtool.md deleted file mode 100644 index 3e45a6cc4cd..00000000000 --- a/tutorials/katacoda/arthas-basics-en/vmtool.md +++ /dev/null @@ -1,20 +0,0 @@ - -The `vmtool` command can search object in JVM. - -`vmtool --action getInstances --className java.lang.String --limit 10`{{execute T2}} - -```bash -$ vmtool --action getInstances --className java.lang.String --limit 10 -@String[][ - @String[com/taobao/arthas/core/shell/session/Session], - @String[com.taobao.arthas.core.shell.session.Session], - @String[com/taobao/arthas/core/shell/session/Session], - @String[com/taobao/arthas/core/shell/session/Session], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/taobao/arthas/core/shell/session/Session.class], - @String[com/], - @String[java/util/concurrent/ConcurrentHashMap$ValueIterator], - @String[java/util/concurrent/locks/LockSupport], -] -``` \ No newline at end of file diff --git a/tutorials/katacoda/arthas-basics-en/watch.md b/tutorials/katacoda/arthas-basics-en/watch.md deleted file mode 100644 index f862e498746..00000000000 --- a/tutorials/katacoda/arthas-basics-en/watch.md +++ /dev/null @@ -1,5 +0,0 @@ -The `watch` command can view the parameter/return value/exception of the method. - -`watch demo.MathGame primeFactors returnObj`{{execute T2}} - -Input `Q`{{execute T2}} or `Ctrl+C` to exit the watch command. diff --git a/tutorials/katacoda/case-async-jobs-cn/arthas-boot.md b/tutorials/katacoda/case-async-jobs-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-async-jobs-cn/arthas-demo.md b/tutorials/katacoda/case-async-jobs-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-async-jobs-cn/async-jobs.md b/tutorials/katacoda/case-async-jobs-cn/async-jobs.md deleted file mode 100644 index f2e890c771e..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/async-jobs.md +++ /dev/null @@ -1,2 +0,0 @@ - -arthas中的后台异步任务,使用了仿linux系统任务相关的命令。[linux任务相关介绍](https://ehlxr.me/2017/01/18/Linux-%E4%B8%AD-fg%E3%80%81bg%E3%80%81jobs%E3%80%81-%E6%8C%87%E4%BB%A4/)。 diff --git a/tutorials/katacoda/case-async-jobs-cn/finish.md b/tutorials/katacoda/case-async-jobs-cn/finish.md deleted file mode 100644 index 64e66fff6e8..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas后台异步任务。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-async-jobs-cn/index.json b/tutorials/katacoda/case-async-jobs-cn/index.json deleted file mode 100644 index 4150368022c..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/index.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "title": "Arthas 后台异步任务 案例", - "description": "Arthas 后台异步任务 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "后台异步任务", - "text": "async-jobs.md" - }, - { - "title": "使用&在后台执行任务", - "text": "run-cmd-in-backgd.md" - }, - { - "title": "通过jobs查看任务", - "text": "list-backgd-jobs.md" - }, - { - "title": "任务暂停和取消", - "text": "suspend-cancel-job.md" - }, - { - "title": "fg、bg命令,将命令转到前台、后台继续执行", - "text": "switch-foregd-backgd.md" - }, - { - "title": "任务输出重定向", - "text": "redirect-output.md" - }, - { - "title": "停止命令", - "text": "stop-job.md" - }, - { - "title": "其他", - "text": "others.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-async-jobs-cn/intro.md b/tutorials/katacoda/case-async-jobs-cn/intro.md deleted file mode 100644 index 422c41bc02a..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示后台异步任务。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-async-jobs-cn/list-backgd-jobs.md b/tutorials/katacoda/case-async-jobs-cn/list-backgd-jobs.md deleted file mode 100644 index 0e7561739d8..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/list-backgd-jobs.md +++ /dev/null @@ -1,24 +0,0 @@ - -如果希望查看当前有哪些arthas任务在执行,可以执行jobs命令,执行结果如下 - -`jobs`{{execute T2}} - -```bash -$ jobs -[1]* - Running trace demo.MathGame primeFactors & - execution count : 49 - start time : Wed Jul 22 05:47:52 GMT 2020 - timeout date : Thu Jul 23 05:47:52 GMT 2020 - session : aa75753d-74f1-4929-a829-7ff965345183 (current) -``` - -可以看到目前有一个后台任务在执行。 - -job id是10, `*` 表示此job是当前session创建 - -状态是Stopped - -execution count是执行次数,从启动开始已经执行了19次 - -timeout date是超时的时间,到这个时间,任务将会自动超时退出 \ No newline at end of file diff --git a/tutorials/katacoda/case-async-jobs-cn/others.md b/tutorials/katacoda/case-async-jobs-cn/others.md deleted file mode 100644 index 7c943206bac..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/others.md +++ /dev/null @@ -1,6 +0,0 @@ - -* 最多同时支持8个命令使用重定向将结果写日志 - -* 请勿同时开启过多的后台异步命令,以免对目标JVM性能造成影响 - -* 如果不想停止arthas,继续执行后台任务,可以执行 `quit` 退出arthas控制台(`stop` 会停止arthas 服务) diff --git a/tutorials/katacoda/case-async-jobs-cn/redirect-output.md b/tutorials/katacoda/case-async-jobs-cn/redirect-output.md deleted file mode 100644 index bdd7c152e6d..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/redirect-output.md +++ /dev/null @@ -1,11 +0,0 @@ - -可通过>或者>>将任务输出结果输出到指定的文件中,可以和&一起使用,实现arthas命令的后台异步任务。比如: - -`trace demo.MathGame primeFactors >> test.out &`{{execute T2}} - -这时 trace 命令会在后台执行,并且把结果输出到应用`工作目录`下面的`test.out`文件。可继续执行其他命令。并可查看文件中的命令执行结果。可以执行`pwd`命令查看当前应用的`工作目录`。 - -`pwd`{{execute T2}} - -`cat test.out`{{execute T2}} - diff --git a/tutorials/katacoda/case-async-jobs-cn/run-cmd-in-backgd.md b/tutorials/katacoda/case-async-jobs-cn/run-cmd-in-backgd.md deleted file mode 100644 index 5703a54fdb0..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/run-cmd-in-backgd.md +++ /dev/null @@ -1,6 +0,0 @@ - -比如希望在后台执行trace命令,那么调用下面命令 - -`trace demo.MathGame primeFactors &`{{execute T2}} - -这时命令在后台执行,可以在console中继续执行其他命令。 diff --git a/tutorials/katacoda/case-async-jobs-cn/stop-job.md b/tutorials/katacoda/case-async-jobs-cn/stop-job.md deleted file mode 100644 index 3cfab6733eb..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/stop-job.md +++ /dev/null @@ -1,2 +0,0 @@ - -异步执行的命令,如果希望停止,可执行`kill` diff --git a/tutorials/katacoda/case-async-jobs-cn/suspend-cancel-job.md b/tutorials/katacoda/case-async-jobs-cn/suspend-cancel-job.md deleted file mode 100644 index d7b1e8b0d3a..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/suspend-cancel-job.md +++ /dev/null @@ -1,8 +0,0 @@ - -当任务正在前台执行,比如直接调用命令`trace Test t`或者调用后台执行命令`trace Test t &`后又通过fg命令将任务转到前台。这时console中无法继续执行命令,但是可以接收并处理以下事件: - -`ctrl + z`:将任务暂停。通过jbos查看任务状态将会变为Stopped,通过`bg `或者`fg `可让任务重新开始执行 - -`ctrl + c`:停止任务 - -`ctrl + d`:按照linux语义应当是退出终端,目前arthas中是空实现,不处理 diff --git a/tutorials/katacoda/case-async-jobs-cn/switch-foregd-backgd.md b/tutorials/katacoda/case-async-jobs-cn/switch-foregd-backgd.md deleted file mode 100644 index d50aa971265..00000000000 --- a/tutorials/katacoda/case-async-jobs-cn/switch-foregd-backgd.md +++ /dev/null @@ -1,6 +0,0 @@ - -* 任务在后台执行或者暂停状态(`ctrl + z`暂停任务)时,执行`fg `将可以把对应的任务转到前台继续执行。在前台执行时,无法在console中执行其他命令 - -* 当任务处于暂停状态时(`ctrl + z`暂停任务),执行`bg `将可以把对应的任务在后台继续执行 - -* 非当前session创建的job,只能由当前session `fg`到前台执行 diff --git a/tutorials/katacoda/case-async-jobs-en/arthas-boot.md b/tutorials/katacoda/case-async-jobs-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-async-jobs-en/arthas-demo.md b/tutorials/katacoda/case-async-jobs-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/case-async-jobs-en/async-jobs.md b/tutorials/katacoda/case-async-jobs-en/async-jobs.md deleted file mode 100644 index 35bc7b7e8de..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/async-jobs.md +++ /dev/null @@ -1,2 +0,0 @@ - -Asynchronous jobs in arthas. The idea is borrowed from [linux jobs](http://man7.org/linux/man-pages/man1/jobs.1p.html). diff --git a/tutorials/katacoda/case-async-jobs-en/finish.md b/tutorials/katacoda/case-async-jobs-en/finish.md deleted file mode 100644 index 4b72d314447..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know Arthas Async Jobs. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-async-jobs-en/index.json b/tutorials/katacoda/case-async-jobs-en/index.json deleted file mode 100644 index 4ba8c322b06..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/index.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "title": "Arthas Async Jobs", - "description": "Arthas Async Jobs", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Async Jobs", - "text": "async-jobs.md" - }, - { - "title": "Use & to run the command in the background", - "text": "run-cmd-in-backgd.md" - }, - { - "title": "List background jobs", - "text": "list-backgd-jobs.md" - }, - { - "title": "Suspend and cancel job", - "text": "suspend-cancel-job.md" - }, - { - "title": "fg/bg, switch the job from the foreground to the background, and vise verse", - "text": "switch-foregd-backgd.md" - }, - { - "title": "Redirect the output", - "text": "redirect-output.md" - }, - { - "title": "Stop job", - "text": "stop-job.md" - }, - { - "title": "Others", - "text": "others.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-async-jobs-en/intro.md b/tutorials/katacoda/case-async-jobs-en/intro.md deleted file mode 100644 index 5f625665c80..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the use case of Async Jobs. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-async-jobs-en/list-backgd-jobs.md b/tutorials/katacoda/case-async-jobs-en/list-backgd-jobs.md deleted file mode 100644 index 846d6d1d933..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/list-backgd-jobs.md +++ /dev/null @@ -1,24 +0,0 @@ - -If you want to list all background jobs, you can execute the jobs command and the results are as follows: - -`jobs`{{execute T2}} - -```bash -$ jobs -[1]* - Running trace demo.MathGame primeFactors & - execution count : 49 - start time : Wed Jul 22 05:47:52 GMT 2020 - timeout date : Thu Jul 23 05:47:52 GMT 2020 - session : aa75753d-74f1-4929-a829-7ff965345183 (current) -``` - -You can see that there is currently a background job executing: - -job id is 10, `*` indicates that this job is created by the current session. - -status is Stopped - -execution count is the number of executions, which have been executed 19 times since the start. - -timeout date: timeout timestamp, when the time exceeds this timestamp, the job will be automatically timeout and exit. \ No newline at end of file diff --git a/tutorials/katacoda/case-async-jobs-en/others.md b/tutorials/katacoda/case-async-jobs-en/others.md deleted file mode 100644 index 6fd38f90de4..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/others.md +++ /dev/null @@ -1,6 +0,0 @@ - -* Support up to 8 commands at the same time to redirect the output to the log files. - -* Do not open too many background jobs at the same time to avoid negative performance effect to the target JVM. - -* If you do not want to stop the Arthas service and continue to perform background tasks, you can exit the Arthas console by executing `quit` command (`stop` command will stop the Arthas service) diff --git a/tutorials/katacoda/case-async-jobs-en/redirect-output.md b/tutorials/katacoda/case-async-jobs-en/redirect-output.md deleted file mode 100644 index 04f61e40ead..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/redirect-output.md +++ /dev/null @@ -1,11 +0,0 @@ - -The job output can be redirect to the specified file by > or >>, and can be used together with &. By doing this, you can achieve running commands asynchronously, for example: - -`trace demo.MathGame primeFactors >> test.out &`{{execute T2}} - -At this time, the trace command will be executed in the background, and the result will be output to the `test.out` file under the `working directory` of the application. You can continue to execute other commands. And you can view the command execution result in the file. You can execute the `pwd` command to view the `working directory` of the current application. - -`pwd`{{execute T2}} - -`cat test.out`{{execute T2}} - diff --git a/tutorials/katacoda/case-async-jobs-en/run-cmd-in-backgd.md b/tutorials/katacoda/case-async-jobs-en/run-cmd-in-backgd.md deleted file mode 100644 index 64a3b2286da..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/run-cmd-in-backgd.md +++ /dev/null @@ -1,6 +0,0 @@ - -For example, execute the trace command in the background: - -`trace demo.MathGame primeFactors &`{{execute T2}} - -By doing this, the current command is put to the background to run, you can continue to execute other commands in the console. diff --git a/tutorials/katacoda/case-async-jobs-en/stop-job.md b/tutorials/katacoda/case-async-jobs-en/stop-job.md deleted file mode 100644 index 18b4d037561..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/stop-job.md +++ /dev/null @@ -1,2 +0,0 @@ - -If you want to stop background job, just `kill `. diff --git a/tutorials/katacoda/case-async-jobs-en/suspend-cancel-job.md b/tutorials/katacoda/case-async-jobs-en/suspend-cancel-job.md deleted file mode 100644 index 541769eddd4..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/suspend-cancel-job.md +++ /dev/null @@ -1,8 +0,0 @@ - -When the job is executing in the foreground, for example, directly executing the command` trace Test t`, or executing the background job command `trace Test t &`, then putting the job back to the foreground via fg command, the console cannot continue to execute other command, but can receive and process the following keyboard events: - -`ctrl + z`: Suspends the job, the job status will change to Stopped, and the job can be restarted by `bg ` or `fg ` - -`ctrl + c`: Stops the job - -`ctrl + d`: According to linux semantics this should lead to exit the terminal, right now Arthas has not implemented this yet, therefore simply ignore this keystroke. diff --git a/tutorials/katacoda/case-async-jobs-en/switch-foregd-backgd.md b/tutorials/katacoda/case-async-jobs-en/switch-foregd-backgd.md deleted file mode 100644 index d552f926fe1..00000000000 --- a/tutorials/katacoda/case-async-jobs-en/switch-foregd-backgd.md +++ /dev/null @@ -1,6 +0,0 @@ - -* When a job is executed in the background or in suspended status (use `ctrl + z` to suspend job), `fg ` can transfer the job to the foreground to continue to run. - -* When a job is in suspended status (use `ctrl + z` to suspend job), `bg ` can put the job to the background to continue to run. - -* A job created by other session can only be put to the foreground to run by using `fg` in the current session. diff --git a/tutorials/katacoda/case-boot-details-cn/arthas-boot-details.md b/tutorials/katacoda/case-boot-details-cn/arthas-boot-details.md deleted file mode 100644 index 975d300b427..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/arthas-boot-details.md +++ /dev/null @@ -1,65 +0,0 @@ - -在新的`Terminal 2`里,下载`arthas-boot.jar`: - -`wget https://arthas.aliyun.com/arthas-boot.jar`{{execute T2}} - -`arthas-boot.jar` 支持很多参数,可以执行 `java -jar arthas-boot.jar -h`{{execute T2}} 来查看。 - -```bash -$ java -jar arthas-boot.jar -h -[INFO] arthas-boot version: 3.3.6 -Usage: arthas-boot [-h] [--target-ip ] [--telnet-port ] - [--http-port ] [--session-timeout ] [--arthas-home ] - [--use-version ] [--repo-mirror ] [--versions] [--use-http] - [--attach-only] [-c ] [-f ] [--height ] [--width - ] [-v] [--tunnel-server ] [--agent-id ] [--stat-url - ] [--select ] [pid] - -Bootstrap Arthas - -EXAMPLES: - java -jar arthas-boot.jar - java -jar arthas-boot.jar --target-ip 0.0.0.0 - java -jar arthas-boot.jar --telnet-port 9999 --http-port -1 - java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' - java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' ---agent-id bvDOe8XbTM2pQWjF4cfw - java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat' - java -jar arthas-boot.jar -c 'sysprop; thread' - java -jar arthas-boot.jar -f batch.as - java -jar arthas-boot.jar --use-version 3.3.6 - java -jar arthas-boot.jar --versions - java -jar arthas-boot.jar --select math-game - java -jar arthas-boot.jar --session-timeout 3600 - java -jar arthas-boot.jar --attach-only - java -jar arthas-boot.jar --repo-mirror aliyun --use-http -WIKI: - https://arthas.aliyun.com/doc - -Options and Arguments: - -h,--help Print usage - --target-ip The target jvm listen ip, default 127.0.0.1 - --telnet-port The target jvm listen telnet port, default 3658 - --http-port The target jvm listen http port, default 8563 - --session-timeout The session timeout seconds, default 1800 - (30min) - --arthas-home The arthas home - --use-version Use special version arthas - --repo-mirror Use special maven repository mirror, value is - center/aliyun or http repo url. - --versions List local and remote arthas versions - --use-http Enforce use http to download, default use https - --attach-only Attach target process only, do not connect - -c,--command Command to execute, multiple commands separated - by ; - -f,--batch-file The batch file to execute - --height arthas-client terminal height - --width arthas-client terminal width - -v,--verbose Verbose, print debug info. - --tunnel-server The tunnel server url - --agent-id The agent id register to tunnel server - --stat-url The report stat url - --select select target process by classname or - JARfilename - Target pid - ``` diff --git a/tutorials/katacoda/case-boot-details-cn/arthas-demo.md b/tutorials/katacoda/case-boot-details-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-boot-details-cn/boot-examples.md b/tutorials/katacoda/case-boot-details-cn/boot-examples.md deleted file mode 100644 index 60e334457e4..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/boot-examples.md +++ /dev/null @@ -1,108 +0,0 @@ - -## 指定目标pid - -可以使用`jps`{{execute T2}}命令查看pid。 - -直接在参数中添加pid,可指定目标pid。 - -`java -jar arthas-boot.jar 1`{{execute T2}} - -## 允许外部访问 - -默认情况下, arthas server侦听的是 `127.0.0.1` 这个IP,如果希望远程可以访问,可以使用`--target-ip`的参数。 - -`java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -## 指定侦听端口 - -默认情况下, arthas server侦听的是telnet端口`3658`,http端口`8563`,可分别使用`--telnet-port`,`--http-port`指定。 - -只侦听Telnet端口,不侦听HTTP端口: - -`java -jar arthas-boot.jar --telnet-port 9999 --http-port -1`{{execute T2}} - -## 指定tunnel server - -可以使用`--tunnel-server`参数指定。 - -`java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'`{{execute T2}} - -如果tunnel server注册有agent id,那么可以使用`--agent-id`参数指定。 - -`java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw'`{{execute T2}} - -## 指定报表统计地址 - -可以使用`--stat-url`参数指定。 - -`java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat'`{{execute T2}} - -## 列出所有的版本 - -`java -jar arthas-boot.jar --versions`{{execute T2}} - -使用指定版本: - -`java -jar arthas-boot.jar --use-version 3.1.0`{{execute T2}} - -## 打印运行的详情 - -使用`-v`或者`-verbose`。 - -`java -jar arthas-boot.jar -v`{{execute T2}} - -## 指定需要执行的命令目标pid - -可以使用`--command`或者`-c`参数指定,并同时指定pid,多个命令之间用`;`分隔。 - -`java -jar arthas-boot.jar -c 'sysprop; thread' 1`{{execute T2}} - -## 指定需要执行的批处理文件目标pid - -可以使用`--command`或者`-c`参数指定,并同时指定pid。 - -`java -jar arthas-boot.jar -f batch.as 1`{{execute T2}} - -## 通过类名或者jar文件名指定目标进程 - -通过`--select`参数类名或者jar文件名指定目标进程 - -`java -jar arthas-boot.jar --select math-game`{{execute T2}} - -## 指定会话超时秒数 - -使用`--session-timeout`参数指定,默认为1800(30分钟) - -`java -jar arthas-boot.jar --session-timeout 3600`{{execute T2}} - -## 仅附加目标进程,不连接 - -`java -jar arthas-boot.jar --attach-only`{{execute T2}} - -## 指定镜像仓库,强制使用http - -`--repo-mirror`使用特定maven仓库镜像,参数可以为`center/aliyun`或http仓库地址。 - -`--use-http`强制使用http下载,默认使用https。 - -`java -jar arthas-boot.jar --repo-mirror aliyun --use-http`{{execute T2}} - -## 指定arthas客户端命令行宽高 - -`java -jar arthas-boot.jar --height 25 --width 80`{{execute T2}} - -## 指定arthas主目录 - -`java -jar arthas-boot.jar --arthas-home .`{{execute T2}} - -## 以Java Agent的方式启动 - -通常Arthas是以动态attach的方式来诊断应用,但从3.2.0版本起,Arthas支持直接以 java agent的方式启动。 - -比如下载全量的arthas zip包,解压之后以 -javaagent 的参数指定arthas-agent.jar来启动: - -`java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar` - -默认的配置项在解压目录里的arthas.properties文件里。 - -参考: https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html diff --git a/tutorials/katacoda/case-boot-details-cn/finish.md b/tutorials/katacoda/case-boot-details-cn/finish.md deleted file mode 100644 index 948f08d5fc7..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas boot支持的参数。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-boot-details-cn/index.json b/tutorials/katacoda/case-boot-details-cn/index.json deleted file mode 100644 index 5f752fadbd8..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/index.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "title": "Arthas arthas-boot支持的参数 案例", - "description": "Arthas arthas-boot支持的参数 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "arthas-boot支持的参数", - "text": "arthas-boot-details.md" - }, - { - "title": "参数详解", - "text": "boot-examples.md" - }, - { - "title": "使用as.sh", - "text": "use-as-sh.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-boot-details-cn/intro.md b/tutorials/katacoda/case-boot-details-cn/intro.md deleted file mode 100644 index 0f1ff121537..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示arthas-boot支持的参数。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-boot-details-cn/start-demo.md b/tutorials/katacoda/case-boot-details-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-boot-details-cn/use-as-sh.md b/tutorials/katacoda/case-boot-details-cn/use-as-sh.md deleted file mode 100644 index 4bac79a3c05..00000000000 --- a/tutorials/katacoda/case-boot-details-cn/use-as-sh.md +++ /dev/null @@ -1,10 +0,0 @@ - -Arthas 支持在 Linux/Unix/Mac 等平台上一键安装: - -`curl -L https://arthas.aliyun.com/install.sh | sh`{{execute T2}} - -上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 - -直接在shell下面执行`./as.sh`,就会进入交互界面。 - -也可以执行`./as.sh -h`来获取更多参数信息, 具体用法与`java -jar arthas-boot.jar`类似。 \ No newline at end of file diff --git a/tutorials/katacoda/case-boot-details-en/arthas-boot-details.md b/tutorials/katacoda/case-boot-details-en/arthas-boot-details.md deleted file mode 100644 index f805923804a..00000000000 --- a/tutorials/katacoda/case-boot-details-en/arthas-boot-details.md +++ /dev/null @@ -1,68 +0,0 @@ - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -`arthas-boot.jar` supports many parameters and can be viewed by `java -jar arthas-boot.jar -h`{{execute T2}}. - - -```bash -$ java -jar arthas-boot.jar -h -[INFO] arthas-boot version: 3.3.6 -Usage: arthas-boot [-h] [--target-ip ] [--telnet-port ] - [--http-port ] [--session-timeout ] [--arthas-home ] - [--use-version ] [--repo-mirror ] [--versions] [--use-http] - [--attach-only] [-c ] [-f ] [--height ] [--width - ] [-v] [--tunnel-server ] [--agent-id ] [--stat-url - ] [--select ] [pid] - -Bootstrap Arthas - -EXAMPLES: - java -jar arthas-boot.jar - java -jar arthas-boot.jar --target-ip 0.0.0.0 - java -jar arthas-boot.jar --telnet-port 9999 --http-port -1 - java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' - java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' ---agent-id bvDOe8XbTM2pQWjF4cfw - java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat' - java -jar arthas-boot.jar -c 'sysprop; thread' - java -jar arthas-boot.jar -f batch.as - java -jar arthas-boot.jar --use-version 3.3.6 - java -jar arthas-boot.jar --versions - java -jar arthas-boot.jar --select math-game - java -jar arthas-boot.jar --session-timeout 3600 - java -jar arthas-boot.jar --attach-only - java -jar arthas-boot.jar --repo-mirror aliyun --use-http -WIKI: - https://arthas.aliyun.com/doc - -Options and Arguments: - -h,--help Print usage - --target-ip The target jvm listen ip, default 127.0.0.1 - --telnet-port The target jvm listen telnet port, default 3658 - --http-port The target jvm listen http port, default 8563 - --session-timeout The session timeout seconds, default 1800 - (30min) - --arthas-home The arthas home - --use-version Use special version arthas - --repo-mirror Use special maven repository mirror, value is - center/aliyun or http repo url. - --versions List local and remote arthas versions - --use-http Enforce use http to download, default use https - --attach-only Attach target process only, do not connect - -c,--command Command to execute, multiple commands separated - by ; - -f,--batch-file The batch file to execute - --height arthas-client terminal height - --width arthas-client terminal width - -v,--verbose Verbose, print debug info. - --tunnel-server The tunnel server url - --agent-id The agent id register to tunnel server - --stat-url The report stat url - --select select target process by classname or - JARfilename - Target pid - ``` diff --git a/tutorials/katacoda/case-boot-details-en/arthas-demo.md b/tutorials/katacoda/case-boot-details-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/case-boot-details-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/case-boot-details-en/boot-examples.md b/tutorials/katacoda/case-boot-details-en/boot-examples.md deleted file mode 100644 index b041136981a..00000000000 --- a/tutorials/katacoda/case-boot-details-en/boot-examples.md +++ /dev/null @@ -1,105 +0,0 @@ -## Use specified pid - -You can use`jps`{{execute T2}} to check target pid。 - -`java -jar arthas-boot.jar 1`{{execute T2}} - -## Allow external network access - -By default, the arthas server listens for the IP of `127.0.0.1`. If you want remote access, you can use the `--target-ip` option. - -`java -jar arthas-boot.jar --target-ip`{{execute T2}} - -## Specify listening port - -By default, the arthas server listens for the telnet port `3658`,http port `8563`,you can use `--telnet-port`,`--http-port` to specify. - -Only listens at the Telnet port and does not listen at the HTTP port: - -`java -jar arthas-boot.jar --telnet-port 9999 --http-port -1`{{execute T2}} - -## Specify tunnel server - -Use `--tunnel-server` parameter to specify. - -`java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws'`{{execute T2}} - -If the tunnel server has registered with agent id,you can use `--agent-id` parameter to specify. - -`java -jar arthas-boot.jar --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw'`{{execute T2}} - -## Specify report stat url - -Use `--stat-url` parameter to specify. - -`java -jar arthas-boot.jar --stat-url 'http://192.168.10.11:8080/api/stat'`{{execute T2}} - -## List all versions - -`java -jar arthas-boot.jar --versions`{{execute T2}} - -Use the specified version: - -`java -jar arthas-boot.jar --use-version 3.1.0`{{execute T2}} - -## Print verbose information - -Use `-v` or `-verbose`: - -`java -jar arthas-boot.jar -v`{{execute T2}} - -## Specify command to execute and target pid - -Use `--command` or `-c` to specify command to execute and target pid, multiple commands separated by `;`. - -`java -jar arthas-boot.jar -c 'sysprop; thread' 1`{{execute T2}} - -## Specify batch file to execute and target pid - -Use `--batch-file` or `-f` to specify batch file to execute and target pid. - -`java -jar arthas-boot.jar -f batch.as 1`{{execute T2}} - -## select target process by classname or JARfilename - -Use `--select` to select target process by classname or JARfilename. - -`java -jar arthas-boot.jar --select math-game`{{execute T2}} - -## Specify session timeout seconds - -Use `--session-timeout`parameter to specify,default value is 1800(30 min). - -`java -jar arthas-boot.jar --session-timeout 3600`{{execute T2}} - -## Attach target process only, do not connect - -`java -jar arthas-boot.jar --attach-only`{{execute T2}} - -## Use special maven repository mirror,Enforce use http - -`--repo-mirror` to use special maven repository mirror,value is `center/aliyun` or http repo url. - -`--use-http` to enforce use http to download, default use https - -`java -jar arthas-boot.jar --repo-mirror aliyun --use-http`{{execute T2}} - -## Specify arthas client terminal height and width - -`java -jar arthas-boot.jar --height 25 --width 80`{{execute T2}} - -## Specify arthas home - -`java -jar arthas-boot.jar --arthas-home .`{{execute T2}} - -## Start as a Java Agent - -Usually Arthas dynamic attach the applications on the fly, but from version 3.2.0 onwards, Arthas supports starting directly as a java agent. - -For example, download the full arthas zip package, decompress it and start it by specifying arthas-agent.jar with the parameter -javaagent. - -`java -javaagent:/tmp/test/arthas-agent.jar -jar math-game.jar` - -The default configuration is in the arthas.properties file in the decompression directory. - -Reference: https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html diff --git a/tutorials/katacoda/case-boot-details-en/finish.md b/tutorials/katacoda/case-boot-details-en/finish.md deleted file mode 100644 index f8b759a3bed..00000000000 --- a/tutorials/katacoda/case-boot-details-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know boot supported options. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-boot-details-en/index.json b/tutorials/katacoda/case-boot-details-en/index.json deleted file mode 100644 index 292b2caf1fc..00000000000 --- a/tutorials/katacoda/case-boot-details-en/index.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "title": "Arthas boot supported options", - "description": "Arthas boot supported options", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "arthas-boot supported options", - "text": "arthas-boot-details.md" - }, - { - "title": "usage", - "text": "boot-examples.md" - }, - { - "title": "use as.sh", - "text": "use-as-sh.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-boot-details-en/intro.md b/tutorials/katacoda/case-boot-details-en/intro.md deleted file mode 100644 index 3cd78912807..00000000000 --- a/tutorials/katacoda/case-boot-details-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the use case of Arthas boot supported options. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-boot-details-en/use-as-sh.md b/tutorials/katacoda/case-boot-details-en/use-as-sh.md deleted file mode 100644 index f6696fd4ea1..00000000000 --- a/tutorials/katacoda/case-boot-details-en/use-as-sh.md +++ /dev/null @@ -1,10 +0,0 @@ - -Arthas Support express install on Linux/Unix/Mac: - -`curl -L https://arthas.aliyun.com/install.sh | sh`{{execute T2}} - -The command above will download boot script file `as.sh` into current directory,you can put it at any place or list it into `$PATH`. - -Execute `./as.sh` in shell,you will enter UI. - -You can also execute `./as.sh -h` to get more parameter information, which is very similar to `java -jar arthas-boot.jar`. diff --git a/tutorials/katacoda/case-classloader-cn/arthas-boot.md b/tutorials/katacoda/case-classloader-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-classloader-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-classloader-cn/case-classloader.md b/tutorials/katacoda/case-classloader-cn/case-classloader.md deleted file mode 100644 index 8462281e7fe..00000000000 --- a/tutorials/katacoda/case-classloader-cn/case-classloader.md +++ /dev/null @@ -1,154 +0,0 @@ - - -下面介绍`classloader`命令的功能。 - -先访问一个jsp网页,触发jsp的加载: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### 列出所有ClassLoader - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* TomcatEmbeddedWebappClassLoader 加载的class数量是0,所以在spring boot embedded tomcat里,它只是一个空壳,所有的类加载都是`LaunchedURLClassLoader`完成的 - -请记下你的classLoaderHash,后面需要使用它。在这里,它是 `65361d9a`。 - -注意:请使用你的classLoaderHash值覆盖 `` ,然后手动执行下面所有所述命令: - -### 列出ClassLoader里加载的所有类 - -列出上面的`org.apache.jasper.servlet.JasperLoader`加载的类: - -`classloader -a -c ` - -```bash -$ classloader -a -c 65361d9a - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -### 查看类的classloader层次 - -`sc -d org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -### 查看ClassLoader树 - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` - -### 查看URLClassLoader实际的urls - -比如上面查看到的spring LaunchedURLClassLoader的 hashcode是`1be6f5c3`,可以通过`-c`参数来指定classloader,从而查看URLClassLoader实际的urls: - -`classloader -c ` - -``` -$ classloader -c 1be6f5c3 -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### 加载指定ClassLoader里的资源文件 - -查找指定的资源文件: `classloader -c -r logback-spring.xml` - -``` -$ classloader -c 1be6f5c3 -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` -也可以尝试查找类的class文件: - -`classloader -c -r java/lang/String.class` - -```bash -$ classloader -c 1b6d3586 -r java/lang/String.class - jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class -``` - -### 尝试加载指定的类 - -比如用上面的spring LaunchedURLClassLoader 尝试加载 `ch.qos.logback.classic.spi.StackTraceElementProxy` : - -首先使用`sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}查看,可发现未加载: - -```bash -Affect(row-cnt:0) cost in 18 ms. -``` - -因而使用spring LaunchedURLClassLoader 尝试加载: - -`classloader -c --load ch.qos.logback.classic.spi.StackTraceElementProxy` - -```bash -$ classloader -c 1be6f5c3 --load ch.qos.logback.classic.spi.StackTraceElementProxy -load class success. - class-info ch.qos.logback.classic.spi.StackTraceElementProxy - code-source file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classic-1. - 1.11.jar!/ - name ch.qos.logback.classic.spi.StackTraceElementProxy - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name StackTraceElementProxy - modifier public - annotation - interfaces java.io.Serializable - super-class +-java.lang.Object - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - +-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@56a96482 - classLoaderHash 5674cd4d -``` - -再次使用`sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}查看,发现已经加载: - -```bash -ch.qos.logback.classic.spi.StackTraceElementProxy -Affect(row-cnt:1) cost in 19 ms. -``` diff --git a/tutorials/katacoda/case-classloader-cn/finish.md b/tutorials/katacoda/case-classloader-cn/finish.md deleted file mode 100644 index 6443eb93d35..00000000000 --- a/tutorials/katacoda/case-classloader-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas Spring Boot应用的ClassLoader结构。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-classloader-cn/index.json b/tutorials/katacoda/case-classloader-cn/index.json deleted file mode 100644 index 6c038f64822..00000000000 --- a/tutorials/katacoda/case-classloader-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 理解Spring Boot应用的ClassLoader结构 案例", - "description": "Arthas 理解Spring Boot应用的ClassLoader结构 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "理解Spring Boot应用的ClassLoader结构", - "text": "case-classloader.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-classloader-cn/intro.md b/tutorials/katacoda/case-classloader-cn/intro.md deleted file mode 100644 index c856d5d36a7..00000000000 --- a/tutorials/katacoda/case-classloader-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示Arthas Spring Boot应用的ClassLoader结构。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-classloader-cn/start-demo.md b/tutorials/katacoda/case-classloader-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-classloader-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-classloader-en/arthas-boot.md b/tutorials/katacoda/case-classloader-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-classloader-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-classloader-en/case-classloader.md b/tutorials/katacoda/case-classloader-en/case-classloader.md deleted file mode 100644 index 96dfe64ba2b..00000000000 --- a/tutorials/katacoda/case-classloader-en/case-classloader.md +++ /dev/null @@ -1,157 +0,0 @@ - - -The following describes the usage of the `classloader` command. - -First visit the jsp page: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### List all ClassLoaders - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* The number of classes loaded by TomcatEmbeddedWebappClassLoader is 0, so in spring boot embedded tomcat, it is just an empty ClassLoader, all the classes are loaded by `LaunchedURLClassLoader` - - -Please write down your classLoaderHash here, in the case here, it's `65361d9a`. It will be used in the future steps. - -Note: Please replace `` with your classLoaderHash above, then execute the commands manually in the following steps: - -### List all classes loaded in ClassLoader - -List all classes loaded by `org.apache.jasper.servlet.JasperLoader`: - -`classloader -a -c ` - -```bash -$ classloader -a -c 65361d9a - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -### Check the structure of classloader - -`sc -d org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -### View the ClassLoader tree - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` - -### Show the URLs of the URLClassLoader - -For example, the hashcode of spring `LaunchedURLClassLoader` viewed above is `1be6f5c3`, and all its urls can be listed by specifying classloader using the `-c` parameter and then executing the following command: - -`classloader -c ` - -``` -$ classloader -c 1be6f5c3 -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### Load the resource file in the specified ClassLoader - -Load the specified resource file: `classloader -c -r logback-spring.xml` - -``` -$ classloader -c 1be6f5c3 -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` - -Use the classloader to load .class resource - -`classloader -c -r java/lang/String.class` - -```bash -$ classloader -c 1b6d3586 -r java/lang/String.class - jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class -``` - -### Try to load the specified class - -For example, try loading `ch.qos.logback.classic.spi.StackTraceElementProxy` with spring LaunchedURLClassLoader : - -First check with `sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}, you can see that it's unloaded: - -`classloader -c --load java.lang.String` -```bash -Affect(row-cnt:0) cost in 18 ms. -``` - -So use spring LaunchedURLClassLoader to try to load: - -`classloader -c --load ch.qos.logback.classic.spi.StackTraceElementProxy` - -```bash -$ classloader -c 1be6f5c3 --load ch.qos.logback.classic.spi.StackTraceElementProxy -load class success. - class-info ch.qos.logback.classic.spi.StackTraceElementProxy - code-source file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classic-1. - 1.11.jar!/ - name ch.qos.logback.classic.spi.StackTraceElementProxy - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name StackTraceElementProxy - modifier public - annotation - interfaces java.io.Serializable - super-class +-java.lang.Object - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - +-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@56a96482 - classLoaderHash 5674cd4d -``` - -Finally check with `sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}, and you can see that it has been loaded: - -```bash -ch.qos.logback.classic.spi.StackTraceElementProxy -Affect(row-cnt:1) cost in 19 ms. -``` diff --git a/tutorials/katacoda/case-classloader-en/finish.md b/tutorials/katacoda/case-classloader-en/finish.md deleted file mode 100644 index 3014259b245..00000000000 --- a/tutorials/katacoda/case-classloader-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know The ClassLoaders in Spring Boot application. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-classloader-en/index.json b/tutorials/katacoda/case-classloader-en/index.json deleted file mode 100644 index b422269e22b..00000000000 --- a/tutorials/katacoda/case-classloader-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas The ClassLoaders in Spring Boot application", - "description": "Arthas The ClassLoaders in Spring Boot application", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "The ClassLoaders in Spring Boot application", - "text": "case-classloader.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-classloader-en/intro.md b/tutorials/katacoda/case-classloader-en/intro.md deleted file mode 100644 index 249112ff8c8..00000000000 --- a/tutorials/katacoda/case-classloader-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the ClassLoaders in Spring Boot application. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-classloader-en/start-demo.md b/tutorials/katacoda/case-classloader-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-classloader-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-get-spring-context-cn/arthas-boot.md b/tutorials/katacoda/case-get-spring-context-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-get-spring-context-cn/case-get-spring-context.md b/tutorials/katacoda/case-get-spring-context-cn/case-get-spring-context.md deleted file mode 100644 index c689020e6df..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/case-get-spring-context.md +++ /dev/null @@ -1,54 +0,0 @@ - - -在这个案例里,展示获取spring context,再获取bean,然后调用函数。 - -### 使用tt命令获取到spring context - -`tt`即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。 - -* https://arthas.aliyun.com/doc/tt.html - -`tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod`{{execute T2}} - -访问:https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 - -可以看到`tt`命令捕获到了一个请求: - -```bash -$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdaptePress Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 252 ms. - INDE TIMESTAMP COST( IS-R IS- OBJECT CLASS METHOD - X ms) ET EXP ------------------------------------------------------------------------------------------ - 1000 2019-02-15 4.583 true fal 0xc93cf1a RequestMappingHand invokeHandlerMethod - 15:38:32 923 se lerAdapter -``` - -### 使用tt命令从调用记录里获取到spring context - -输入 `Q`{{execute T2}} 或者 `Ctrl + C` 退出上面的 `tt -t`命令。 - -`tt -i 1000 -w 'target.getApplicationContext()'`{{execute T2}} - -```bash -$ tt -i 1000 -w 'target.getApplicationContext()' -@AnnotationConfigEmbeddedWebApplicationContext[ - reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@2e457641], - scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@6eb38026], - annotatedClasses=null, - basePackages=null, -] -Affect(row-cnt:1) cost in 439 ms. -``` - -## 获取spring bean,并调用函数 - -`tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'`{{execute T2}} - -结果是: - -```bash -$ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' -@String[Hello World] -Affect(row-cnt:1) cost in 52 ms. -``` diff --git a/tutorials/katacoda/case-get-spring-context-cn/finish.md b/tutorials/katacoda/case-get-spring-context-cn/finish.md deleted file mode 100644 index f93331f02dd..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas获取Spring Context。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-get-spring-context-cn/index.json b/tutorials/katacoda/case-get-spring-context-cn/index.json deleted file mode 100644 index a8e6ecdf146..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 获取Spring Context 案例", - "description": "Arthas 获取Spring Context 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "获取Spring Context", - "text": "case-get-spring-context.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-get-spring-context-cn/intro.md b/tutorials/katacoda/case-get-spring-context-cn/intro.md deleted file mode 100644 index 09564200ff4..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示获取Spring Context 案例。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-get-spring-context-cn/start-demo.md b/tutorials/katacoda/case-get-spring-context-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-get-spring-context-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-get-spring-context-en/arthas-boot.md b/tutorials/katacoda/case-get-spring-context-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-get-spring-context-en/case-get-spring-context.md b/tutorials/katacoda/case-get-spring-context-en/case-get-spring-context.md deleted file mode 100644 index 0deb22dfc8d..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/case-get-spring-context.md +++ /dev/null @@ -1,54 +0,0 @@ - - -In this case, the user can get the spring context, get the bean, and invoke the method. - -### Use the tt command to record the invocation of the specified method - -`tt` is TimeTunnel, which records the parameters and return value of each invocation of the specified method. - -* https://arthas.aliyun.com/doc/tt.html - -`tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 - -You can see that the `tt` command record an invocation: - -```bash -$ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdaptePress Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 252 ms. - INDE TIMESTAMP COST( IS-R IS- OBJECT CLASS METHOD - X ms) ET EXP ------------------------------------------------------------------------------------------ - 1000 2019-02-15 4.583 true fal 0xc93cf1a RequestMappingHand invokeHandlerMethod - 15:38:32 923 se lerAdapter -``` - -### Use the tt command to get the spring context from the invocation record. - -Type `Q`{{execute T2}} or `Ctrl + C` to exit the `tt -t` command above. - -`tt -i 1000 -w 'target.getApplicationContext()'`{{execute T2}} - -```bash -$ tt -i 1000 -w 'target.getApplicationContext()' -@AnnotationConfigEmbeddedWebApplicationContext[ - reader=@AnnotatedBeanDefinitionReader[org.springframework.context.annotation.AnnotatedBeanDefinitionReader@2e457641], - scanner=@ClassPathBeanDefinitionScanner[org.springframework.context.annotation.ClassPathBeanDefinitionScanner@6eb38026], - annotatedClasses=null, - basePackages=null, -] -Affect(row-cnt:1) cost in 439 ms. -``` - -## Get the spring bean and invoke method - -`tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'`{{execute T2}} - -The result is: - -```bash -$ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' -@String[Hello World] -Affect(row-cnt:1) cost in 52 ms. -``` diff --git a/tutorials/katacoda/case-get-spring-context-en/finish.md b/tutorials/katacoda/case-get-spring-context-en/finish.md deleted file mode 100644 index 6d6aa980ea9..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Get the Spring Context. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-get-spring-context-en/index.json b/tutorials/katacoda/case-get-spring-context-en/index.json deleted file mode 100644 index 1fe6fb36e37..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Get the Spring Context", - "description": "Arthas Get the Spring Context", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Get the Spring Context", - "text": "case-get-spring-context.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-get-spring-context-en/intro.md b/tutorials/katacoda/case-get-spring-context-en/intro.md deleted file mode 100644 index 5683046858a..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the use case of Get the Spring Context. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-get-spring-context-en/start-demo.md b/tutorials/katacoda/case-get-spring-context-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-get-spring-context-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-http-401-cn/arthas-boot.md b/tutorials/katacoda/case-http-401-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-http-401-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-401-cn/case-http-401.md b/tutorials/katacoda/case-http-401-cn/case-http-401.md deleted file mode 100644 index 50ace4e7ced..00000000000 --- a/tutorials/katacoda/case-http-401-cn/case-http-401.md +++ /dev/null @@ -1,53 +0,0 @@ - - -在这个案例里,展示排查HTTP 401问题的技巧。 - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -结果是: - -``` -Something went wrong: 401 Unauthorized -``` - -我们知道`401`通常是被权限管理的`Filter`拦截了,那么到底是哪个`Filter`处理了这个请求,返回了401? - - -### 跟踪所有的Filter函数 - -开始trace: - -`trace javax.servlet.Filter *`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -可以在调用树的最深层,找到`AdminFilterConfig$AdminFilter`返回了`401`: - -``` -+---[3.806273ms] javax.servlet.FilterChain:doFilter() -| `---[3.447472ms] com.example.demo.arthas.AdminFilterConfig$AdminFilter:doFilter() -| `---[0.17259ms] javax.servlet.http.HttpServletResponse:sendError() -``` - -### 通过stack获取调用栈 - -上面是通过`trace`命令来获取信息,从结果里,我们可以知道通过`stack`跟踪`HttpServletResponse:sendError()`,同样可以知道是哪个`Filter`返回了`401` - -执行: - -`stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401'`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -```bash -$ stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401' -Press Q or Ctrl+C to abort. -Affect(class-cnt:2 , method-cnt:4) cost in 87 ms. -ts=2019-02-15 16:44:06;thread_name=http-nio-8080-exec-6;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@8546cd5 - @org.apache.catalina.connector.ResponseFacade.sendError() - at com.example.demo.arthas.AdminFilterConfig$AdminFilter.doFilter(AdminFilterConfig.java:38) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) -``` diff --git a/tutorials/katacoda/case-http-401-cn/finish.md b/tutorials/katacoda/case-http-401-cn/finish.md deleted file mode 100644 index 7e62b5cb0ed..00000000000 --- a/tutorials/katacoda/case-http-401-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas排查HTTP请求返回401。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-http-401-cn/index.json b/tutorials/katacoda/case-http-401-cn/index.json deleted file mode 100644 index 242b578320d..00000000000 --- a/tutorials/katacoda/case-http-401-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 排查HTTP请求返回401 案例", - "description": "Arthas 排查HTTP请求返回401 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "排查HTTP请求返回401", - "text": "case-http-401.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-401-cn/intro.md b/tutorials/katacoda/case-http-401-cn/intro.md deleted file mode 100644 index a971575e3eb..00000000000 --- a/tutorials/katacoda/case-http-401-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示排查HTTP请求返回401。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-http-401-cn/start-demo.md b/tutorials/katacoda/case-http-401-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-http-401-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-http-401-en/arthas-boot.md b/tutorials/katacoda/case-http-401-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-http-401-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-401-en/case-http-401.md b/tutorials/katacoda/case-http-401-en/case-http-401.md deleted file mode 100644 index 2d12a5a99b8..00000000000 --- a/tutorials/katacoda/case-http-401-en/case-http-401.md +++ /dev/null @@ -1,56 +0,0 @@ - - -In this case, the user will resolve the HTTP 401 issue. - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -The result is: - -``` -Something went wrong: 401 Unauthorized -``` - -We know that `401` is usually intercepted by the permission-managed `Filter`, so which `Filter` returns 401? - - -### Track all Filter methods - -Start trace: - -`trace javax.servlet.Filter *`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -At the deepest level of the call tree, you can find `AdminFilterConfig$AdminFilter` which returns `401`: - -``` -+---[3.806273ms] javax.servlet.FilterChain:doFilter() -| `---[3.447472ms] com.example.demo.arthas.AdminFilterConfig$AdminFilter:doFilter() -| `---[0.17259ms] javax.servlet.http.HttpServletResponse:sendError() -``` - -### Get the call stack through stack command - -From the above result, we can find the method: `HttpServletResponse:sendError()`. So we can use `stack` command to resolved the HTTP `401` issue. - - -Run: - -`stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401'`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/admin - -The Result: - -```bash -$ stack javax.servlet.http.HttpServletResponse sendError 'params[0]==401' -Press Q or Ctrl+C to abort. -Affect(class-cnt:2 , method-cnt:4) cost in 87 ms. -ts=2019-02-15 16:44:06;thread_name=http-nio-8080-exec-6;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader@8546cd5 - @org.apache.catalina.connector.ResponseFacade.sendError() - at com.example.demo.arthas.AdminFilterConfig$AdminFilter.doFilter(AdminFilterConfig.java:38) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) - at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) - at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) -``` diff --git a/tutorials/katacoda/case-http-401-en/case-watch-method-exception.md b/tutorials/katacoda/case-http-401-en/case-watch-method-exception.md deleted file mode 100644 index 9a0e1c2c185..00000000000 --- a/tutorials/katacoda/case-http-401-en/case-watch-method-exception.md +++ /dev/null @@ -1,98 +0,0 @@ - - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -But what are the specific parameters of the request, what is the exception stack? - -### View the parameters/exception of UserController - -Execute in Arthas: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}'`{{execute T2}} - - -1. The first argument is the class name, which supports wildcards. -2. The second argument is the function name, which supports wildcards. - -Visit `curl http://localhost/user/0`{{execute T3}} , the `watch` command will print the parameters and exception - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 53 ms. -ts=2019-02-15 01:35:25; [cost=0.996655ms] result=@ArrayList[ - @Object[][isEmpty=false;size=1], - @IllegalArgumentException[java.lang.IllegalArgumentException: id < 1], -] -``` - - -The user can see that the actual thrown exception is `IllegalArgumentException`. - -The user can exit the watch command by typing `Q`{{execute T2}} or `Ctrl+C`. - -If the user want to expand the result, can use the `-x` option: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2`{{execute T2}} - -### The return value expression - -In the above example, the third argument is the `return value expression`, which is actually an `ognl` expression that supports some built-in objects: - -* loader -* clazz -* method -* target -* params -* returnObj -* throwExp -* isBefore -* isThrow -* isReturn - -You can use these built-in objects in the expressions. For example, return an array: - -`watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'`{{execute T2}} - - -More references: https://arthas.aliyun.com/doc/en/advice-class.html - - -### The conditional expression - -The `watch` command supports conditional expressions in the fourth argument, such as: - -`watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'`{{execute T2}} - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 , the `watch` command print nothing. - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/101 , the `watch` command will print: - -```bash -$ watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 47 ms. -ts=2019-02-13 19:42:12; [cost=0.821443ms] result=@User[ - id=@Integer[101], - name=@String[name101], -] -``` - -### Capture when an exception occurs - -The `watch` command supports the `-e` option, which means that only requests that throw an exception are caught: - -`watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e`{{execute T2}} - - -### Filter by cost - -The watch command supports filtering by cost, such as: - -`watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-401-en/finish.md b/tutorials/katacoda/case-http-401-en/finish.md deleted file mode 100644 index e494436241b..00000000000 --- a/tutorials/katacoda/case-http-401-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Troubleshooting HTTP request returns 401. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-http-401-en/index.json b/tutorials/katacoda/case-http-401-en/index.json deleted file mode 100644 index a56942099b7..00000000000 --- a/tutorials/katacoda/case-http-401-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Troubleshooting HTTP request returns 401", - "description": "Arthas Troubleshooting HTTP request returns 401", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Troubleshooting HTTP request returns 401", - "text": "case-http-401.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-401-en/intro.md b/tutorials/katacoda/case-http-401-en/intro.md deleted file mode 100644 index a3bbb1a3b20..00000000000 --- a/tutorials/katacoda/case-http-401-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate Troubleshooting HTTP request returns 401. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-http-401-en/start-demo.md b/tutorials/katacoda/case-http-401-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-http-401-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-http-404-cn/arthas-boot.md b/tutorials/katacoda/case-http-404-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-http-404-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-404-cn/case-http-404.md b/tutorials/katacoda/case-http-404-cn/case-http-404.md deleted file mode 100644 index 16219f9c3eb..00000000000 --- a/tutorials/katacoda/case-http-404-cn/case-http-404.md +++ /dev/null @@ -1,39 +0,0 @@ - - -在这个案例里,展示排查HTTP 404问题的技巧。 - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -结果是: - -``` -Something went wrong: 404 Not Found -``` - -那么到底是哪个Servlet处理了这个请求,返回了404? - -### 跟踪所有的Servlet函数 - -开始trace: - -`trace javax.servlet.Servlet * > /tmp/servlet.txt`{{execute T2}} - -访问: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -在`Terminal 3`里,查看`/tmp/servlet.txt`的内容: - -`less /tmp/servlet.txt`{{execute T3}} - -`/tmp/servlet.txt`里的内容会比较多,需要耐心找到调用树里最长的地方。 - -可以发现请求最终是被`freemarker`处理的: - -``` -`---[13.974188ms] org.springframework.web.servlet.ViewResolver:resolveViewName() - +---[0.045561ms] javax.servlet.GenericServlet:() - +---[min=0.045545ms,max=0.074342ms,total=0.119887ms,count=2] org.springframework.web.servlet.view.freemarker.FreeMarkerView$GenericServletAdapter:() - +---[0.170895ms] javax.servlet.GenericServlet:init() - | `---[0.068578ms] javax.servlet.GenericServlet:init() - | `---[0.021793ms] javax.servlet.GenericServlet:init() - `---[0.164035ms] javax.servlet.GenericServlet:getServletContext() -``` diff --git a/tutorials/katacoda/case-http-404-cn/finish.md b/tutorials/katacoda/case-http-404-cn/finish.md deleted file mode 100644 index 864518283b7..00000000000 --- a/tutorials/katacoda/case-http-404-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas排查HTTP请求返回404。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-http-404-cn/index.json b/tutorials/katacoda/case-http-404-cn/index.json deleted file mode 100644 index 615fdc63893..00000000000 --- a/tutorials/katacoda/case-http-404-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 排查HTTP请求返回404 案例", - "description": "Arthas 排查HTTP请求返回404 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "排查HTTP请求返回404", - "text": "case-http-404.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-404-cn/intro.md b/tutorials/katacoda/case-http-404-cn/intro.md deleted file mode 100644 index a017fcf525b..00000000000 --- a/tutorials/katacoda/case-http-404-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示排查HTTP请求返回404。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-http-404-cn/start-demo.md b/tutorials/katacoda/case-http-404-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-http-404-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-http-404-en/arthas-boot.md b/tutorials/katacoda/case-http-404-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-http-404-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-404-en/case-http-404.md b/tutorials/katacoda/case-http-404-en/case-http-404.md deleted file mode 100644 index 8f25c7c8c02..00000000000 --- a/tutorials/katacoda/case-http-404-en/case-http-404.md +++ /dev/null @@ -1,39 +0,0 @@ - - -In this case, the user will resolve the HTTP 404 issue. - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -The result is: - -``` -Something went wrong: 404 Not Found -``` - -So which servlet is handle this request and returning 404? - -### Trace all the Servlet methods - -Start trace: - -`trace javax.servlet.Servlet * > /tmp/servlet.txt`{{execute T2}} - -Visit: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/a.txt - -In `Terminal 3`, view the contents of `/tmp/servlet.txt`: - -`less /tmp/servlet.txt`{{execute T3}} - -The contents of `/tmp/servlet.txt` will be more, and you need to be patient to find the longest level in the call tree. - -It can be found that the request is handled by `freemarker`: - -``` -`---[13.974188ms] org.springframework.web.servlet.ViewResolver:resolveViewName() - +---[0.045561ms] javax.servlet.GenericServlet:() - +---[min=0.045545ms,max=0.074342ms,total=0.119887ms,count=2] org.springframework.web.servlet.view.freemarker.FreeMarkerView$GenericServletAdapter:() - +---[0.170895ms] javax.servlet.GenericServlet:init() - | `---[0.068578ms] javax.servlet.GenericServlet:init() - | `---[0.021793ms] javax.servlet.GenericServlet:init() - `---[0.164035ms] javax.servlet.GenericServlet:getServletContext() -``` diff --git a/tutorials/katacoda/case-http-404-en/finish.md b/tutorials/katacoda/case-http-404-en/finish.md deleted file mode 100644 index 3ae3a4f2d01..00000000000 --- a/tutorials/katacoda/case-http-404-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Troubleshooting HTTP request returns 404. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-http-404-en/index.json b/tutorials/katacoda/case-http-404-en/index.json deleted file mode 100644 index 474d22d3678..00000000000 --- a/tutorials/katacoda/case-http-404-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Troubleshooting HTTP request returns 404", - "description": "Arthas Troubleshooting HTTP request returns 404", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Troubleshooting HTTP request returns 404", - "text": "case-http-404.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-404-en/intro.md b/tutorials/katacoda/case-http-404-en/intro.md deleted file mode 100644 index 5c643e6aa6c..00000000000 --- a/tutorials/katacoda/case-http-404-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate Troubleshooting HTTP request returns 404. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-http-404-en/start-demo.md b/tutorials/katacoda/case-http-404-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-http-404-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-http-api-cn/arthas-boot.md b/tutorials/katacoda/case-http-api-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-http-api-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-api-cn/arthas-demo.md b/tutorials/katacoda/case-http-api-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-http-api-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-http-api-cn/classpath-java-app.md b/tutorials/katacoda/case-http-api-cn/classpath-java-app.md deleted file mode 100644 index 7825b43ced0..00000000000 --- a/tutorials/katacoda/case-http-api-cn/classpath-java-app.md +++ /dev/null @@ -1,30 +0,0 @@ - -通过Http api查询Java应用的System properties,提取`java.class.path`的值。 - -`json_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"exec", - "command":"sysprop" -}')`{{execute T3}} - -* 使用`sed`提取值: - -`class_path=$(echo $json_data | tr -d '\n' | sed 's/.*"java.class.path":"\([^"]*\).*/\1/') -echo "classpath: $class_path"`{{execute T3}} - -* 使用`json_pp/awk`提取值 - -`class_path=$(echo $json_data | tr -d '\n' | json_pp | grep java.class.path | awk -F'"' '{ print $4 }') -echo "classpath: $class_path"`{{execute T3}} - -输出内容: - -``` -classpath: math-game.jar -``` - -注意: - -* `echo $json_data | tr -d '\n'` : 删除换行符(`line.separator`的值),避免影响`sed`/`json_pp`命令处理。 -* `awk -F'"' '{ print $4 }'` : 使用双引号作为分隔符号 - diff --git a/tutorials/katacoda/case-http-api-cn/finish.md b/tutorials/katacoda/case-http-api-cn/finish.md deleted file mode 100644 index ff95ac30929..00000000000 --- a/tutorials/katacoda/case-http-api-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“Http API”中,我们演示了了Arthas的Http API案例。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-http-api-cn/http-api.md b/tutorials/katacoda/case-http-api-cn/http-api.md deleted file mode 100644 index c606415910a..00000000000 --- a/tutorials/katacoda/case-http-api-cn/http-api.md +++ /dev/null @@ -1,59 +0,0 @@ - -### 概览 - -Http API -提供类似RESTful的交互接口,请求和响应均为JSON格式的数据。相对于Telnet/WebConsole的输出非结构化文本数据,Http -API可以提供结构化的数据,支持更复杂的交互功能,比如特定应用场景的一系列诊断操作。 - - -#### 访问地址 - -Http API接口地址为:`http://ip:port/api`,必须使用POST方式提交请求参数。如POST -`http://127.0.0.1:8563/api` 。 - -注意:telnet服务的3658端口与Chrome浏览器有兼容性问题,建议使用http端口8563来访问http接口。 - -#### 请求数据格式 - -```json -{ - "action": "exec", - "requestId": "req112", - "sessionId": "94766d3c-8b39-42d3-8596-98aee3ccbefb", - "consumerId": "955dbd1325334a84972b0f3ac19de4f7_2", - "command": "version", - "execTimeout": "10000" -} -``` - -请求数据格式说明: - -* `action` : 请求的动作/行为,可选值请参考"请求Action"小节。 -* `requestId` : 可选请求ID,由客户端生成。 -* `sessionId` : Arthas会话ID,一次性命令不需要设置会话ID。 -* `consumerId` : Arthas消费者ID,用于多人共享会话。 -* `command` : Arthas command line 。 -* `execTimeout` : 命令同步执行的超时时间(ms),默认为30000。 - -注意: 不同的action使用到参数不同,根据具体的action来设置参数。 - -#### 请求Action - -目前支持的请求Action如下: - -* `exec` : 同步执行命令,命令正常结束或者超时后中断命令执行后返回命令的执行结果。 -* `async_exec` : 异步执行命令,立即返回命令的调度结果,命令执行结果通过`pull_results`获取。 -* `interrupt_job` : 中断会话当前的命令,类似Telnet `Ctrl + c`的功能。 -* `pull_results` : 获取异步执行的命令的结果,以http 长轮询(long-polling)方式重复执行 -* `init_session` : 创建会话 -* `join_session` : 加入会话,用于支持多人共享同一个Arthas会话 -* `close_session` : 关闭会话 - -#### 响应状态 - -响应中的state属性表示请求处理状态,取值如下: - -* `SCHEDULED`:异步执行命令时表示已经创建job并已提交到命令执行队列,命令可能还没开始执行或者执行中; -* `SUCCEEDED`:请求处理成功(完成状态); -* `FAILED`:请求处理失败(完成状态),通常附带message说明原因; -* `REFUSED`:请求被拒绝(完成状态),通常附带message说明原因; diff --git a/tutorials/katacoda/case-http-api-cn/index.json b/tutorials/katacoda/case-http-api-cn/index.json deleted file mode 100644 index 81ee85a599f..00000000000 --- a/tutorials/katacoda/case-http-api-cn/index.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "title": "Arthas Http API案例", - "description": "Arthas Http API案例", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Http API", - "text": "http-api.md" - }, - { - "title": "一次性命令", - "text": "one-time-command.md" - }, - { - "title": "会话交互", - "text": "session-interaction.md" - }, - { - "title": "Web UI", - "text": "web-ui.md" - }, - { - "title": "watch命令输出map对象", - "text": "watch-output-map.md" - }, - { - "title": "获取Java应用的Classpath", - "text": "classpath-java-app.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 8563", - "port": 8563 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-api-cn/intro.md b/tutorials/katacoda/case-http-api-cn/intro.md deleted file mode 100644 index b5141705696..00000000000 --- a/tutorials/katacoda/case-http-api-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示http-api案例。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc diff --git a/tutorials/katacoda/case-http-api-cn/one-time-command.md b/tutorials/katacoda/case-http-api-cn/one-time-command.md deleted file mode 100644 index 2ed12bb74da..00000000000 --- a/tutorials/katacoda/case-http-api-cn/one-time-command.md +++ /dev/null @@ -1,82 +0,0 @@ - -与执行批处理命令类似,一次性命令以同步方式执行。不需要创建会话,不需要设置`sessionId`选项。 - -```json -{ - "action": "exec", - "command": "" -} -``` - -比如获取Arthas版本号: - -`curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"exec", - "command":"version" -} -' | json_pp`{{execute T3}} - -响应内容如下: - -```json -{ - "state" : "SUCCEEDED", - "sessionId" : "ee3bc004-4586-43de-bac0-b69d6db7a869", - "body" : { - "results" : [ - { - "type" : "version", - "version" : "3.3.7", - "jobId" : 5 - }, - { - "jobId" : 5, - "statusCode" : 0, - "type" : "status" - } - ], - "timeExpired" : false, - "command" : "version", - "jobStatus" : "TERMINATED", - "jobId" : 5 - } -} -``` - -响应数据解析: - -* `state`: 请求处理状态,参考“接口响应状态”说明 -* `sessionId `: Arthas会话ID,一次性命令自动创建及销毁临时会话 -* `body.jobId`: 命令的任务ID,同一任务输出的所有Result都是相同的jobId -* `body.jobStatus`: 任务状态,同步执行正常结束为`TERMINATED ` -* `body.timeExpired`: 任务执行是否超时 -* `body/results`: 命令执行的结果列表 - -**命令结果格式说明** - -```json - [{ - "type" : "version", - "version" : "3.3.7", - "jobId" : 5 - }, - { - "jobId" : 5, - "statusCode" : 0, - "type" : "status" - }] -``` - -* `type` : 命令结果类型,除了`status`等特殊的几个外,其它的保持与Arthas命令名称一致。请参考"特殊命令结果"小节。 -* `jobId` : 处理命令的任务ID。 -* 其它字段为每个不同命令的数据。 - -注意:也可以使用一次性命令的方式执行watch/trace等连续输出的命令,但不能中断命令执行,可能出现长时间没有结束的问题。请参考"watch命令输出map对象"小节的示例。 - -请尽量按照以下方式处理: - -* 设置合理的`execTimeout`,到达超时时间后强制中断命令执行,避免长时间挂起。 -* 通过`-n`参数指定较少的执行次数。 -* 保证命令匹配的方法可以成功命中和condition-express编写正确,如果watch/trace没有命中就算指定`-n - 1`也会挂起等待到执行超时。 diff --git a/tutorials/katacoda/case-http-api-cn/session-interaction.md b/tutorials/katacoda/case-http-api-cn/session-interaction.md deleted file mode 100644 index da04b699537..00000000000 --- a/tutorials/katacoda/case-http-api-cn/session-interaction.md +++ /dev/null @@ -1,323 +0,0 @@ - -由用户创建及管理Arthas会话,适用于复杂的交互过程。访问流程如下: - -* 创建会话 -* 加入会话(可选) -* 拉取命令结果 -* 执行一系列命令 -* 中断命令执行 -* 关闭会话 - -#### 创建会话 - -创建会话, 保存输出到bash环境变量 - -`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"init_session" -} -') -echo $session_data | json_pp`{{execute T3}} - -注: `json_pp` 工具将输出内容格式化为pretty json。 - -响应结果: - -```json -{ - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "consumerId" : "5ae4e5fbab8b4e529ac404f260d4e2d1_1", - "state" : "SUCCEEDED" -} -``` - -提取会话ID和消费者ID。 - -当前会话ID为: - -`session_id=$(echo $session_data | sed 's/.*"sessionId":"\([^"]*\)".*/\1/g') -echo $session_id`{{execute T3}} - -`b09f1353-202c-407b-af24-701b744f971e`; - -请记下这里的会话ID,在Terminal 4中需要手动输入。 - -当前消费者ID为: - -`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g') -echo $consumer_id`{{execute T3}} - -`5ae4e5fbab8b4e529ac404f260d4e2d1_1 `。 - -#### 加入会话 - -指定要加入的会话ID,服务端将分配一个新的消费者ID。多个消费者可以接收到同一个会话的命令结果。本接口用于支持多人共享同一个会话或刷新页面后重新拉取会话历史记录。 - -加入会话,保存输出到bash环境变量 - -`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"join_session", - "sessionId" : "'"$session_id"'" -} -') -echo $session_data | json_pp`{{execute T3}} - -响应结果: - -```json -{ - "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2", - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "state" : "SUCCEEDED" -} -``` - -提取消费者ID。 - -新的消费者ID为 - -`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g') -echo $consumer_id`{{execute T3}} - -`8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` 。 - -请记下这里的消费者ID,在Terminal 4中需要手动输入。 - -#### 拉取命令结果 - -拉取命令结果消息的action为`pull_results`。请使用Http long-polling方式,定时循环拉取结果消息。 -消费者的超时时间为5分钟,超时后需要调用`join_session`分配新的消费者。每个消费者单独分配一个缓存队列,按顺序拉取命令结果,不会影响到其它消费者。 - -请求参数需要指定会话ID及消费者ID: - -`curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"pull_results", - "sessionId" : "'"$session_id"'", - "consumerId" : "'"$consumer_id"'" -} -' | json_pp`{{execute T3}} - -用Bash脚本定时拉取结果消息: - -请在Terminal 4中输入Terminal 3中的会话ID,这里的例子如下: - -`b09f1353-202c-407b-af24-701b744f971e` - -`echo -n "Enter your sessionId in T3:" -read session_id`{{execute T4}} - -同样,接着输入Terminal 3中的消费者ID,这里的例子如下: - -`8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` - -`echo -n "Enter your consumerId in T3:" -read consumer_id`{{execute T4}} - -`while true; do curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"pull_results", - "sessionId" : "'"$session_id"'", - "consumerId" : "'"$consumer_id"'" -} -' | json_pp; sleep 2; done`{{execute T4}} - -响应内容如下: - -```json -{ - "body" : { - "results" : [ - { - "inputStatus" : "DISABLED", - "jobId" : 0, - "type" : "input_status" - }, - { - "type" : "message", - "jobId" : 0, - "message" : "Welcome to arthas!" - }, - { - "tutorials" : "https://arthas.aliyun.com/doc/arthas-tutorials.html", - "time" : "2020-08-06 15:56:43", - "type" : "welcome", - "jobId" : 0, - "pid" : "7909", - "wiki" : "https://arthas.aliyun.com/doc", - "version" : "3.3.7" - }, - { - "inputStatus" : "ALLOW_INPUT", - "type" : "input_status", - "jobId" : 0 - } - ] - }, - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2", - "state" : "SUCCEEDED" -} - -``` - - -#### 异步执行命令 - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"async_exec", - "command":"watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" ", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -`async_exec` 的结果: - -```json -{ - "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a", - "state" : "SCHEDULED", - "body" : { - "jobStatus" : "READY", - "jobId" : 3, - "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" " - } -} -``` - -* `state` : `SCHEDULED` 状态表示已经解析命令生成任务,但未开始执行。 -* `body.jobId` : - 异步执行命令的任务ID,可以根据此任务ID来过滤在`pull_results`输出的命令结果。 -* `body.jobStatus` : 任务状态`READY`表示未开始执行。 - - -切换到上面自动拉取结果消息脚本的shell(Terminal 4),查看输出: - -```json -{ - "body" : { - "results" : [ - { - "type" : "command", - "jobId" : 3, - "state" : "SCHEDULED", - "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" " - }, - { - "inputStatus" : "ALLOW_INTERRUPT", - "jobId" : 0, - "type" : "input_status" - }, - { - "success" : true, - "jobId" : 3, - "effect" : { - "listenerId" : 3, - "cost" : 24, - "classCount" : 1, - "methodCount" : 1 - }, - "type" : "enhancer" - }, - { - "sizeLimit" : 10485760, - "expand" : 1, - "jobId" : 3, - "type" : "watch", - "cost" : 0.071499, - "ts" : 1596703453237, - "value" : [ - [ - -170365 - ], - null, - { - "stackTrace" : [ - { - "className" : "demo.MathGame", - "classLoaderName" : "app", - "methodName" : "primeFactors", - "nativeMethod" : false, - "lineNumber" : 46, - "fileName" : "MathGame.java" - }, - ... - ], - "localizedMessage" : "number is: -170365, need >= 2", - "@type" : "java.lang.IllegalArgumentException", - "message" : "number is: -170365, need >= 2" - } - ] - }, - { - "type" : "watch", - "cost" : 0.033375, - "jobId" : 3, - "ts" : 1596703454241, - "value" : [ - [ - 1 - ], - [ - 2, - 2, - 2, - 2, - 13, - 491 - ], - null - ], - "sizeLimit" : 10485760, - "expand" : 1 - } - ] - }, - "consumerId" : "8ecb9cb7c7804d5d92e258b23d5245cc_1", - "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a", - "state" : "SUCCEEDED" -} -``` - -watch命令结果的`value`为watch-experss的值,上面命令中为`{params, returnObj, -throwExp}`,所以watch结果的value为一个长度为3的数组,每个元素分别对应相应顺序的表达式。 -请参考"watch命令输出map对象"小节。 - -#### 中断命令执行 - -中断会话正在运行的前台Job(前台任务): - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"interrupt_job", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -```json -{ - "state" : "SUCCEEDED", - "body" : { - "jobStatus" : "TERMINATED", - "jobId" : 3 - } -} -``` - -#### 关闭会话 -指定会话ID,关闭会话。 - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"close_session", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -```json -{ - "state" : "SUCCEEDED" -} -``` diff --git a/tutorials/katacoda/case-http-api-cn/watch-output-map.md b/tutorials/katacoda/case-http-api-cn/watch-output-map.md deleted file mode 100644 index 3d1cf29592e..00000000000 --- a/tutorials/katacoda/case-http-api-cn/watch-output-map.md +++ /dev/null @@ -1,87 +0,0 @@ - -watch的结果值由计算`watch-express` ognl表达式产生,可以通过改变ognl表达式来生成想要的值,请参考[OGNL文档](https://commons.apache.org/proper/commons-ognl/language-guide.html)。 - -> Maps can also be created using a special syntax. -> ->#{ "foo" : "foo value", "bar" : "bar value" } -> ->This creates a Map initialized with mappings for "foo" and "bar". - -下面的命令生成map格式的值: - -```bash -watch *MathGame prime* '#{ "params" : params, "returnObj" : returnObj, "throwExp": throwExp}' -x 2 -n 5 -``` - -在Telnet shell/WebConsole 中执行上面的命令,输出的结果: - -```bash -ts=2020-08-06 16:57:20; [cost=0.241735ms] result=@LinkedHashMap[ - @String[params]:@Object[][ - @Integer[1], - ], - @String[returnObj]:@ArrayList[ - @Integer[2], - @Integer[241], - @Integer[379], - ], - @String[throwExp]:null, -] -``` - -用Http api 执行上面的命令,注意对JSON双引号转义: - -`curl -Ss -XPOST http://localhost:8563/api -d @- << EOF -{ - "action":"exec", - "execTimeout": 30000, - "command":"watch *MathGame prime* '#{ \"params\" : params, \"returnObj\" : returnObj, \"throwExp\": throwExp}' -n 3 " -} -EOF`{{execute T3}} - -Http api 执行结果: - -```json -{ - "body": { - ... - "results": [ - ... - { - ... - "type": "watch", - "value": { - "params": [ - 1 - ], - "returnObj": [ - 2, - 5, - 17, - 23, - 23 - ] - } - }, - { - ... - "type": "watch", - "value": { - "params": [ - -98278 - ], - "throwExp": { - "@type": "java.lang.IllegalArgumentException", - "localizedMessage": "number is: -98278, need >= 2", - "message": "number is: -98278, need >= 2", - "stackTrace": [ - ... - ] - } - } - }, - ... -} -``` - -可以看到watch结果的value变成map对象,程序可以通过key读取结果。 diff --git a/tutorials/katacoda/case-http-api-cn/web-ui.md b/tutorials/katacoda/case-http-api-cn/web-ui.md deleted file mode 100644 index 48e3efd2557..00000000000 --- a/tutorials/katacoda/case-http-api-cn/web-ui.md +++ /dev/null @@ -1,19 +0,0 @@ - -![](https://arthas.aliyun.com/doc/_images/arthas-web-ui.png "arthas web ui") - -一个基于Http API接口实现的Web UI,访问地址为: https://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/ui 。 - -已实现功能: - -* 创建会话 -* 复制并打开url加入会话,多人共享会话 -* 周期性拉取会话命令结果消息 -* 刷新页面或者加入会话拉取会话历史命令消息 -* 输入命令/中断命令状态控制 - -待开发功能: - -* 改进将命令结果消息可读性 -* 命令输入支持自动完成及命令模板 -* 提供命令帮助 -* 支持个人选项设置 diff --git a/tutorials/katacoda/case-http-api-en/arthas-boot.md b/tutorials/katacoda/case-http-api-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-http-api-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-http-api-en/arthas-demo.md b/tutorials/katacoda/case-http-api-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/case-http-api-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/case-http-api-en/classpath-java-app.md b/tutorials/katacoda/case-http-api-en/classpath-java-app.md deleted file mode 100644 index ebaac2fab32..00000000000 --- a/tutorials/katacoda/case-http-api-en/classpath-java-app.md +++ /dev/null @@ -1,32 +0,0 @@ - -Get system properties of the Java application through Http api and -extract the value of `java.class.path`. - -`json_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"exec", - "command":"sysprop" -}')`{{execute T3}} - -* Extract value with `sed`: - -`class_path=$(echo $json_data | tr -d '\n' | sed 's/.*"java.class.path":"\([^"]*\).*/\1/') -echo "classpath: $class_path"`{{execute T3}} - -* Extract value with `json_pp/awk`: - -`class_path=$(echo $json_data | tr -d '\n' | json_pp | grep java.class.path | awk -F'"' '{ print $4 }') -echo "classpath: $class_path"`{{execute T3}} - -Output: - -``` -classpath: math-game.jar -``` - -NOTE: - -* `echo $json_data | tr -d '\n'` : Delete line breaks (the value of - `line.separator`) to avoid affecting the processing of `sed`/`json_pp` - commands. -* `awk -F'"' '{ print $4 }'` : Use double quote as delimiter diff --git a/tutorials/katacoda/case-http-api-en/finish.md b/tutorials/katacoda/case-http-api-en/finish.md deleted file mode 100644 index 55fdd649af4..00000000000 --- a/tutorials/katacoda/case-http-api-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `Http API Tutorial` demonstrates the usage of Http API. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-http-api-en/http-api.md b/tutorials/katacoda/case-http-api-en/http-api.md deleted file mode 100644 index 76a76c32a02..00000000000 --- a/tutorials/katacoda/case-http-api-en/http-api.md +++ /dev/null @@ -1,79 +0,0 @@ - -### Overview - -Http API provides a RESTful-like interactive interface, and both -requests and responses data in JSON format. Compared with -Telnet/WebConsole's output unstructured text data, Http API can provide -structured data and support more complex interactive functions, such as -a series of diagnostic operations in specific application scenarios. - - -#### Access address - -The Http API address is: `http://ip:port/api`, the request parameters -must be submitted using `POST`. Such as POST -`http://127.0.0.1:8563/api`. - -Note: The telnet port `3658` has compatibility issues with the Chrome -browser. It is recommended to use the http port `8563` to access the -http api. - - -#### Request data format - -```json -{ - "action": "exec", - "requestId": "req112", - "sessionId": "94766d3c-8b39-42d3-8596-98aee3ccbefb", - "consumerId": "955dbd1325334a84972b0f3ac19de4f7_2", - "command": "version", - "execTimeout": "10000" -} -``` -Request data format description: - -* `action` : The requested action/behavior, please refer to "Request - Actions" for optional values. -* `requestId` : Optional request ID, generated by the client. -* `sessionId` : Arthas session ID, one-time command does not need to - set the session ID. -* `consumerId` : Arthas consumer ID, used for multi-person sharing - sessions. -* `command` : Arthas command line -* `execTimeout` : Timeout for executing commands (ms), default value is 30000. - -Note: Different actions use different parameters. Set the parameters -according to the specific action. - -#### Request Actions - -Currently supported request actions are as follows: - -* `exec` : The command is executed synchronously, and the command - results is returned after the command execution end or interrupted. -* `async_exec` : The command is executed asynchronously, and the - scheduling result of the command is returned immediately. The command - execution result is obtained through `pull_results` action. -* `interrupt_job` : To interrupt the foreground command of the session, - similar to the function of Telnet `Ctrl + c`. -* `pull_results` : Get the result of the command executed - asynchronously, and execute it repeatedly in http long-polling mode. -* `init_session` : Create new session. -* `join_session` : Join the session, used to support multiple people - sharing the same Arthas session. -* `close_session` : Close the session. - -#### Response status - -The state attribute in the response indicates the request processing -state, and its value is as follows: - -* `SCHEDULED`: When the command is executed asynchronously, it means that - the job has been created, and may not be executed yet or is being - executed; -* `SUCCEEDED`: The request is processed successfully (completed status); -* `FAILED`: Request processing failed (completed status), usually - accompanied by a message explaining the reason; -* `REFUSED`: The request is rejected (completed status), usually - accompanied by a message explaining the reason; diff --git a/tutorials/katacoda/case-http-api-en/index.json b/tutorials/katacoda/case-http-api-en/index.json deleted file mode 100644 index 5119060dceb..00000000000 --- a/tutorials/katacoda/case-http-api-en/index.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "title": "Arthas Case Http API", - "description": "Arthas Case Http API", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Http API", - "text": "http-api.md" - }, - { - "title": "One-time command", - "text": "one-time-command.md" - }, - { - "title": "Session Interaction", - "text": "session-interaction.md" - }, - { - "title": "Web UI", - "text": "web-ui.md" - }, - { - "title": "Make watch command output a map object", - "text": "watch-output-map.md" - }, - { - "title": "Get classpath of Java application", - "text": "classpath-java-app.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 8563", - "port": 8563 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-http-api-en/intro.md b/tutorials/katacoda/case-http-api-en/intro.md deleted file mode 100644 index fb5e64a312c..00000000000 --- a/tutorials/katacoda/case-http-api-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of Http API. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-http-api-en/one-time-command.md b/tutorials/katacoda/case-http-api-en/one-time-command.md deleted file mode 100644 index 6bc3de78b43..00000000000 --- a/tutorials/katacoda/case-http-api-en/one-time-command.md +++ /dev/null @@ -1,97 +0,0 @@ - -Similar to executing batch commands, the one-time commands are executed -synchronously. No need to create a session, no need to set the -`sessionId` option. - -```json -{ - "action": "exec", - "command": "" -} -``` - -For example, get the Arthas version number: - -`curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"exec", - "command":"version" -} -' | json_pp`{{execute T3}} - -The response is as follows: - -```json -{ - "state" : "SUCCEEDED", - "sessionId" : "ee3bc004-4586-43de-bac0-b69d6db7a869", - "body" : { - "results" : [ - { - "type" : "version", - "version" : "3.3.7", - "jobId" : 5 - }, - { - "jobId" : 5, - "statusCode" : 0, - "type" : "status" - } - ], - "timeExpired" : false, - "command" : "version", - "jobStatus" : "TERMINATED", - "jobId" : 5 - } -} -``` -Response data format description: - -* `state`: Request processing status, refer to the description of - "Response Status". -* `sessionId `: Arthas session ID, one-time command to automatically - create and destroy temporary sessions. -* `body.jobId`: The job ID of the command, all output results of the - same job are the same jobId. -* `body.jobStatus`: The job status of the command. -* `body.timeExpired`: Whether the job execution timed out. -* `body/results`: Command execution results. - -**Command result format description** - -```json - [{ - "type" : "version", - "version" : "3.3.7", - "jobId" : 5 - }, - { - "jobId" : 5, - "statusCode" : 0, - "type" : "status" - }] -``` - -* `type` : The command result type, except for the special ones such as - `status`, the others remain the same as the Arthas command name. - Please refer to the section - "Special command results". -* `jobId` : The job ID of the command. -* Other fields are the data of each different command. - -Note: You can also use a one-time command to execute continuous output -commands such as watch/trace, but you can't interrupt the command -execution, and there may be hang up for a long time. Please refer to the -example in the -"Make watch command output a map object" -section. - -Please try to deal with it in the following way: - -* Set a reasonable `execTimeout` to forcibly interrupt the command - execution after the timeout period is reached to avoid a long hang. -* Use the `-n` parameter to specify a smaller number of executions. -* Ensure the methods of the command matched can be successfully hit and - the `condition-express` is written correctly. If the `watch/trace` does - not hit, even if `-n 1` is specified, it will hang and wait until the - execution timeout. diff --git a/tutorials/katacoda/case-http-api-en/session-interaction.md b/tutorials/katacoda/case-http-api-en/session-interaction.md deleted file mode 100644 index 997311d87f0..00000000000 --- a/tutorials/katacoda/case-http-api-en/session-interaction.md +++ /dev/null @@ -1,339 +0,0 @@ - -Users create and manage Arthas sessions, which are suitable for complex -interactive processes. The access process is as follows: - -* Create a session -* Join the session (optional) -* Pull command results -* Execute a series of commands -* Interrupt command execution -* Close the session - -#### Create session - -Create session and save output into bash environment. - -`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"init_session" -} -') -echo $session_data | json_pp`{{execute T3}} - -Note: The `json_pp` tool formats the output content as pretty json. - -Response result: - -```json -{ - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "consumerId" : "5ae4e5fbab8b4e529ac404f260d4e2d1_1", - "state" : "SUCCEEDED" -} -``` - -extract session ID and consumer ID. - -The new session ID is: - -`session_id=$(echo $session_data | sed 's/.*"sessionId":"\([^"]*\)".*/\1/g') -echo $session_id`{{execute T3}} - -`b09f1353-202c-407b-af24-701b744f971e`; - -Please take a note of your session ID here, it will be entered in Terminal 4 in the following steps. - -consumer ID is: - -`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g') -echo $consumer_id`{{execute T3}} - -`5ae4e5fbab8b4e529ac404f260d4e2d1_1`. - -Please take a note of your consumer ID here, it will be entered in Terminal 4 in the following steps. - -#### Join session - -Specify the session ID to join, and the server will assign a new -consumer ID. Multiple consumers can receive the same command results of -target session. This interface is used to support multiple people -sharing the same session or refreshing the page to retrieve the session -history. - -Join session and save output into bash environment. - -`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"join_session", - "sessionId" : "'"$session_id"'" -} -') -echo $session_data | json_pp`{{execute T3}} - -Response result: - -```json -{ - "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2", - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "state" : "SUCCEEDED" -} -``` - -extract new consumer ID. - -The new consumer ID is - -`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g') -echo $consumer_id`{{execute T3}} - -`8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` . - -#### Pull command results - -The action of pulling the command result message is `pull_results`. -Please use the Http long-polling method to periodically pull the result -messages. The consumer's timeout period is 5 minutes. After the timeout, -you need to call `join_session` to allocate a new consumer. - -Each consumer is allocated a cache queue separately, and the pull order -does not affect the content received by the consumer. - - -The request parameters require session ID and consumer ID: - -`curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"pull_results", - "sessionId" : "'"$session_id"'", - "consumerId" : "'"$consumer_id"'" -} -' | json_pp`{{execute T3}} - -Use Bash scripts to regularly pull results messages: - -Please enter the sessionID from your Terminal 3 in Terminal 4, an example is here: - -`b09f1353-202c-407b-af24-701b744f971e` - -`echo -n "Enter your sessionId in T3:" -read session_id`{{execute T4}} - -Also, Please enter the consumerID, an example is here: - -`8f7f6ad7bc2d4cb5aa57a530927a95cc_2` - -`echo -n "Enter your consumerId in T3:" -read consumer_id`{{execute T4}} - -`while true; do curl -Ss -XPOST http://localhost:8563/api -d ' -{ - "action":"pull_results", - "sessionId" : "'"$session_id"'", - "consumerId" : "'"$consumer_id"'" -} -' | json_pp; sleep 2; done`{{execute T4}} - -The response content is as follows: - -```json -{ - "body" : { - "results" : [ - { - "inputStatus" : "DISABLED", - "jobId" : 0, - "type" : "input_status" - }, - { - "type" : "message", - "jobId" : 0, - "message" : "Welcome to arthas!" - }, - { - "tutorials" : "https://arthas.aliyun.com/doc/arthas-tutorials.html", - "time" : "2020-08-06 15:56:43", - "type" : "welcome", - "jobId" : 0, - "pid" : "7909", - "wiki" : "https://arthas.aliyun.com/doc", - "version" : "3.3.7" - }, - { - "inputStatus" : "ALLOW_INPUT", - "type" : "input_status", - "jobId" : 0 - } - ] - }, - "sessionId" : "b09f1353-202c-407b-af24-701b744f971e", - "consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2", - "state" : "SUCCEEDED" -} - -``` - - -#### Execute commands asynchronously - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"async_exec", - "command":"watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" ", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -Response of `async_exec`: - -```json -{ - "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a", - "state" : "SCHEDULED", - "body" : { - "jobStatus" : "READY", - "jobId" : 3, - "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" " - } -} -``` - -* `state` : The status of `SCHEDULED` means that the command has been - parsed and generated the job, but the execution has not started. -* `body.jobId` : The job id of command execution, filter the command - results output in `pull_results` according to this job ID. -* `body.jobStatus` : The job status `READY` means that execution has not started. - -Switch to the shell output of the script that continuously pulls the result message (Terminal 4): - -```json -{ - "body" : { - "results" : [ - { - "type" : "command", - "jobId" : 3, - "state" : "SCHEDULED", - "command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" " - }, - { - "inputStatus" : "ALLOW_INTERRUPT", - "jobId" : 0, - "type" : "input_status" - }, - { - "success" : true, - "jobId" : 3, - "effect" : { - "listenerId" : 3, - "cost" : 24, - "classCount" : 1, - "methodCount" : 1 - }, - "type" : "enhancer" - }, - { - "sizeLimit" : 10485760, - "expand" : 1, - "jobId" : 3, - "type" : "watch", - "cost" : 0.071499, - "ts" : 1596703453237, - "value" : [ - [ - -170365 - ], - null, - { - "stackTrace" : [ - { - "className" : "demo.MathGame", - "classLoaderName" : "app", - "methodName" : "primeFactors", - "nativeMethod" : false, - "lineNumber" : 46, - "fileName" : "MathGame.java" - }, - ... - ], - "localizedMessage" : "number is: -170365, need >= 2", - "@type" : "java.lang.IllegalArgumentException", - "message" : "number is: -170365, need >= 2" - } - ] - }, - { - "type" : "watch", - "cost" : 0.033375, - "jobId" : 3, - "ts" : 1596703454241, - "value" : [ - [ - 1 - ], - [ - 2, - 2, - 2, - 2, - 13, - 491 - ], - null - ], - "sizeLimit" : 10485760, - "expand" : 1 - } - ] - }, - "consumerId" : "8ecb9cb7c7804d5d92e258b23d5245cc_1", - "sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a", - "state" : "SUCCEEDED" -} -``` - - -The `value` of the watch command result is the value of watch-experss, -and the above command is `{params, returnObj, throwExp}`, so the value -of the watch result is an array of length 3, and each element -corresponds to the expression in the corresponding order. - -Please refer to the section "Make watch command output a map object". - -#### Interrupt command execution - -Interrupt the running foreground job of the session: - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"interrupt_job", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -```json -{ - "state" : "SUCCEEDED", - "body" : { - "jobStatus" : "TERMINATED", - "jobId" : 3 - } -} -``` - -#### Close session - -Specify the session ID to close the session. - -`curl -Ss -XPOST http://localhost:8563/api -d ''' -{ - "action":"close_session", - "sessionId" : "'"$session_id"'" -} -''' | json_pp`{{execute T3}} - -```json -{ - "state" : "SUCCEEDED" -} -``` \ No newline at end of file diff --git a/tutorials/katacoda/case-http-api-en/watch-output-map.md b/tutorials/katacoda/case-http-api-en/watch-output-map.md deleted file mode 100644 index 53e7b42e68f..00000000000 --- a/tutorials/katacoda/case-http-api-en/watch-output-map.md +++ /dev/null @@ -1,92 +0,0 @@ - -The result value of `watch` is generated by calculating the -`watch-express` ognl expression. You can change the ognl expression to -generate the desired value, please refer to -[OGNL document](https://commons.apache.org/proper/commons-ognl/language-guide.html). - -> Maps can also be created using a special syntax. -> ->#{ "foo" : "foo value", "bar" : "bar value" } -> ->This creates a Map initialized with mappings for "foo" and "bar". - -The following command generates values ​​in map format: - -```bash -watch *MathGame prime* '#{ "params" : params, "returnObj" : returnObj, "throwExp": throwExp}' -x 2 -n 5 -``` - -Execute the above command in Telnet shell/WebConsole, the output result: - -```bash -ts=2020-08-06 16:57:20; [cost=0.241735ms] result=@LinkedHashMap[ - @String[params]:@Object[][ - @Integer[1], - ], - @String[returnObj]:@ArrayList[ - @Integer[2], - @Integer[241], - @Integer[379], - ], - @String[throwExp]:null, -] -``` - -Execute the above command with Http api, pay attention to escaping the JSON double quotes: - -` -curl -Ss -XPOST http://localhost:8563/api -d @- << EOF -{ - "action":"exec", - "execTimeout": 30000, - "command":"watch *MathGame prime* '#{ \"params\" : params, \"returnObj\" : returnObj, \"throwExp\": throwExp}' -n 3 " -} -EOF`{{execute T3}} - -Http api execution result: - -```json -{ - "body": { - ... - "results": [ - ... - { - ... - "type": "watch", - "value": { - "params": [ - 1 - ], - "returnObj": [ - 2, - 5, - 17, - 23, - 23 - ] - } - }, - { - ... - "type": "watch", - "value": { - "params": [ - -98278 - ], - "throwExp": { - "@type": "java.lang.IllegalArgumentException", - "localizedMessage": "number is: -98278, need >= 2", - "message": "number is: -98278, need >= 2", - "stackTrace": [ - ... - ] - } - } - }, - ... -} -``` - -You can see that the value of the watch result becomes a map object, and -the program can read value through a key . diff --git a/tutorials/katacoda/case-http-api-en/web-ui.md b/tutorials/katacoda/case-http-api-en/web-ui.md deleted file mode 100644 index dac96fbc171..00000000000 --- a/tutorials/katacoda/case-http-api-en/web-ui.md +++ /dev/null @@ -1,23 +0,0 @@ - -![](https://arthas.aliyun.com/doc/_images/arthas-web-ui.png "arthas web ui") - -A Web UI based on Http API, visit url : -https://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/ui . - -Completed functions: - -* Create a session -* Copy and open the url to join the session, share the session with - multiple people -* Continuously pull session command result messages -* Refresh the web page or join the session to pull command messages - history -* Control input or interrupt command status - - -Pending function: - -* Improve the readability of command result messages -* Support automatic completion of input commands and command templates -* Provide command help -* Support personal profile settings diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/arthas-boot.md b/tutorials/katacoda/case-jad-mc-redefine-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/case-jad-mc-redefine.md b/tutorials/katacoda/case-jad-mc-redefine-cn/case-jad-mc-redefine.md deleted file mode 100644 index da6036af9ec..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/case-jad-mc-redefine.md +++ /dev/null @@ -1,95 +0,0 @@ -下面介绍通过`jad`/`mc`/`redefine` 命令实现动态更新代码的功能。 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -下面通过热更新代码,修改这个逻辑。 - -### jad反编译UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -jad反编译的结果保存在 `/tmp/UserController.java`文件里了。 - -再打开一个`Terminal 3`,然后用vim来编辑`/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -比如当 user id 小于1时,也正常返回,不抛出异常: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### sc查找加载UserController的ClassLoader - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -可以发现是 spring boot `LaunchedURLClassLoader@1be6f5c3` 加载的。 - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便. - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### mc - -保存好`/tmp/UserController.java`之后,使用`mc`(Memory Compiler)命令来编译,并且通过`--classLoaderClass`参数指定ClassLoader: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -也可以通过`mc -c /tmp/UserController.java -d /tmp`,使用`-c`参数指定ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -再使用`redefine`命令重新加载新编译好的`UserController.class`: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### 热修改代码结果 - -`redefine`成功之后,再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,结果是: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/finish.md b/tutorials/katacoda/case-jad-mc-redefine-cn/finish.md deleted file mode 100644 index 1336ab6c4f2..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas热更新代码。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/index.json b/tutorials/katacoda/case-jad-mc-redefine-cn/index.json deleted file mode 100644 index 829c4d8456a..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 热更新代码 案例", - "description": "Arthas 热更新代码 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "热更新代码", - "text": "case-jad-mc-redefine.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/intro.md b/tutorials/katacoda/case-jad-mc-redefine-cn/intro.md deleted file mode 100644 index 8be64797005..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示热更新代码。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-jad-mc-redefine-cn/start-demo.md b/tutorials/katacoda/case-jad-mc-redefine-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/arthas-boot.md b/tutorials/katacoda/case-jad-mc-redefine-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/case-jad-mc-redefine.md b/tutorials/katacoda/case-jad-mc-redefine-en/case-jad-mc-redefine.md deleted file mode 100644 index 80e93c96f3e..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/case-jad-mc-redefine.md +++ /dev/null @@ -1,98 +0,0 @@ -This case introduces the ability to dynamically update code via the `jad`/`mc`/`redefine` command. - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -This logic will be modified by `redefine` command below. - -### Use jad command to decompile UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -The result of jad command will be saved in the `/tmp/UserController.java` file. - - -Then open `Terminal 3`, use `vim` to edit `/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -For example, when the user id is less than 1, it also returns normally without throwing an exception: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### Use sc command to find the ClassLoader that loads the UserController - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -It can be found that it is loaded by spring boot `LaunchedURLClassLoader@1be6f5c3`. - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### mc - -After saving `/tmp/UserController.java`, compile with the `mc` (Memory Compiler) command and specify the ClassLoader with the `--classLoaderClass` option: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -You can also execute `mc -c /tmp/UserController.java -d /tmp`,using `-c` to specify ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -Then reload the newly compiled `UserController.class` with the `redefine` command: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### Check the results of the hotswap code - -After the `redefine` command is executed successfully, visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 again. - -The result is: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/finish.md b/tutorials/katacoda/case-jad-mc-redefine-en/finish.md deleted file mode 100644 index 70648d8031f..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Hotswap code. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/index.json b/tutorials/katacoda/case-jad-mc-redefine-en/index.json deleted file mode 100644 index 10aaa32ca92..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Hotswap code", - "description": "Arthas Hotswap code", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Hotswap code", - "text": "case-jad-mc-redefine.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/intro.md b/tutorials/katacoda/case-jad-mc-redefine-en/intro.md deleted file mode 100644 index 4432499ea39..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate Hotswap code. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-jad-mc-redefine-en/start-demo.md b/tutorials/katacoda/case-jad-mc-redefine-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-jad-mc-redefine-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-logger-config-problem-cn/arthas-boot.md b/tutorials/katacoda/case-logger-config-problem-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-logger-config-problem-cn/case-logger-config-problem.md b/tutorials/katacoda/case-logger-config-problem-cn/case-logger-config-problem.md deleted file mode 100644 index 8eea8f1ee2b..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/case-logger-config-problem.md +++ /dev/null @@ -1,82 +0,0 @@ - - -在这个案例里,展示排查logger冲突的方法。 - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### 确认应用使用的logger系统 - -以`UserController`为例,它使用的是slf4j api,但实际使用到的logger系统是logback。 - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 获取logback实际加载的配置文件 - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### 使用classloader命令查找可能存在的logger配置文件 - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -可以知道加载的配置的具体来源。 - -可以尝试加载容易冲突的文件: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/case-logger-config-problem-cn/finish.md b/tutorials/katacoda/case-logger-config-problem-cn/finish.md deleted file mode 100644 index f95517cfca2..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas排查logger冲突问题。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-logger-config-problem-cn/index.json b/tutorials/katacoda/case-logger-config-problem-cn/index.json deleted file mode 100644 index 04099a90d9d..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 排查logger冲突问题 案例", - "description": "Arthas 排查logger冲突问题 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "排查logger冲突问题", - "text": "case-logger-config-problem.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-logger-config-problem-cn/intro.md b/tutorials/katacoda/case-logger-config-problem-cn/intro.md deleted file mode 100644 index 2b4c38503fe..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示排查logger冲突问题。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-logger-config-problem-cn/start-demo.md b/tutorials/katacoda/case-logger-config-problem-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-logger-config-problem-en/arthas-boot.md b/tutorials/katacoda/case-logger-config-problem-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-logger-config-problem-en/case-logger-config-problem.md b/tutorials/katacoda/case-logger-config-problem-en/case-logger-config-problem.md deleted file mode 100644 index 49a6d508337..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/case-logger-config-problem.md +++ /dev/null @@ -1,83 +0,0 @@ - - - -In this case, show how to troubleshoot logger conflicts. - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -Please write down your classLoaderHash here since it's dynamic. In the case here, it's `1be6f5c3`. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### View the logger system used by the app - -Take `UserController` as an example, it uses slf4j api, but the actual logger system used is logback. - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Find the configuration file actually loaded by the logback - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### Use the classloader command to find possible logger configuration files - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -You can know the specific source of the loaded configuration. - -You can try to load files that are prone to conflict: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/case-logger-config-problem-en/finish.md b/tutorials/katacoda/case-logger-config-problem-en/finish.md deleted file mode 100644 index f70384523ac..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Troubleshoot logger conflicts. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-logger-config-problem-en/index.json b/tutorials/katacoda/case-logger-config-problem-en/index.json deleted file mode 100644 index 73667777833..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Troubleshoot logger conflicts", - "description": "Arthas Troubleshoot logger conflicts", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Troubleshoot logger conflicts", - "text": "case-logger-config-problem.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-logger-config-problem-en/intro.md b/tutorials/katacoda/case-logger-config-problem-en/intro.md deleted file mode 100644 index 15725631913..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate Troubleshoot logger conflicts. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-logger-config-problem-en/start-demo.md b/tutorials/katacoda/case-logger-config-problem-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-logger-config-problem-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-cn/finish.md b/tutorials/katacoda/case-ognl-practise-cn/finish.md deleted file mode 100644 index 1eceecb80d4..00000000000 --- a/tutorials/katacoda/case-ognl-practise-cn/finish.md +++ /dev/null @@ -1,20 +0,0 @@ -我们演示如何调试Arthas的`ognl`表达式。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - - -更多参考: - -* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) -* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - - ---- - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) - diff --git a/tutorials/katacoda/case-ognl-practise-cn/index.json b/tutorials/katacoda/case-ognl-practise-cn/index.json deleted file mode 100644 index f2e8626bab6..00000000000 --- a/tutorials/katacoda/case-ognl-practise-cn/index.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "title": "调试 Arthas 的 ognl 表达式", - "description": "调试 Arthas 的 ognl 表达式", - "details": { - "steps": [ - { - "text": "step1.md", - "code": "setup.sh" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "files": [ - ], - "environment": { - "hideHiddenFiles": true, - "uilayout": "editor-terminal", - "uisettings": "java", - "uieditorpath": "/root/example/ognl-demo" - }, - "backend": { - "imageid": "openjdk:15" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-cn/intro.md b/tutorials/katacoda/case-ognl-practise-cn/intro.md deleted file mode 100644 index bb91575d0dc..00000000000 --- a/tutorials/katacoda/case-ognl-practise-cn/intro.md +++ /dev/null @@ -1,9 +0,0 @@ -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - - -本教程会以一个简单的应用为例,演示如果调试`ognl`表达式。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-cn/setup.sh b/tutorials/katacoda/case-ognl-practise-cn/setup.sh deleted file mode 100644 index 043faca1d59..00000000000 --- a/tutorials/katacoda/case-ognl-practise-cn/setup.sh +++ /dev/null @@ -1 +0,0 @@ -mkdir -p example; cd example/; git clone https://github.com/hengyunabc/ognl-demo.git ; cd ognl-demo \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-cn/step1.md b/tutorials/katacoda/case-ognl-practise-cn/step1.md deleted file mode 100644 index c9267738e12..00000000000 --- a/tutorials/katacoda/case-ognl-practise-cn/step1.md +++ /dev/null @@ -1,84 +0,0 @@ - -演示Arthas里`watch`命令中`ognl`表达式的工作流程。用户可以自己修改`Demo.java`里的表达式,再执行验证。 - -项目地址: https://github.com/hengyunabc/ognl-demo -# 打开Demo.java文件 - -`src/main/java/com/example/ognl/Demo.java`{{open}} - -# 编译运行代码 - -`mvn compile exec:java`{{execute}} - - -输出结果包含`ognl`表达式输出结果: - -```java -AtEnter, conditionExpress: params[0] > 1, conditionResult: true -@ArrayList[ - @TestService[ - ], - @Object[][ - @Integer[1000], - @String[hello], - @Student[ - id=@Long[1], - name=@String[tom], - ], - ], -] -``` - - -以上输出结果,对应在代码里的表达式是: - -```java -String watchExpress = "{target, params, returnObj, #cost}"; -String conditionExpress = "params[0] > 1 && #cost > 0.1"; -``` - -类似在arthas里执行下面的`watch`命令: - -```bash -watch com.example.ognl.TestService test "{target, params, returnObj, #cost}" "params[0] > 1 && #cost > 0.1" -x 3 -``` - -# 查看函数抛出异常时的表达式结果 - -`mvn compile exec:java -DexceptionCase=true`{{execute}} - - -The output: - -```java -AtExceptionExit, conditionExpress: params[0] > 1, conditionResult: true -@ArrayList[ - @TestService[ - ], - @Object[][ - @Integer[1000], - @String[hello], - @Student[com.example.ognl.Student@6e23bcdd], - ], - java.lang.IllegalArgumentException: error - at com.example.ognl.TestService.test(TestService.java:12) - at com.example.ognl.Demo.test(Demo.java:43) - at com.example.ognl.Demo.main(Demo.java:20) - at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:254) - at java.base/java.lang.Thread.run(Thread.java:832) -, -] -``` - -代码里的表达式: - -```java -String watchExpress = "{target, params, throwExp}"; -String conditionExpress = "params[0] > 1"; -``` - -类似在arthas里执行下面的`watch`命令: - -```bash -watch com.example.ognl.TestService test "{target, params, throwExp}" "params[0] > 1" -e -x 2 -``` diff --git a/tutorials/katacoda/case-ognl-practise-en/finish.md b/tutorials/katacoda/case-ognl-practise-en/finish.md deleted file mode 100644 index b9f86b13c10..00000000000 --- a/tutorials/katacoda/case-ognl-practise-en/finish.md +++ /dev/null @@ -1,12 +0,0 @@ -The tutorial demonstrates how to debug `ognl` express in Arthas. If you have more tips or questions, please feel free to tell or ask in Issue. - -* For special usage of OGNL, please refer to: https://github.com/alibaba/arthas/issues/71 -* Official Guide to OGNL Expressions: https://commons.apache.org/proper/commons-ognl/language-guide.html - ---- - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) - diff --git a/tutorials/katacoda/case-ognl-practise-en/index.json b/tutorials/katacoda/case-ognl-practise-en/index.json deleted file mode 100644 index 04402c2bf02..00000000000 --- a/tutorials/katacoda/case-ognl-practise-en/index.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "title": "Debug ognl express in Arthas", - "description": "Debug ognl express in Arthas", - "details": { - "steps": [ - { - "text": "step1.md", - "code": "setup.sh" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "files": [ - ], - "environment": { - "hideHiddenFiles": true, - "uilayout": "editor-terminal", - "uisettings": "java", - "uieditorpath": "/root/example/ognl-demo" - }, - "backend": { - "imageid": "openjdk:15" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-en/intro.md b/tutorials/katacoda/case-ognl-practise-en/intro.md deleted file mode 100644 index 2415e33ae4d..00000000000 --- a/tutorials/katacoda/case-ognl-practise-en/intro.md +++ /dev/null @@ -1,8 +0,0 @@ -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -This tutorial show how to debug `ognl` express in Arths. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-en/setup.sh b/tutorials/katacoda/case-ognl-practise-en/setup.sh deleted file mode 100644 index 043faca1d59..00000000000 --- a/tutorials/katacoda/case-ognl-practise-en/setup.sh +++ /dev/null @@ -1 +0,0 @@ -mkdir -p example; cd example/; git clone https://github.com/hengyunabc/ognl-demo.git ; cd ognl-demo \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-practise-en/step1.md b/tutorials/katacoda/case-ognl-practise-en/step1.md deleted file mode 100644 index 6cea0e04fcf..00000000000 --- a/tutorials/katacoda/case-ognl-practise-en/step1.md +++ /dev/null @@ -1,85 +0,0 @@ - -Demonstrate the workflow of the `ognl` expression in the `watch` command in Arthas. You can modify the expressions in `Demo.java`, and compile and run the code. - -Project: https://github.com/hengyunabc/ognl-demo - -# Open the Demo.java file - -`src/main/java/com/example/ognl/Demo.java`{{open}} - -# Compile and run the code - -`mvn compile exec:java`{{execute}} - - -输出结果包含`ognl`表达式输出结果: - -```java -AtEnter, conditionExpress: params[0] > 1, conditionResult: true -@ArrayList[ - @TestService[ - ], - @Object[][ - @Integer[1000], - @String[hello], - @Student[ - id=@Long[1], - name=@String[tom], - ], - ], -] -``` - - -Expression in the code: - -```java -String watchExpress = "{target, params, returnObj, #cost}"; -String conditionExpress = "params[0] > 1 && #cost > 0.1"; -``` - -The result is similar to the following expression: - -```bash -watch com.example.ognl.TestService test "{target, params, returnObj, #cost}" "params[0] > 1 && #cost > 0.1" -x 3 -``` - -# View the expression result when the method throws an exception - -`mvn compile exec:java -DexceptionCase=true`{{execute}} - - -The output: - -```java -AtExceptionExit, conditionExpress: params[0] > 1, conditionResult: true -@ArrayList[ - @TestService[ - ], - @Object[][ - @Integer[1000], - @String[hello], - @Student[com.example.ognl.Student@6e23bcdd], - ], - java.lang.IllegalArgumentException: error - at com.example.ognl.TestService.test(TestService.java:12) - at com.example.ognl.Demo.test(Demo.java:43) - at com.example.ognl.Demo.main(Demo.java:20) - at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:254) - at java.base/java.lang.Thread.run(Thread.java:832) -, -] -``` - -Expression in the code: - -```java -String watchExpress = "{target, params, throwExp}"; -String conditionExpress = "params[0] > 1"; -``` - -The result is similar to the following expression: - -```bash -watch com.example.ognl.TestService test "{target, params, throwExp}" "params[0] > 1" -e -x 2 -``` diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/arthas-boot.md b/tutorials/katacoda/case-ognl-update-logger-level-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/case-ognl-update-logger-level.md b/tutorials/katacoda/case-ognl-update-logger-level-cn/case-ognl-update-logger-level.md deleted file mode 100644 index d367a3bd4a1..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/case-ognl-update-logger-level.md +++ /dev/null @@ -1,87 +0,0 @@ - - -在这个案例里,动态修改应用的Logger Level。 - - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### 用ognl获取logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -可以知道`UserController@logger`实际使用的是logback。可以看到`level=null`,则说明实际最终的level是从`root` logger里来的。 - -### 单独设置UserController的logger level - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -再次获取`UserController@logger`,可以发现已经是`DEBUG`了: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 修改logback的全局logger level - -通过获取`root` logger,可以修改全局的logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/finish.md b/tutorials/katacoda/case-ognl-update-logger-level-cn/finish.md deleted file mode 100644 index 60262fd4904..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas动态更新应用Logger Level。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/index.json b/tutorials/katacoda/case-ognl-update-logger-level-cn/index.json deleted file mode 100644 index 09c5464587d..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 动态更新应用Logger Level 案例", - "description": "Arthas 动态更新应用Logger Level 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "动态更新应用Logger Level", - "text": "case-ognl-update-logger-level.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/intro.md b/tutorials/katacoda/case-ognl-update-logger-level-cn/intro.md deleted file mode 100644 index b468484abdc..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示动态更新应用Logger Level。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-ognl-update-logger-level-cn/start-demo.md b/tutorials/katacoda/case-ognl-update-logger-level-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/arthas-boot.md b/tutorials/katacoda/case-ognl-update-logger-level-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/case-ognl-update-logger-level.md b/tutorials/katacoda/case-ognl-update-logger-level-en/case-ognl-update-logger-level.md deleted file mode 100644 index 4d2c84f0b54..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/case-ognl-update-logger-level.md +++ /dev/null @@ -1,85 +0,0 @@ - -In this case, show how to dynamically modify the Logger Level. - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -Please write down your classLoaderHash here since it's dynamic. In the case here, it's `1be6f5c3`. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### Use ognl command to get the logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -The user can know that `UserController@logger` actually uses logback. Because `level=null`, the actual final level is from the `root` logger. - -### Change the logger level of UserController - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -Get `UserController@logger` again, the user can see that it is already `DEBUG`: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Change the global logger level of the logback - -By getting the `root` logger, the user can modify the global logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/finish.md b/tutorials/katacoda/case-ognl-update-logger-level-en/finish.md deleted file mode 100644 index 34d3bcce4e1..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Change Logger Level. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/index.json b/tutorials/katacoda/case-ognl-update-logger-level-en/index.json deleted file mode 100644 index d9c13e5ed6d..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Change Logger Level", - "description": "Arthas Change Logger Level", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Change Logger Level", - "text": "case-ognl-update-logger-level.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/intro.md b/tutorials/katacoda/case-ognl-update-logger-level-en/intro.md deleted file mode 100644 index 405a469cb37..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate Change Logger Level. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-ognl-update-logger-level-en/start-demo.md b/tutorials/katacoda/case-ognl-update-logger-level-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-ognl-update-logger-level-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-save-log-cn/arthas-boot.md b/tutorials/katacoda/case-save-log-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-save-log-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-save-log-cn/arthas-demo.md b/tutorials/katacoda/case-save-log-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-save-log-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-save-log-cn/finish.md b/tutorials/katacoda/case-save-log-cn/finish.md deleted file mode 100644 index 27c5630be66..00000000000 --- a/tutorials/katacoda/case-save-log-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas执行结果存日志。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-save-log-cn/index.json b/tutorials/katacoda/case-save-log-cn/index.json deleted file mode 100644 index 966ef323e61..00000000000 --- a/tutorials/katacoda/case-save-log-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas 执行结果存日志 案例", - "description": "Arthas 执行结果存日志 案例", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "执行结果存日志", - "text": "save-log.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-save-log-cn/intro.md b/tutorials/katacoda/case-save-log-cn/intro.md deleted file mode 100644 index 7cda997e8b5..00000000000 --- a/tutorials/katacoda/case-save-log-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示Arthas执行结果存日志。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-save-log-cn/save-log.md b/tutorials/katacoda/case-save-log-cn/save-log.md deleted file mode 100644 index f2bb63ddad8..00000000000 --- a/tutorials/katacoda/case-save-log-cn/save-log.md +++ /dev/null @@ -1,32 +0,0 @@ - - -将命令的结果完整保存在日志文件中,便于后续进行分析 - -- 默认情况下,该功能是关闭的,如果需要开启,请执行以下命令: - -`options save-result true`{{execute T2}} - -```bash -$ options save-result true - NAME BEFORE-VALUE AFTER-VALUE ----------------------------------------- - save-result false true -Affect(row-cnt:1) cost in 3 ms. -``` - -看到上面的输出,即表示成功开启该功能; - -- 日志文件路径 - -结果会异步保存在:`{user.home}/logs/arthas-cache/result.log`,请定期进行清理,以免占据磁盘空间 - -## 使用Arthas的异步后台任务将结果存日志文件 - -```bash -$ trace Test t >> & -job id : 2 -cache location : /Users/admin/logs/arthas-cache/28198/2 -``` - -* 参考: https://arthas.aliyun.com/doc/async.html - diff --git a/tutorials/katacoda/case-save-log-en/arthas-boot.md b/tutorials/katacoda/case-save-log-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-save-log-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-save-log-en/arthas-demo.md b/tutorials/katacoda/case-save-log-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/case-save-log-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/case-save-log-en/finish.md b/tutorials/katacoda/case-save-log-en/finish.md deleted file mode 100644 index 2bf0d2b5ac0..00000000000 --- a/tutorials/katacoda/case-save-log-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Log the output. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-save-log-en/index.json b/tutorials/katacoda/case-save-log-en/index.json deleted file mode 100644 index 227325fa4c9..00000000000 --- a/tutorials/katacoda/case-save-log-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas Log the output", - "description": "Arthas Log the output", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Log the output", - "text": "save-log.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-save-log-en/intro.md b/tutorials/katacoda/case-save-log-en/intro.md deleted file mode 100644 index 41c57507f7a..00000000000 --- a/tutorials/katacoda/case-save-log-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the use case of Log the output. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-save-log-en/save-log.md b/tutorials/katacoda/case-save-log-en/save-log.md deleted file mode 100644 index 444798bc936..00000000000 --- a/tutorials/katacoda/case-save-log-en/save-log.md +++ /dev/null @@ -1,31 +0,0 @@ - - -Log command outputs for later analysis - -By default, this behavior is turned off. To enable it, execute the command below: - -`options save-result true`{{execute T2}} - -```bash -$ options save-result true - NAME BEFORE-VALUE AFTER-VALUE ----------------------------------------- -save-result false true -Affect(row-cnt:1) cost in 3 ms. -``` - -If the message above is output on the console, then this behavior is enabled successfully. - -* Log file path - -The command execution result will be save in `{user.home}/logs/arthas-cache/result.log` Pls. clean it up regularly to save disk space. - -## Use asynchronous job to log - -```bash -$ trace Test t >> & -job id : 2 -cache location : /Users/admin/logs/arthas-cache/28198/2 -``` - -* Reference: https://arthas.aliyun.com/doc/async.html diff --git a/tutorials/katacoda/case-thread-cn/arthas-boot.md b/tutorials/katacoda/case-thread-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-thread-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-thread-cn/arthas-demo.md b/tutorials/katacoda/case-thread-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-thread-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-thread-cn/case-thread.md b/tutorials/katacoda/case-thread-cn/case-thread.md deleted file mode 100644 index abc6074d7f6..00000000000 --- a/tutorials/katacoda/case-thread-cn/case-thread.md +++ /dev/null @@ -1,30 +0,0 @@ - -### 查看所有线程信息 - -`thread`{{execute T2}} - - -### 查看具体线程的栈 - -查看线程ID 16的栈: - -`thread 16`{{execute T2}} - -### 查看CPU使用率top n线程的栈 - -参数`n`用来指定最忙的前N个线程并打印堆栈 - -`thread -n 3`{{execute T2}} - -参数`i`用来指定cpu占比统计的采样间隔,单位为毫秒 - -查看5秒内的CPU使用率top n线程栈 - -`thread -n 3 -i 5000`{{execute T2}} - - -### 查找线程是否有阻塞 - -参数`b`用来指定找出当前阻塞其他线程的线程 - -`thread -b`{{execute T2}} diff --git a/tutorials/katacoda/case-thread-cn/finish.md b/tutorials/katacoda/case-thread-cn/finish.md deleted file mode 100644 index f697da2cf1b..00000000000 --- a/tutorials/katacoda/case-thread-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas查找Top N线程。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-thread-cn/index.json b/tutorials/katacoda/case-thread-cn/index.json deleted file mode 100644 index 045378ca5a9..00000000000 --- a/tutorials/katacoda/case-thread-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas 查找Top N线程 案例", - "description": "Arthas 查找Top N线程 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "查找Top N线程", - "text": "case-thread.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-thread-cn/intro.md b/tutorials/katacoda/case-thread-cn/intro.md deleted file mode 100644 index 90e182246de..00000000000 --- a/tutorials/katacoda/case-thread-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示查找Top N线程。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-thread-en/arthas-boot.md b/tutorials/katacoda/case-thread-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-thread-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-thread-en/arthas-demo.md b/tutorials/katacoda/case-thread-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/case-thread-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/case-thread-en/case-thread.md b/tutorials/katacoda/case-thread-en/case-thread.md deleted file mode 100644 index 130c06baf33..00000000000 --- a/tutorials/katacoda/case-thread-en/case-thread.md +++ /dev/null @@ -1,29 +0,0 @@ - -### View all thread information - -`thread`{{execute T2}} - - -### View the stack of specific threads - -View the stack of thread ID 16: - -`thread 16`{{execute T2}} - -### View the stack of CPU usage TOP N threads - -`n` is used to specify the top number of busiest threads with stack traces printed: - -`thread -n 3`{{execute T2}} - -`i` is used to specify the interval to collect data to compute CPU ratios (ms) - -View the CPU usage TOP N thread stack in 5 seconds - -`thread -n 3 -i 5000`{{execute T2}} - -### Find if the thread is blocked - -`b` is used to specify to locate the thread blocking the others - -`thread -b`{{execute T2}} diff --git a/tutorials/katacoda/case-thread-en/finish.md b/tutorials/katacoda/case-thread-en/finish.md deleted file mode 100644 index 3312c82de69..00000000000 --- a/tutorials/katacoda/case-thread-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Find CPU usage Top N threads. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that, your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-thread-en/index.json b/tutorials/katacoda/case-thread-en/index.json deleted file mode 100644 index 2b497bf76e5..00000000000 --- a/tutorials/katacoda/case-thread-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas Find CPU usage Top N threads", - "description": "Arthas Find CPU usage Top N threads", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Find CPU usage Top N threads", - "text": "case-thread.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-thread-en/intro.md b/tutorials/katacoda/case-thread-en/intro.md deleted file mode 100644 index 54429ebddcd..00000000000 --- a/tutorials/katacoda/case-thread-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the use case of Find CPU usage Top N threads. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-watch-method-exception-cn/arthas-boot.md b/tutorials/katacoda/case-watch-method-exception-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-watch-method-exception-cn/case-watch-method-exception.md b/tutorials/katacoda/case-watch-method-exception-cn/case-watch-method-exception.md deleted file mode 100644 index 0aac8586377..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/case-watch-method-exception.md +++ /dev/null @@ -1,118 +0,0 @@ - - -### 现象 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -但请求的具体参数,异常栈是什么呢? - -### 查看UserController的 参数/异常 - -在Arthas里执行: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}'`{{execute T2}} - - -1. 第一个参数是类名,支持通配 -2. 第二个参数是函数名,支持通配 - - -访问 `curl http://localhost/user/0`{{execute T3}} ,`watch`命令会打印调用的参数和异常 - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 53 ms. -ts=2019-02-15 01:35:25; [cost=0.996655ms] result=@ArrayList[ - @Object[][isEmpty=false;size=1], - @IllegalArgumentException[java.lang.IllegalArgumentException: id < 1], -] -``` - -可以看到实际抛出的异常是`IllegalArgumentException`。 - -可以输入 `Q`{{execute T2}} 或者 `Ctrl+C` 退出watch命令。 - -如果想把获取到的结果展开,可以用`-x`参数: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2`{{execute T2}} - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 2) cost in 190 ms, listenerId: 1 -ts=2020-08-13 05:22:45; [cost=4.805432ms] result=@ArrayList[ - @Object[][ - @Integer[0], - ], - java.lang.IllegalArgumentException: id < 1 - at com.example.demo.arthas.user.UserController.findUserById(UserController.java:19) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - ... -, -] -``` - -### 返回值表达式 - -在上面的例子里,第三个参数是`返回值表达式`,它实际上是一个`ognl`表达式,它支持一些内置对象: - -* loader -* clazz -* method -* target -* params -* returnObj -* throwExp -* isBefore -* isThrow -* isReturn - -你可以利用这些内置对象来组成不同的表达式。比如返回一个数组: - -`watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'`{{execute T2}} - - -更多参考: https://arthas.aliyun.com/doc/advice-class.html - - -### 条件表达式 - -`watch`命令支持在第4个参数里写条件表达式,比如: - -`watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'`{{execute T2}} - -当访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 时,`watch`命令没有输出 - -当访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/101 时,`watch`会打印出结果。 - -```bash -$ watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 47 ms. -ts=2019-02-13 19:42:12; [cost=0.821443ms] result=@User[ - id=@Integer[101], - name=@String[name101], -] -``` - -### 当异常时捕获 - -`watch`命令支持`-e`选项,表示只捕获抛出异常时的请求: - -`watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e`{{execute T2}} - - -### 按照耗时进行过滤 - -watch命令支持按请求耗时进行过滤,比如: - -`watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/case-watch-method-exception-cn/finish.md b/tutorials/katacoda/case-watch-method-exception-cn/finish.md deleted file mode 100644 index 5afc51a712c..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas排查函数调用异常。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-watch-method-exception-cn/index.json b/tutorials/katacoda/case-watch-method-exception-cn/index.json deleted file mode 100644 index a03dde8e494..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas 排查函数调用异常 案例", - "description": "Arthas 排查函数调用异常 案例", - "difficulty": "高级使用者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "排查函数调用异常", - "text": "case-watch-method-exception.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-watch-method-exception-cn/intro.md b/tutorials/katacoda/case-watch-method-exception-cn/intro.md deleted file mode 100644 index 4a7b119b027..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示排查函数调用异常。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-watch-method-exception-cn/start-demo.md b/tutorials/katacoda/case-watch-method-exception-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-watch-method-exception-en/arthas-boot.md b/tutorials/katacoda/case-watch-method-exception-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-watch-method-exception-en/case-watch-method-exception.md b/tutorials/katacoda/case-watch-method-exception-en/case-watch-method-exception.md deleted file mode 100644 index 5c259090282..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/case-watch-method-exception.md +++ /dev/null @@ -1,116 +0,0 @@ - - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -But what are the specific parameters of the request, what is the exception stack? - -### View the parameters/exception of UserController - -Execute in Arthas: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}'`{{execute T2}} - - -1. The first argument is the class name, which supports wildcards. -2. The second argument is the function name, which supports wildcards. - -Visit `curl http://localhost/user/0`{{execute T3}} , the `watch` command will print the parameters and exception - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 53 ms. -ts=2019-02-15 01:35:25; [cost=0.996655ms] result=@ArrayList[ - @Object[][isEmpty=false;size=1], - @IllegalArgumentException[java.lang.IllegalArgumentException: id < 1], -] -``` - - -The user can see that the actual thrown exception is `IllegalArgumentException`. - -The user can exit the watch command by typing `Q`{{execute T2}} or `Ctrl+C`. - -If the user want to expand the result, can use the `-x` option: - -`watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2`{{execute T2}} - -```bash -$ watch com.example.demo.arthas.user.UserController * '{params, throwExp}' -x 2 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 2) cost in 190 ms, listenerId: 1 -ts=2020-08-13 05:22:45; [cost=4.805432ms] result=@ArrayList[ - @Object[][ - @Integer[0], - ], - java.lang.IllegalArgumentException: id < 1 - at com.example.demo.arthas.user.UserController.findUserById(UserController.java:19) - at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) - at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - ... -, -] -``` - -### The return value expression - -In the above example, the third argument is the `return value expression`, which is actually an `ognl` expression that supports some built-in objects: - -* loader -* clazz -* method -* target -* params -* returnObj -* throwExp -* isBefore -* isThrow -* isReturn - -You can use these built-in objects in the expressions. For example, return an array: - -`watch com.example.demo.arthas.user.UserController * '{params[0], target, returnObj}'`{{execute T2}} - - -More references: https://arthas.aliyun.com/doc/en/advice-class.html - - -### The conditional expression - -The `watch` command supports conditional expressions in the fourth argument, such as: - -`watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100'`{{execute T2}} - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/1 , the `watch` command print nothing. - -When visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/101 , the `watch` command will print: - -```bash -$ watch com.example.demo.arthas.user.UserController * returnObj 'params[0] > 100' -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:2) cost in 47 ms. -ts=2019-02-13 19:42:12; [cost=0.821443ms] result=@User[ - id=@Integer[101], - name=@String[name101], -] -``` - -### Capture when an exception occurs - -The `watch` command supports the `-e` option, which means that only requests that throw an exception are caught: - -`watch com.example.demo.arthas.user.UserController * "{params[0],throwExp}" -e`{{execute T2}} - - -### Filter by cost - -The watch command supports filtering by cost, such as: - -`watch com.example.demo.arthas.user.UserController * '{params, returnObj}' '#cost>200'`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/case-watch-method-exception-en/finish.md b/tutorials/katacoda/case-watch-method-exception-en/finish.md deleted file mode 100644 index b0a1d4636b5..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to Troubleshooting method invoke exception. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-watch-method-exception-en/index.json b/tutorials/katacoda/case-watch-method-exception-en/index.json deleted file mode 100644 index 3d4824dbe49..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas Troubleshooting method invoke exception", - "description": "Arthas Troubleshooting method invoke exception", - "difficulty": "expert", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Troubleshooting method invoke exception", - "text": "case-watch-method-exception.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-watch-method-exception-en/intro.md b/tutorials/katacoda/case-watch-method-exception-en/intro.md deleted file mode 100644 index c0ee688c30d..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the use case of Troubleshooting method invoke exception. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-watch-method-exception-en/start-demo.md b/tutorials/katacoda/case-watch-method-exception-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/case-watch-method-exception-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/case-web-console-cn/arthas-boot.md b/tutorials/katacoda/case-web-console-cn/arthas-boot.md deleted file mode 100644 index bd42b144e6d..00000000000 --- a/tutorials/katacoda/case-web-console-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-web-console-cn/arthas-demo.md b/tutorials/katacoda/case-web-console-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/case-web-console-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/case-web-console-cn/finish.md b/tutorials/katacoda/case-web-console-cn/finish.md deleted file mode 100644 index 262648069a7..00000000000 --- a/tutorials/katacoda/case-web-console-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas Web Console。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/case-web-console-cn/index.json b/tutorials/katacoda/case-web-console-cn/index.json deleted file mode 100644 index 9b689e30fc9..00000000000 --- a/tutorials/katacoda/case-web-console-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas Web Console 案例", - "description": "Arthas Web Console 案例", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Web Console", - "text": "web-console.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-web-console-cn/intro.md b/tutorials/katacoda/case-web-console-cn/intro.md deleted file mode 100644 index 9469e89e476..00000000000 --- a/tutorials/katacoda/case-web-console-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示Web Console。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/case-web-console-cn/web-console.md b/tutorials/katacoda/case-web-console-cn/web-console.md deleted file mode 100644 index 43e0b6656da..00000000000 --- a/tutorials/katacoda/case-web-console-cn/web-console.md +++ /dev/null @@ -1,19 +0,0 @@ - - -Arthas支持通过Web Socket来连接。 - - -## 教程里的Web Console - - -http://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/?ip=[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com&port=80 - -> 注意:教程里访问的是80端口,因为做了端口转发。在本地体验时,需要访问8563端口。 - -## 本地体验 - -当在本地启动时,可以访问 http://127.0.0.1:8563/ ,通过浏览器来使用Arthas。 - -![Arthas WebConsole](/arthas/scenarios/common-resources/assets/web-console.png) - -推荐通过“快速入门”来体验: https://arthas.aliyun.com/doc/quick-start.html \ No newline at end of file diff --git a/tutorials/katacoda/case-web-console-en/arthas-boot.md b/tutorials/katacoda/case-web-console-en/arthas-boot.md deleted file mode 100644 index 1726fe72727..00000000000 --- a/tutorials/katacoda/case-web-console-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/case-web-console-en/arthas-demo.md b/tutorials/katacoda/case-web-console-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/case-web-console-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/case-web-console-en/finish.md b/tutorials/katacoda/case-web-console-en/finish.md deleted file mode 100644 index 1a9cc8483a4..00000000000 --- a/tutorials/katacoda/case-web-console-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `Web console`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/case-web-console-en/index.json b/tutorials/katacoda/case-web-console-en/index.json deleted file mode 100644 index b19120be978..00000000000 --- a/tutorials/katacoda/case-web-console-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas Web Console", - "description": "Arthas Web Console", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Web Console", - "text": "web-console.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/case-web-console-en/intro.md b/tutorials/katacoda/case-web-console-en/intro.md deleted file mode 100644 index d73d2abbc18..00000000000 --- a/tutorials/katacoda/case-web-console-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the use case of Web Console. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/case-web-console-en/web-console.md b/tutorials/katacoda/case-web-console-en/web-console.md deleted file mode 100644 index c14e90f1e3c..00000000000 --- a/tutorials/katacoda/case-web-console-en/web-console.md +++ /dev/null @@ -1,20 +0,0 @@ - - -Arthas supports connections via a Web Socket. - - -## The Web Console in the tutorial - -http://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/?ip=[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com&port=80 - -> Note: The 80 port is accessed in the tutorial because port forwarding. In the local, you need to access port 8563. - -## Local - - -When launching locally, you can access Arthas through a browser by visiting http://127.0.0.1:8563/. - -![Arthas WebConsole](/arthas/scenarios/common-resources/assets/web-console.png) - - -It is recommended to experience it through "Quick Start": https://arthas.aliyun.com/doc/en/quick-start.html \ No newline at end of file diff --git a/tutorials/katacoda/command-cat-cn/arthas-boot.md b/tutorials/katacoda/command-cat-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-cat-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-cat-cn/arthas-demo.md b/tutorials/katacoda/command-cat-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-cat-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-cat-cn/cat.md b/tutorials/katacoda/command-cat-cn/cat.md deleted file mode 100644 index 72c5ed02af6..00000000000 --- a/tutorials/katacoda/command-cat-cn/cat.md +++ /dev/null @@ -1,10 +0,0 @@ - -首先向`/tmp/a.txt`文件中写入`hello, world`: - -`echo "hello, world" > /tmp/a.txt`{{execute T2}} - -通过`cat`命令可以打印文件内容,和linux里的cat命令类似。 - -`cat /tmp/a.txt`{{execute T2}} - -你可以看到`hello, world`被打印了出来。 diff --git a/tutorials/katacoda/command-cat-cn/finish.md b/tutorials/katacoda/command-cat-cn/finish.md deleted file mode 100644 index 77785f39044..00000000000 --- a/tutorials/katacoda/command-cat-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas cat的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-cat-cn/index.json b/tutorials/katacoda/command-cat-cn/index.json deleted file mode 100644 index 871d56b2472..00000000000 --- a/tutorials/katacoda/command-cat-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas cat命令教程", - "description": "Arthas cat命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "cat 命令", - "text": "cat.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-cat-cn/intro.md b/tutorials/katacoda/command-cat-cn/intro.md deleted file mode 100644 index bb9cf22f4eb..00000000000 --- a/tutorials/katacoda/command-cat-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示cat命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-cat-en/arthas-boot.md b/tutorials/katacoda/command-cat-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-cat-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-cat-en/arthas-demo.md b/tutorials/katacoda/command-cat-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-cat-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-cat-en/cat.md b/tutorials/katacoda/command-cat-en/cat.md deleted file mode 100644 index 62ba68afdb2..00000000000 --- a/tutorials/katacoda/command-cat-en/cat.md +++ /dev/null @@ -1,10 +0,0 @@ - -First write `hello, world` into `/tmp/a.txt`: - -`echo "hello, world" > /tmp/a.txt`{{execute T2}} - -Use `cat` to concatenate and print files, which is pretty much alike in linux. - -`cat /tmp/a.txt`{{execute T2}} - -Then you can see that `hello, world` has been printed out. diff --git a/tutorials/katacoda/command-cat-en/finish.md b/tutorials/katacoda/command-cat-en/finish.md deleted file mode 100644 index 056b6c31cf7..00000000000 --- a/tutorials/katacoda/command-cat-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `cat`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-cat-en/index.json b/tutorials/katacoda/command-cat-en/index.json deleted file mode 100644 index 5772d575e58..00000000000 --- a/tutorials/katacoda/command-cat-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas cat", - "description": "Arthas cat", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "cat command", - "text": "cat.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-cat-en/intro.md b/tutorials/katacoda/command-cat-en/intro.md deleted file mode 100644 index b68f7b9e2bd..00000000000 --- a/tutorials/katacoda/command-cat-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of cat. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-classloader-cn/arthas-boot.md b/tutorials/katacoda/command-classloader-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-classloader-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-classloader-cn/classloader.md b/tutorials/katacoda/command-classloader-cn/classloader.md deleted file mode 100644 index 49933dcf74c..00000000000 --- a/tutorials/katacoda/command-classloader-cn/classloader.md +++ /dev/null @@ -1,184 +0,0 @@ - -> 查看classloader的继承树,urls,类加载信息 - -`classloader` 命令将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。 - -可以让指定的classloader去getResources,打印出所有查找到的resources的url。对于`ResourceNotFoundException`比较有用。 - - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|[l]|按类加载实例进行统计| -|[t]|打印所有ClassLoader的继承树| -|[a]|列出所有ClassLoader加载的类,请谨慎使用| -|`[c:]`|ClassLoader的hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|`[c: r:]`|用ClassLoader去查找resource| -|`[c: load:]`|用ClassLoader去加载指定的类| - -### 使用参考 - -先访问一个jsp网页,触发jsp的加载: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### 列出所有ClassLoader - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* TomcatEmbeddedWebappClassLoader 加载的class数量是0,所以在spring boot embedded tomcat里,它只是一个空壳,所有的类加载都是`LaunchedURLClassLoader`完成的 - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ classloader -c 65361d9a -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -```bash -$ classloader --classLoaderClass org.apache.jasper.servlet.JasperLoader -``` - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### 列出ClassLoader里加载的所有类 - -列出上面的`org.apache.jasper.servlet.JasperLoader`加载的类: - -`classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader`{{execute T2}} - -```bash -$ classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -### 查看类的classloader层次 - -`sc -d org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -### 查看ClassLoader树 - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` - -### 查看URLClassLoader实际的urls - -比如上面查看到的spring LaunchedURLClassLoader的 hashcode是`1be6f5c3`,可以通过`-c`参数来指定classloader,或者直接使用`--classLoaderClass`,从而查看URLClassLoader实际的urls: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### 加载指定ClassLoader里的资源文件 - -查找指定的资源文件: `classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` -也可以尝试查找类的class文件: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r java/lang/String.class`{{execute T2}} - -```bash -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r java/lang/String.class - jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class -``` - -### 尝试加载指定的类 - -比如用上面的spring LaunchedURLClassLoader 尝试加载 `ch.qos.logback.classic.spi.StackTraceElementProxy` : - -首先使用`sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}查看,可发现未加载: - -```bash -Affect(row-cnt:0) cost in 18 ms. -``` - -因而使用spring LaunchedURLClassLoader 尝试加载: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}} - -```bash -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load ch.qos.logback.classic.spi.StackTraceElementProxy -load class success. - class-info ch.qos.logback.classic.spi.StackTraceElementProxy - code-source file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classic-1. - 1.11.jar!/ - name ch.qos.logback.classic.spi.StackTraceElementProxy - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name StackTraceElementProxy - modifier public - annotation - interfaces java.io.Serializable - super-class +-java.lang.Object - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - +-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@56a96482 - classLoaderHash 5674cd4d -``` - -再次使用`sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}查看,发现已经加载: - -```bash -ch.qos.logback.classic.spi.StackTraceElementProxy -Affect(row-cnt:1) cost in 19 ms. -``` diff --git a/tutorials/katacoda/command-classloader-cn/finish.md b/tutorials/katacoda/command-classloader-cn/finish.md deleted file mode 100644 index 3572b5bb48b..00000000000 --- a/tutorials/katacoda/command-classloader-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“classloader”中,我们演示了了Arthas的classloader命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-classloader-cn/index.json b/tutorials/katacoda/command-classloader-cn/index.json deleted file mode 100644 index b7a6e4ac487..00000000000 --- a/tutorials/katacoda/command-classloader-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas classloader命令", - "description": "Arthas classloader命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "start-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "classloader命令", - "text": "classloader.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-classloader-cn/intro.md b/tutorials/katacoda/command-classloader-cn/intro.md deleted file mode 100644 index 447c5b58dbd..00000000000 --- a/tutorials/katacoda/command-classloader-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示classloader命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ \ No newline at end of file diff --git a/tutorials/katacoda/command-classloader-cn/start-demo.md b/tutorials/katacoda/command-classloader-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-classloader-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-classloader-en/arthas-boot.md b/tutorials/katacoda/command-classloader-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-classloader-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-classloader-en/classloader.md b/tutorials/katacoda/command-classloader-en/classloader.md deleted file mode 100644 index bb55ef41703..00000000000 --- a/tutorials/katacoda/command-classloader-en/classloader.md +++ /dev/null @@ -1,183 +0,0 @@ - -View hierarchy, urls and classes-loading info for the class-loaders. - -`classloader` can search and print out the URLs for a specified resource from one particular classloader. It is quite handy when analyzing `ResourceNotFoundException`. - -### Options - -|Name|Specification| -|---:|:---| -|[l]|list all classloader instances| -|[t]|print classloader's hierarchy| -|[a]|list all the classes loaded by all the classloaders (use it with great caution since the output can be huge)| -|[c:]|print classloader's hashcode| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[c: r:]`|using ClassLoader to search resource| -|`[c: load:]`|using ClassLoader to load class| - -### Usage - -First visit the jsp page: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/hello - -### List all ClassLoaders - -`classloader -l`{{execute T2}} - -```bash -$ classloader -l - name loadedCount hash parent - BootstrapClassLoader 2724 null null - com.taobao.arthas.agent.ArthasClassloader@411ce1ab 2009 411ce1ab sun.misc.Launcher$ExtClassLoader@7494e528 - com.taobao.arthas.agent.ArthasClassloader@22ae1234 1253 22ae1234 sun.misc.Launcher$ExtClassLoader@7494e528 - org.apache.jasper.servlet.JasperLoader@65361d9a 1 65361d9a TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - TomcatEmbeddedWebappClassLoader 0 8546cd5 org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 5416 1be6f5c3 sun.misc.Launcher$AppClassLoader@3d4eac69 - sun.misc.Launcher$AppClassLoader@3d4eac69 45 3d4eac69 sun.misc.Launcher$ExtClassLoader@7494e528 - sun.misc.Launcher$ExtClassLoader@7494e528 4 7494e528 null -``` - -* The number of classes loaded by TomcatEmbeddedWebappClassLoader is 0, so in spring boot embedded tomcat, it is just an empty ClassLoader, all the classes are loaded by `LaunchedURLClassLoader` - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ classloader -c 65361d9a -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -```bash -$ classloader --classLoaderClass org.apache.jasper.servlet.JasperLoader -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### List all classes loaded in ClassLoader - -List all classes loaded by `org.apache.jasper.servlet.JasperLoader`: - -`classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader`{{execute T2}} - -```bash -$ classloader -a --classLoaderClass org.apache.jasper.servlet.JasperLoader - hash:1698045338, org.apache.jasper.servlet.JasperLoader@65361d9a - org.apache.jsp.jsp.hello_jsp -``` - -### Check the structure of classloader - -`sc -d org.apache.jsp.jsp.hello_jsp`{{execute T2}} - -### View the ClassLoader tree - - -`classloader -t`{{execute T2}} - -``` -$ classloader -t -+-BootstrapClassLoader -+-sun.misc.Launcher$ExtClassLoader@28cbbddd - +-com.taobao.arthas.agent.ArthasClassloader@8c25e55 - +-sun.misc.Launcher$AppClassLoader@55f96302 - +-org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - +-TomcatEmbeddedWebappClassLoader - context: ROOT - delegate: true - ----------> Parent Classloader: - org.springframework.boot.loader.LaunchedURLClassLoader@1be6f5c3 - - +-org.apache.jasper.servlet.JasperLoader@21ae0fe2 -``` - -### Show the URLs of the URLClassLoader - -For example, the hashcode of spring `LaunchedURLClassLoader` viewed above is `1be6f5c3`, and all its urls can be listed by specifying classloader using the `-c` or`--classLoaderClass` parameter and then executing the following command: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/ -jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-starter-aop-1.5 -.13.RELEASE.jar!/ -... -``` - -### Load the resource file in the specified ClassLoader - -Load the specified resource file: `classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/classes!/logback-spring.xml -``` - -Use the classloader to load .class resource - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r java/lang/String.class`{{execute T2}} - -```bash -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r java/lang/String.class - jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class -``` - -### Try to load the specified class - -For example, try loading `ch.qos.logback.classic.spi.StackTraceElementProxy` with spring LaunchedURLClassLoader : - -First check with `sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}, you can see that it's unloaded: - -`classloader -c --load java.lang.String` -```bash -Affect(row-cnt:0) cost in 18 ms. -``` - -So use spring LaunchedURLClassLoader to try to load: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}} - -```bash -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --load ch.qos.logback.classic.spi.StackTraceElementProxy -load class success. - class-info ch.qos.logback.classic.spi.StackTraceElementProxy - code-source file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classic-1. - 1.11.jar!/ - name ch.qos.logback.classic.spi.StackTraceElementProxy - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name StackTraceElementProxy - modifier public - annotation - interfaces java.io.Serializable - super-class +-java.lang.Object - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - +-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@56a96482 - classLoaderHash 5674cd4d -``` - -Finally check with `sc ch.qos.logback.classic.spi.StackTraceElementProxy`{{execute T2}}, and you can see that it has been loaded: - -```bash -ch.qos.logback.classic.spi.StackTraceElementProxy -Affect(row-cnt:1) cost in 19 ms. -``` diff --git a/tutorials/katacoda/command-classloader-en/finish.md b/tutorials/katacoda/command-classloader-en/finish.md deleted file mode 100644 index 7f52d9b109e..00000000000 --- a/tutorials/katacoda/command-classloader-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `classloader Tutorial` demonstrates the usage of classloader. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-classloader-en/index.json b/tutorials/katacoda/command-classloader-en/index.json deleted file mode 100644 index 9cac1837b93..00000000000 --- a/tutorials/katacoda/command-classloader-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas classloader Command", - "description": "Arthas classloader Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "classloader Command", - "text": "classloader.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-classloader-en/intro.md b/tutorials/katacoda/command-classloader-en/intro.md deleted file mode 100644 index a60b3adf953..00000000000 --- a/tutorials/katacoda/command-classloader-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the the usage of classloader. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-classloader-en/start-demo.md b/tutorials/katacoda/command-classloader-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-classloader-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-cls-cn/arthas-boot.md b/tutorials/katacoda/command-cls-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-cls-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-cls-cn/arthas-demo.md b/tutorials/katacoda/command-cls-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-cls-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-cls-cn/cls.md b/tutorials/katacoda/command-cls-cn/cls.md deleted file mode 100644 index 427afb7499b..00000000000 --- a/tutorials/katacoda/command-cls-cn/cls.md +++ /dev/null @@ -1,3 +0,0 @@ -通过`cls`命令可以清空当前屏幕区域。 - -`cls`{{execute T2}} diff --git a/tutorials/katacoda/command-cls-cn/finish.md b/tutorials/katacoda/command-cls-cn/finish.md deleted file mode 100644 index 84edf6d30bb..00000000000 --- a/tutorials/katacoda/command-cls-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas cls的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-cls-cn/index.json b/tutorials/katacoda/command-cls-cn/index.json deleted file mode 100644 index 57c03b43803..00000000000 --- a/tutorials/katacoda/command-cls-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas cls命令教程", - "description": "Arthas cls命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "cls 命令", - "text": "cls.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-cls-cn/intro.md b/tutorials/katacoda/command-cls-cn/intro.md deleted file mode 100644 index 935f1f528bc..00000000000 --- a/tutorials/katacoda/command-cls-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示cls命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-cls-en/arthas-boot.md b/tutorials/katacoda/command-cls-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-cls-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-cls-en/arthas-demo.md b/tutorials/katacoda/command-cls-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-cls-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-cls-en/cls.md b/tutorials/katacoda/command-cls-en/cls.md deleted file mode 100644 index 90fceadb0e5..00000000000 --- a/tutorials/katacoda/command-cls-en/cls.md +++ /dev/null @@ -1,4 +0,0 @@ - -Use `cls` to clear out the screen - -`cls`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/command-cls-en/finish.md b/tutorials/katacoda/command-cls-en/finish.md deleted file mode 100644 index cd85d2a8d21..00000000000 --- a/tutorials/katacoda/command-cls-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `cls`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-cls-en/index.json b/tutorials/katacoda/command-cls-en/index.json deleted file mode 100644 index 959651d48d3..00000000000 --- a/tutorials/katacoda/command-cls-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas Cls", - "description": "Arthas Cls", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "cls command", - "text": "cls.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-cls-en/intro.md b/tutorials/katacoda/command-cls-en/intro.md deleted file mode 100644 index 40ea5eed681..00000000000 --- a/tutorials/katacoda/command-cls-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of cls. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-dashboard-cn/arthas-boot.md b/tutorials/katacoda/command-dashboard-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-dashboard-cn/arthas-demo.md b/tutorials/katacoda/command-dashboard-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-dashboard-cn/dashboard.md b/tutorials/katacoda/command-dashboard-cn/dashboard.md deleted file mode 100644 index 21908b67251..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/dashboard.md +++ /dev/null @@ -1,70 +0,0 @@ - -`dashboard`{{execute T2}} 命令可以查看当前系统的实时数据面板。 - -当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。 - - -``` -$ dashboard -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTE DAEMON --1 C2 CompilerThread0 - -1 - 1.55 0.077 0:8.684 false true -53 Timer-for-arthas-dashboard-07b system 5 RUNNABLE 0.08 0.004 0:0.004 false true -22 scheduling-1 main 5 TIMED_WAI 0.06 0.003 0:0.287 false false --1 C1 CompilerThread0 - -1 - 0.06 0.003 0:2.171 false true --1 VM Periodic Task Thread - -1 - 0.03 0.001 0:0.092 false true -49 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.02 0.001 0:0.156 false true -16 Catalina-utility-1 main 1 TIMED_WAI 0.0 0.000 0:0.029 false false --1 G1 Young RemSet Sampling - -1 - 0.0 0.000 0:0.019 false true -17 Catalina-utility-2 main 1 WAITING 0.0 0.000 0:0.025 false false -34 http-nio-8080-ClientPoller main 5 RUNNABLE 0.0 0.000 0:0.016 false true -23 http-nio-8080-BlockPoller main 5 RUNNABLE 0.0 0.000 0:0.011 false true --1 VM Thread - -1 - 0.0 0.000 0:0.032 false true --1 Service Thread - -1 - 0.0 0.000 0:0.006 false true --1 GC Thread#5 - -1 - 0.0 0.000 0:0.043 false true -Memory used total max usage GC -heap 36M 70M 4096M 0.90% gc.g1_young_generation.count 12 -g1_eden_space 6M 18M -1 33.33% 86 -g1_old_gen 30M 50M 4096M 0.74% gc.g1_old_generation.count 0 -g1_survivor_space 491K 2048K -1 24.01% gc.g1_old_generation.time(ms) 0 -nonheap 66M 69M -1 96.56% -codeheap_'non-nmethods' 1M 2M 5M 22.39% -metaspace 46M 47M -1 98.01% -Runtime -os.name Mac OS X -os.version 10.15.4 -java.version 15 -java.home /Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home -systemload.average 10.68 -processors 8 -uptime 272s -``` - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 可以退出dashboard命令。 - - - -### 数据说明 - -* ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应。 -* NAME: 线程名 -* GROUP: 线程组名 -* PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高 -* STATE: 线程的状态 -* CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10% -* DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为`秒` -* TIME: 线程运行总CPU时间,数据格式为`分:秒` -* INTERRUPTED: 线程当前的中断位状态 -* DAEMON: 是否是daemon线程 - -#### JVM内部线程 -Java 8之后支持获取JVM内部线程CPU时间,这些线程只有名称和CPU时间,没有ID及状态等信息(显示ID为-1)。 -通过内部线程可以观测到JVM活动,如GC、JIT编译等占用CPU情况,方便了解JVM整体运行状况。 - -* 当JVM 堆(heap)/元数据(metaspace)空间不足或OOM时,可以看到GC线程的CPU占用率明显高于其他的线程。 -* 当执行`trace/watch/tt/redefine`等命令后,可以看到JIT线程活动变得更频繁。因为JVM热更新class字节码时清除了此class相关的JIT编译结果,需要重新编译。 - -JVM内部线程包括下面几种: -* JIT编译线程: 如 `C1 CompilerThread0`, `C2 CompilerThread0` -* GC线程: 如`GC Thread0`, `G1 Young RemSet Sampling` -* 其它内部线程: 如`VM Periodic Task Thread`, `VM Thread`, `Service Thread` - diff --git a/tutorials/katacoda/command-dashboard-cn/finish.md b/tutorials/katacoda/command-dashboard-cn/finish.md deleted file mode 100644 index 9278649d18e..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas dashboard的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-dashboard-cn/index.json b/tutorials/katacoda/command-dashboard-cn/index.json deleted file mode 100644 index 6413bd6556b..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/index.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Arthas dashboard命令教程", - "description": "Arthas dashboard命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "dashboard 命令", - "text": "dashboard.md" - }, - { - "title": "dashboard 数据说明", - "text": "notes-on-column-headers.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-dashboard-cn/intro.md b/tutorials/katacoda/command-dashboard-cn/intro.md deleted file mode 100644 index d007d548065..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示dashboard命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-dashboard-cn/notes-on-column-headers.md b/tutorials/katacoda/command-dashboard-cn/notes-on-column-headers.md deleted file mode 100644 index 1708aab0f47..00000000000 --- a/tutorials/katacoda/command-dashboard-cn/notes-on-column-headers.md +++ /dev/null @@ -1,22 +0,0 @@ - -* *ID*: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应 - -* *NAME*: 线程名 - -* *GROUP*: 线程组名 - -* *PRIORITY*: 线程优先级, 1~10之间的数字,越大表示优先级越高 - -* *STATE*: 线程的状态 - -* *CPU%*: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。 - -* *TIME*: 线程运行总时间,数据格式为`分:秒` - -* *INTERRUPTED*: 线程当前的中断位状态 - -* *DAEMON*: 是否是daemon线程 - -## 截图展示 - -![](https://arthas.aliyun.com/doc/_images/dashboard.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-dashboard-en/arthas-boot.md b/tutorials/katacoda/command-dashboard-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-dashboard-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-dashboard-en/arthas-demo.md b/tutorials/katacoda/command-dashboard-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-dashboard-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-dashboard-en/dashboard.md b/tutorials/katacoda/command-dashboard-en/dashboard.md deleted file mode 100644 index 576b095b881..00000000000 --- a/tutorials/katacoda/command-dashboard-en/dashboard.md +++ /dev/null @@ -1,74 +0,0 @@ - -The `dashboard`{{execute T2}} command allows you to view the real-time data panel of the current system. - -When running in Apache Tomcat Alibaba edition, the dashboard will also present the real time statistics of the tomcat, including [QPS](https://en.wikipedia.org/wiki/Queries_per_second), RT, error counts, and thread pool, etc. - - -``` -$ dashboard -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTE DAEMON --1 C2 CompilerThread0 - -1 - 1.55 0.077 0:8.684 false true -53 Timer-for-arthas-dashboard-07b system 5 RUNNABLE 0.08 0.004 0:0.004 false true -22 scheduling-1 main 5 TIMED_WAI 0.06 0.003 0:0.287 false false --1 C1 CompilerThread0 - -1 - 0.06 0.003 0:2.171 false true --1 VM Periodic Task Thread - -1 - 0.03 0.001 0:0.092 false true -49 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.02 0.001 0:0.156 false true -16 Catalina-utility-1 main 1 TIMED_WAI 0.0 0.000 0:0.029 false false --1 G1 Young RemSet Sampling - -1 - 0.0 0.000 0:0.019 false true -17 Catalina-utility-2 main 1 WAITING 0.0 0.000 0:0.025 false false -34 http-nio-8080-ClientPoller main 5 RUNNABLE 0.0 0.000 0:0.016 false true -23 http-nio-8080-BlockPoller main 5 RUNNABLE 0.0 0.000 0:0.011 false true --1 VM Thread - -1 - 0.0 0.000 0:0.032 false true --1 Service Thread - -1 - 0.0 0.000 0:0.006 false true --1 GC Thread#5 - -1 - 0.0 0.000 0:0.043 false true -Memory used total max usage GC -heap 36M 70M 4096M 0.90% gc.g1_young_generation.count 12 -g1_eden_space 6M 18M -1 33.33% 86 -g1_old_gen 30M 50M 4096M 0.74% gc.g1_old_generation.count 0 -g1_survivor_space 491K 2048K -1 24.01% gc.g1_old_generation.time(ms) 0 -nonheap 66M 69M -1 96.56% -codeheap_'non-nmethods' 1M 2M 5M 22.39% -metaspace 46M 47M -1 98.01% -Runtime -os.name Mac OS X -os.version 10.15.4 -java.version 15 -java.home /Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home -systemload.average 10.68 -processors 8 -uptime 272s -``` - -Enter `Q`{{execute T2}} or `Ctrl+C` to exit the dashboard command. - - -### Notes on column headers - -* ID: JVM thread ID, pls. note this ID is different from the nativeID in jstack -* NAME: thread name -* GROUP: thread group name -* PRIORITY: thread priority, ranged from 1 to 10. The greater number, the higher priority -* STATE: thread state -* CPU%: the ratio of CPU usage for the thread. For example, the sampling interval is 1000ms, and the incremental cpu time - of a thread is 100ms, then the cpu usage rate=100/1000=10% -* DELTA_TIME: incremental CPU time of thread running after the last sampling in `second` format -* TIME: total CPU time of the thread in `minute:second` format -* INTERRUPTED: the thread interruption state -* DAEMON: daemon thread or not - - -#### JVM internal threads -After Java 8, it is supported to obtain the CPU time of JVM internal threads. These threads only have the name and CPU time, - without ID and status information (display ID is -1). - -JVM activities can be observed through internal threads, such as GC, JIT compilation, etc., to perceive the overall status of JVM. - -* When the JVM heap/metaspace space is insufficient or OOM, it can be seen that the CPU usage of the GC threads is - significantly higher than other threads. -* After executing commands such as `trace/watch/tt/redefine`, you can see that JIT threads activities become more frequent. - Because the JIT compilation data related to this class is cleared when the JVM hot update the class bytecode, it needs to be recompiled. - -JVM internal threads include the following: -* JIT compilation thread: such as `C1 CompilerThread0`, `C2 CompilerThread0` -* GC thread: such as `GC Thread0`, `G1 Young RemSet Sampling` -* Other internal threads: such as`VM Periodic Task Thread`, `VM Thread`, `Service Thread` diff --git a/tutorials/katacoda/command-dashboard-en/finish.md b/tutorials/katacoda/command-dashboard-en/finish.md deleted file mode 100644 index 35081ec1624..00000000000 --- a/tutorials/katacoda/command-dashboard-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `dashboard`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-dashboard-en/index.json b/tutorials/katacoda/command-dashboard-en/index.json deleted file mode 100644 index 5c9f6a32359..00000000000 --- a/tutorials/katacoda/command-dashboard-en/index.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Arthas dashboard", - "description": "Arthas dashboard", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "dashboard command", - "text": "dashboard.md" - }, - { - "title": "Notes on column headers", - "text": "notes-on-column-headers.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-dashboard-en/intro.md b/tutorials/katacoda/command-dashboard-en/intro.md deleted file mode 100644 index 0b54bbfb33a..00000000000 --- a/tutorials/katacoda/command-dashboard-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of dashboard. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-dashboard-en/notes-on-column-headers.md b/tutorials/katacoda/command-dashboard-en/notes-on-column-headers.md deleted file mode 100644 index b0f953a3389..00000000000 --- a/tutorials/katacoda/command-dashboard-en/notes-on-column-headers.md +++ /dev/null @@ -1,22 +0,0 @@ - -* *ID*: JVM thread ID, pls. note this ID is different from the nativeID in jstack - -* *NAME*: thread name - -* *GROUP*: thread group name - -* *PRIORITY*: thread priority, ranged from 1 to 10. The greater number, the higher priority - -* *STATE*: thread state - -* *CPU%*: the ratio of CPU usage for the thread, sampled every 100ms - -* *TIME*: total running time in minute:`second format` - -* *INTERRUPTED*: the thread interruption state - -* *DAEMON*: daemon thread or not - -## Screenshot - -![](https://arthas.aliyun.com/doc/en/_images/dashboard.png) diff --git a/tutorials/katacoda/command-dump-cn/arthas-boot.md b/tutorials/katacoda/command-dump-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-dump-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-dump-cn/arthas-demo.md b/tutorials/katacoda/command-dump-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-dump-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-dump-cn/dump.md b/tutorials/katacoda/command-dump-cn/dump.md deleted file mode 100644 index 4c02ffd497d..00000000000 --- a/tutorials/katacoda/command-dump-cn/dump.md +++ /dev/null @@ -1,68 +0,0 @@ - -> dump 已加载类的 bytecode 到特定目录 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|`[c:]`|类所属 ClassLoader 的 hashcode| -|`[d:]`|设置类文件的目标目录| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|[E]|开启正则表达式匹配,默认为通配符匹配| - -### 使用参考 - -`dump java.lang.String`{{execute T2}} - -```bash -$ dump java.lang.String - HASHCODE CLASSLOADER LOCATION - null /Users/admin/logs/arthas/classdump/java/lang/String.class -Affect(row-cnt:1) cost in 119 ms. -``` - -`dump demo.*`{{execute T2}} - -```bash -$ dump demo.* - HASHCODE CLASSLOADER LOCATION - 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class - +-sun.misc.Launcher$ExtClassLoader@66350f69 -Affect(row-cnt:1) cost in 39 ms. -``` - -`dump -d /tmp/output java.lang.String`{{execute T2}} - -```bash -$ dump -d /tmp/output java.lang.String - HASHCODE CLASSLOADER LOCATION - null /tmp/output/java/lang/String.class -Affect(row-cnt:1) cost in 138 ms. -``` - -* 指定classLoader - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ dump -c 3d4eac69 demo.* -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.*`{{execute T2}} - -```bash -$ dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.* - HASHCODE CLASSLOADER LOCATION - 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class - +-sun.misc.Launcher$ExtClassLoader@66350f69 -Affect(row-cnt:1) cost in 39 ms. -``` - - * 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda目前环境是java8。 - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 diff --git a/tutorials/katacoda/command-dump-cn/finish.md b/tutorials/katacoda/command-dump-cn/finish.md deleted file mode 100644 index eef74eb851c..00000000000 --- a/tutorials/katacoda/command-dump-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“dump”中,我们演示了了Arthas的dump命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-dump-cn/index.json b/tutorials/katacoda/command-dump-cn/index.json deleted file mode 100644 index e978c1b9ef2..00000000000 --- a/tutorials/katacoda/command-dump-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas dump命令", - "description": "Arthas dump命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "dump命令", - "text": "dump.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-dump-cn/intro.md b/tutorials/katacoda/command-dump-cn/intro.md deleted file mode 100644 index 7aba54af146..00000000000 --- a/tutorials/katacoda/command-dump-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示dump命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-dump-en/arthas-boot.md b/tutorials/katacoda/command-dump-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-dump-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-dump-en/arthas-demo.md b/tutorials/katacoda/command-dump-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-dump-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-dump-en/dump.md b/tutorials/katacoda/command-dump-en/dump.md deleted file mode 100644 index e74e14d982e..00000000000 --- a/tutorials/katacoda/command-dump-en/dump.md +++ /dev/null @@ -1,68 +0,0 @@ - -> Dump the bytecode for the particular classes to the specified directory. - -### Options - -|Name|Specification| -|---:|:---| -|*class-pattern*|class name pattern| -|`[c:]`|hashcode of the [class loader](classloader.md) that loaded the target class| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[d:]`|set the destination directory for class files| -|`[E]`|turn on regex match, the default behavior is wild card match| - -### Usage - -`dump java.lang.String`{{execute T2}} - -```bash -$ dump java.lang.String - HASHCODE CLASSLOADER LOCATION - null /Users/admin/logs/arthas/classdump/java/lang/String.class -Affect(row-cnt:1) cost in 119 ms. -``` - -`dump demo.*`{{execute T2}} - -```bash -$ dump demo.* - HASHCODE CLASSLOADER LOCATION - 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class - +-sun.misc.Launcher$ExtClassLoader@66350f69 -Affect(row-cnt:1) cost in 39 ms. -``` - -`dump -d /tmp/output java.lang.String`{{execute T2}} - -```bash -$ dump - HASHCODE CLASSLOADER LOCATION - null /tmp/output/java/lang/String.class -Affect(row-cnt:1) cost in 138 ms. -``` - -* Specify classLoader - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ dump -c 3d4eac69 demo.* -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -`dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.*`{{execute T2}} - -```bash -$ dump --classLoaderClass sun.misc.Launcher$AppClassLoader demo.* - HASHCODE CLASSLOADER LOCATION - 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class - +-sun.misc.Launcher$ExtClassLoader@66350f69 -Affect(row-cnt:1) cost in 39 ms. -``` - - * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. diff --git a/tutorials/katacoda/command-dump-en/finish.md b/tutorials/katacoda/command-dump-en/finish.md deleted file mode 100644 index fe0677227b3..00000000000 --- a/tutorials/katacoda/command-dump-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `dump Tutorial` demonstrates the usage of dump. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-dump-en/index.json b/tutorials/katacoda/command-dump-en/index.json deleted file mode 100644 index 45d5e68d438..00000000000 --- a/tutorials/katacoda/command-dump-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas dump Command", - "description": "Arthas dump Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "dump Command", - "text": "dump.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-dump-en/intro.md b/tutorials/katacoda/command-dump-en/intro.md deleted file mode 100644 index eb0bb2eda4a..00000000000 --- a/tutorials/katacoda/command-dump-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of dump. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-echo-cn/arthas-boot.md b/tutorials/katacoda/command-echo-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-echo-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-echo-cn/arthas-demo.md b/tutorials/katacoda/command-echo-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-echo-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-echo-cn/echo.md b/tutorials/katacoda/command-echo-cn/echo.md deleted file mode 100644 index ae65d0ecdfe..00000000000 --- a/tutorials/katacoda/command-echo-cn/echo.md +++ /dev/null @@ -1,4 +0,0 @@ - -通过`echo`命令可以打印参数,和linux里的echo命令类似。 - -`echo 'hello'`{{execute T2}} diff --git a/tutorials/katacoda/command-echo-cn/finish.md b/tutorials/katacoda/command-echo-cn/finish.md deleted file mode 100644 index 5b28a1b3cfa..00000000000 --- a/tutorials/katacoda/command-echo-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas echo的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-echo-cn/index.json b/tutorials/katacoda/command-echo-cn/index.json deleted file mode 100644 index f81c7be1158..00000000000 --- a/tutorials/katacoda/command-echo-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas echo命令教程", - "description": "Arthas echo命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "echo 命令", - "text": "echo.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-echo-cn/intro.md b/tutorials/katacoda/command-echo-cn/intro.md deleted file mode 100644 index 2929e1c4e17..00000000000 --- a/tutorials/katacoda/command-echo-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示echo命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-echo-en/arthas-boot.md b/tutorials/katacoda/command-echo-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-echo-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-echo-en/arthas-demo.md b/tutorials/katacoda/command-echo-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-echo-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-echo-en/echo.md b/tutorials/katacoda/command-echo-en/echo.md deleted file mode 100644 index 9394f06872a..00000000000 --- a/tutorials/katacoda/command-echo-en/echo.md +++ /dev/null @@ -1,4 +0,0 @@ - -Use `echo` to clear out the screen - -`echo 'hello'`{{execute T2}} diff --git a/tutorials/katacoda/command-echo-en/finish.md b/tutorials/katacoda/command-echo-en/finish.md deleted file mode 100644 index 3a4dd0d5ccd..00000000000 --- a/tutorials/katacoda/command-echo-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `echo`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-echo-en/index.json b/tutorials/katacoda/command-echo-en/index.json deleted file mode 100644 index 1029e49e08c..00000000000 --- a/tutorials/katacoda/command-echo-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas echo", - "description": "Arthas echo", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "echo command", - "text": "echo.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-echo-en/intro.md b/tutorials/katacoda/command-echo-en/intro.md deleted file mode 100644 index 62e4e50414e..00000000000 --- a/tutorials/katacoda/command-echo-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of echo. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-getstatic-cn/arthas-boot.md b/tutorials/katacoda/command-getstatic-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-getstatic-cn/arthas-demo.md b/tutorials/katacoda/command-getstatic-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-getstatic-cn/finish.md b/tutorials/katacoda/command-getstatic-cn/finish.md deleted file mode 100644 index 3add1c07012..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“getstatic”中,我们演示了了Arthas的getstatic命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-getstatic-cn/getstatic.md b/tutorials/katacoda/command-getstatic-cn/getstatic.md deleted file mode 100644 index 6fa8b8ec656..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/getstatic.md +++ /dev/null @@ -1,52 +0,0 @@ - - -* 推荐直接使用[ognl](https://arthas.aliyun.com/doc/arthas-tutorials.html?language=cn&id=command-ognl)命令,更加灵活。 - -通过getstatic命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name` - -`getstatic demo.MathGame random`{{execute T2}} - -```bash -$ getstatic demo.MathGame random -field: random -@Random[ - serialVersionUID=@Long[3905348978240129619], - seed=@AtomicLong[120955813885284], - multiplier=@Long[25214903917], - addend=@Long[11], - mask=@Long[281474976710655], - DOUBLE_UNIT=@Double[1.1102230246251565E-16], - BadBound=@String[bound must be positive], - BadRange=@String[bound must be greater than origin], - BadSize=@String[size must be non-negative], - seedUniquifier=@AtomicLong[-3282039941672302964], - nextNextGaussian=@Double[0.0], - haveNextNextGaussian=@Boolean[false], - serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3], - unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027], - seedOffset=@Long[24], -] -``` - -* 指定classLoader - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,使用`sc -d `提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ getstatic -c 3d4eac69 demo.MathGame random -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`getstatic --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame random`{{execute T2}} - - * 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda目前环境是java8。 - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -如果该静态属性是一个复杂对象,还可以支持在该属性上通过ognl表示进行遍历,过滤,访问对象的内部属性等操作。 - -* OGNL特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) -* OGNL表达式官方指南:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) diff --git a/tutorials/katacoda/command-getstatic-cn/index.json b/tutorials/katacoda/command-getstatic-cn/index.json deleted file mode 100644 index 4b5aabebcbe..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas getstatic命令", - "description": "Arthas getstatic命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "getstatic命令", - "text": "getstatic.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-getstatic-cn/intro.md b/tutorials/katacoda/command-getstatic-cn/intro.md deleted file mode 100644 index 43be9ef6086..00000000000 --- a/tutorials/katacoda/command-getstatic-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示getstatic命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-getstatic-en/arthas-boot.md b/tutorials/katacoda/command-getstatic-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-getstatic-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-getstatic-en/arthas-demo.md b/tutorials/katacoda/command-getstatic-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-getstatic-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-getstatic-en/finish.md b/tutorials/katacoda/command-getstatic-en/finish.md deleted file mode 100644 index c1516e5f574..00000000000 --- a/tutorials/katacoda/command-getstatic-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `getstatic Tutorial` demonstrates the usage of getstatic. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-getstatic-en/getstatic.md b/tutorials/katacoda/command-getstatic-en/getstatic.md deleted file mode 100644 index a271f7c16cd..00000000000 --- a/tutorials/katacoda/command-getstatic-en/getstatic.md +++ /dev/null @@ -1,52 +0,0 @@ - -* It is recommended to use the [OGNL] (https://arthas.aliyun.com/doc/arthas-tutorials.html?language=en&id=command-ognl) command, which will be more flexible. - -Check the static fields of classes conveniently, the usage is `getstatic class_name field_name`. - -`getstatic demo.MathGame random`{{execute T2}} - -```bash -$ getstatic demo.MathGame random -field: random -@Random[ - serialVersionUID=@Long[3905348978240129619], - seed=@AtomicLong[120955813885284], - multiplier=@Long[25214903917], - addend=@Long[11], - mask=@Long[281474976710655], - DOUBLE_UNIT=@Double[1.1102230246251565E-16], - BadBound=@String[bound must be positive], - BadRange=@String[bound must be greater than origin], - BadSize=@String[size must be non-negative], - seedUniquifier=@AtomicLong[-3282039941672302964], - nextNextGaussian=@Double[0.0], - haveNextNextGaussian=@Boolean[false], - serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3], - unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027], - seedOffset=@Long[24], -] -``` - -* Specify classLoader - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader using `sc -d `. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ getstatic -c 3d4eac69 demo.MathGame random -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -`getstatic --classLoaderClass demo.MathGame random`{{execute T2}} - - * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - - -Tip: if the static field is a complex class, you can even use [`OGNL`](https://commons.apache.org/proper/commons-ognl/language-guide.html) to traverse, filter and access the inner properties of this class. - -* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html) -* [Special usages](https://github.com/alibaba/arthas/issues/71) diff --git a/tutorials/katacoda/command-getstatic-en/index.json b/tutorials/katacoda/command-getstatic-en/index.json deleted file mode 100644 index ee9d517eab7..00000000000 --- a/tutorials/katacoda/command-getstatic-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas getstatic Command", - "description": "Arthas getstatic Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "getstatic Command", - "text": "getstatic.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-getstatic-en/intro.md b/tutorials/katacoda/command-getstatic-en/intro.md deleted file mode 100644 index 70b3c5035b4..00000000000 --- a/tutorials/katacoda/command-getstatic-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of getstatic. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-grep-cn/arthas-boot.md b/tutorials/katacoda/command-grep-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-grep-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-grep-cn/arthas-demo.md b/tutorials/katacoda/command-grep-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-grep-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-grep-cn/finish.md b/tutorials/katacoda/command-grep-cn/finish.md deleted file mode 100644 index a5b4f85cd81..00000000000 --- a/tutorials/katacoda/command-grep-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas grep的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-grep-cn/grep.md b/tutorials/katacoda/command-grep-cn/grep.md deleted file mode 100644 index bdf2e072785..00000000000 --- a/tutorials/katacoda/command-grep-cn/grep.md +++ /dev/null @@ -1,60 +0,0 @@ - -类似传统的`grep`命令。 - -`grep -h`{{execute T2}} - -```bash - USAGE: - grep [-A ] [-B ] [-C ] [-h] [-i] [-v] [-n] [-m ] [-e] [--trim-end] pattern - - SUMMARY: - grep command for pipes. - - EXAMPLES: - sysprop | grep java - sysprop | grep java -n - sysenv | grep -v JAVA - sysenv | grep -e "(?i)(JAVA|sun)" -m 3 -C 2 - sysenv | grep JAVA -A2 -B3 - thread | grep -m 10 -e "TIMED_WAITING|WAITING" - - WIKI: - https://arthas.aliyun.com/doc/grep - - OPTIONS: - -A, --after-context Print NUM lines of trailing context) - -B, --before-context Print NUM lines of leading context) - -C, --context Print NUM lines of output context) - -h, --help this help - -i, --ignore-case Perform case insensitive matching. By default, grep is case sensitive. - -v, --invert-match Select non-matching lines - -n, --line-number Print line number with output lines - -m, --max-count stop after NUM selected lines) - -e, --regex Enable regular expression to match - --trim-end Remove whitespaces at the end of the line - Pattern -``` - -## 示例命令 - -### 匹配展示符合范本样式的项 - -`sysprop | grep java`{{execute T2}} - -### `-n`命令显示行号: - -`sysprop | grep java -n`{{execute T2}} - -### `-v`展示非匹配 - -`sysenv | grep -v JAVA`{{execute T2}} - -### `-e`使用正则表达式匹配,`-m`设定最大展示条数, - -`sysenv | grep -e "(?i)(JAVA|sun)" -m 3 -C 2`{{execute T2}} - -`thread | grep -m 10 -e "TIMED_WAITING|WAITING"`{{execute T2}} - -### 除了显示符合范本样式的那一行之外,`-A`指定显示该行之后的内容,`-B`指定显示该行之前的内容。 - -`sysenv | grep JAVA -A2 -B3`{{execute T2}} diff --git a/tutorials/katacoda/command-grep-cn/index.json b/tutorials/katacoda/command-grep-cn/index.json deleted file mode 100644 index 8f95d971cec..00000000000 --- a/tutorials/katacoda/command-grep-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas grep命令教程", - "description": "Arthas grep命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "grep 命令", - "text": "grep.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-grep-cn/intro.md b/tutorials/katacoda/command-grep-cn/intro.md deleted file mode 100644 index f1665229927..00000000000 --- a/tutorials/katacoda/command-grep-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示grep命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-grep-en/arthas-boot.md b/tutorials/katacoda/command-grep-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-grep-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-grep-en/arthas-demo.md b/tutorials/katacoda/command-grep-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-grep-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-grep-en/finish.md b/tutorials/katacoda/command-grep-en/finish.md deleted file mode 100644 index 0611835adcc..00000000000 --- a/tutorials/katacoda/command-grep-en/finish.md +++ /dev/null @@ -1,8 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `grep`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) - diff --git a/tutorials/katacoda/command-grep-en/grep.md b/tutorials/katacoda/command-grep-en/grep.md deleted file mode 100644 index c6b1fb5671f..00000000000 --- a/tutorials/katacoda/command-grep-en/grep.md +++ /dev/null @@ -1,60 +0,0 @@ - -Similar to the traditional `grep` command. - -`grep -h`{{execute T2}} - -```bash - USAGE: - grep [-A ] [-B ] [-C ] [-h] [-i] [-v] [-n] [-m ] [-e] [--trim-end] pattern - - SUMMARY: - grep command for pipes. - - EXAMPLES: - sysprop | grep java - sysprop | grep java -n - sysenv | grep -v JAVA - sysenv | grep -e "(?i)(JAVA|sun)" -m 3 -C 2 - sysenv | grep JAVA -A2 -B3 - thread | grep -m 10 -e "TIMED_WAITING|WAITING" - - WIKI: - https://arthas.aliyun.com/doc/grep - - OPTIONS: - -A, --after-context Print NUM lines of trailing context) - -B, --before-context Print NUM lines of leading context) - -C, --context Print NUM lines of output context) - -h, --help this help - -i, --ignore-case Perform case insensitive matching. By default, grep is case sensitive. - -v, --invert-match Select non-matching lines - -n, --line-number Print line number with output lines - -m, --max-count stop after NUM selected lines) - -e, --regex Enable regular expression to match - --trim-end Remove whitespaces at the end of the line - Pattern -``` - -## Example - -### Print matched lines - -`sysprop | grep java`{{execute T2}} - -### `-n` to show line numbers - -`sysprop | grep java -n`{{execute T2}} - -### `-v` to show non-matching lines - -`sysenv | grep -v JAVA`{{execute T2}} - -### `-e` to enable regular expression to match,`-m` stop after the specified number of selected lines - -`sysenv | grep -e "(?i)(JAVA|sun)" -m 3 -C 2`{{execute T2}} - -`thread | grep -m 10 -e "TIMED_WAITING|WAITING"`{{execute T2}} - -### `-A` to print specified line number of trailing context,`-B` to print specified line number of leading context - -`sysenv | grep JAVA -A2 -B3`{{execute T2}} diff --git a/tutorials/katacoda/command-grep-en/index.json b/tutorials/katacoda/command-grep-en/index.json deleted file mode 100644 index 8b343a7568c..00000000000 --- a/tutorials/katacoda/command-grep-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas grep", - "description": "Arthas grep", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "grep command", - "text": "grep.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-grep-en/intro.md b/tutorials/katacoda/command-grep-en/intro.md deleted file mode 100644 index d2b36e367ae..00000000000 --- a/tutorials/katacoda/command-grep-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of grep. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-heapdump-cn/arthas-boot.md b/tutorials/katacoda/command-heapdump-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-heapdump-cn/arthas-demo.md b/tutorials/katacoda/command-heapdump-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-heapdump-cn/finish.md b/tutorials/katacoda/command-heapdump-cn/finish.md deleted file mode 100644 index 07c1a802052..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“heapdump”中,我们演示了了Arthas的heapdump命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-heapdump-cn/heapdump.md b/tutorials/katacoda/command-heapdump-cn/heapdump.md deleted file mode 100644 index f1e50434798..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/heapdump.md +++ /dev/null @@ -1,38 +0,0 @@ - -> dump java heap, 类似jmap命令的heap dump功能。 - - -### 使用参考 - -#### dump到指定文件 - -`heapdump /tmp/dump.hprof`{{execute T2}} - -```bash -[arthas@58205]$ heapdump /tmp/dump.hprof -Dumping heap to /tmp/dump.hprof... -Heap dump file created -``` - -#### 只dump live对象 - -`heapdump --live /tmp/dump.hprof`{{execute T2}} - -```bash -[arthas@58205]$ heapdump --live /tmp/dump.hprof -Dumping heap to /tmp/dump.hprof... -Heap dump file created -``` - -### dump到临时文件 - -`heapdump`{{execute T2}} - -```bash -[arthas@58205]$ heapdump -Dumping heap to /var/folders/my/wy7c9w9j5732xbkcyt1mb4g40000gp/T/heapdump2019-09-03-16-385121018449645518991.hprof... -Heap dump file created -``` - - - diff --git a/tutorials/katacoda/command-heapdump-cn/index.json b/tutorials/katacoda/command-heapdump-cn/index.json deleted file mode 100644 index 45689308df2..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas heapdump命令", - "description": "Arthas heapdump命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "heapdump命令", - "text": "heapdump.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-heapdump-cn/intro.md b/tutorials/katacoda/command-heapdump-cn/intro.md deleted file mode 100644 index 05f7b9547ac..00000000000 --- a/tutorials/katacoda/command-heapdump-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示heapdump命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-heapdump-en/arthas-boot.md b/tutorials/katacoda/command-heapdump-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-heapdump-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-heapdump-en/arthas-demo.md b/tutorials/katacoda/command-heapdump-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-heapdump-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-heapdump-en/finish.md b/tutorials/katacoda/command-heapdump-en/finish.md deleted file mode 100644 index 6de5b8b2fed..00000000000 --- a/tutorials/katacoda/command-heapdump-en/finish.md +++ /dev/null @@ -1,8 +0,0 @@ - -The `heapdump Tutorial` demonstrates the usage of heapdump. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) - diff --git a/tutorials/katacoda/command-heapdump-en/heapdump.md b/tutorials/katacoda/command-heapdump-en/heapdump.md deleted file mode 100644 index e6ecaeefc89..00000000000 --- a/tutorials/katacoda/command-heapdump-en/heapdump.md +++ /dev/null @@ -1,38 +0,0 @@ - -> dump java heap in hprof binary format, like `jmap`. - - -### Usage - -#### Dump to file - -`heapdump /tmp/dump.hprof`{{execute T2}} - -```bash -[arthas@58205]$ heapdump /tmp/dump.hprof -Dumping heap to /tmp/dump.hprof... -Heap dump file created -``` - -#### Dump only live objects - -`heapdump --live /tmp/dump.hprof`{{execute T2}} - -```bash -[arthas@58205]$ heapdump --live /tmp/dump.hprof -Dumping heap to /tmp/dump.hprof... -Heap dump file created -``` - -#### Dump to tmp file - -`heapdump`{{execute T2}} - -```bash -[arthas@58205]$ heapdump -Dumping heap to /var/folders/my/wy7c9w9j5732xbkcyt1mb4g40000gp/T/heapdump2019-09-03-16-385121018449645518991.hprof... -Heap dump file created -``` - - - diff --git a/tutorials/katacoda/command-heapdump-en/index.json b/tutorials/katacoda/command-heapdump-en/index.json deleted file mode 100644 index 1f9a3efe759..00000000000 --- a/tutorials/katacoda/command-heapdump-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas heapdump Command", - "description": "Arthas heapdump Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "heapdump Command", - "text": "heapdump.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-heapdump-en/intro.md b/tutorials/katacoda/command-heapdump-en/intro.md deleted file mode 100644 index 4a4a4c1b71e..00000000000 --- a/tutorials/katacoda/command-heapdump-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of heapdump. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-help-cn/arthas-boot.md b/tutorials/katacoda/command-help-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-help-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-help-cn/arthas-demo.md b/tutorials/katacoda/command-help-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-help-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-help-cn/finish.md b/tutorials/katacoda/command-help-cn/finish.md deleted file mode 100644 index bc6c484df53..00000000000 --- a/tutorials/katacoda/command-help-cn/finish.md +++ /dev/null @@ -1,12 +0,0 @@ - -通过本教程基本掌握了Arthas的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) - diff --git a/tutorials/katacoda/command-help-cn/help-sysprop.md b/tutorials/katacoda/command-help-cn/help-sysprop.md deleted file mode 100644 index 83535d0c5df..00000000000 --- a/tutorials/katacoda/command-help-cn/help-sysprop.md +++ /dev/null @@ -1,30 +0,0 @@ - - -比如查看`sysprop`命令的帮助信息: - -`help sysprop`{{execute T2}} - -```bash -[arthas@50759]$ help sysprop - USAGE: - sysprop [-h] [property-name] [property-value] - - SUMMARY: - Display, and change the system properties. - - EXAMPLES: - sysprop - sysprop file.encoding - sysprop production.mode true - - WIKI: - https://arthas.aliyun.com/doc/sysprop - - OPTIONS: - -h, --help this help - property name - property value -``` - -可以看到具体的命令的参数,示例和WKI地址。 - diff --git a/tutorials/katacoda/command-help-cn/help.md b/tutorials/katacoda/command-help-cn/help.md deleted file mode 100644 index 8832d941175..00000000000 --- a/tutorials/katacoda/command-help-cn/help.md +++ /dev/null @@ -1,19 +0,0 @@ -`help`{{execute T2}} 命令可以查看所有命令的帮助信息。 - -```bash -[arthas@50759]$ help - NAME DESCRIPTION - help Display Arthas Help - keymap Display all the available keymap for the specified connection. - sc Search all the classes loaded by JVM - sm Search the method of classes loaded by JVM - classloader Show classloader info - jad Decompile class - getstatic Show the static field of a class - monitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc. - stack Display the stack trace for the specified class and method - thread Display thread info, thread stack - trace Trace the execution time of specified method invocation. - watch Display the input/output parameter, return object, and thrown exception of specified method invocation -... -``` diff --git a/tutorials/katacoda/command-help-cn/index.json b/tutorials/katacoda/command-help-cn/index.json deleted file mode 100644 index 53ff370b387..00000000000 --- a/tutorials/katacoda/command-help-cn/index.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Arthas Help命令教程", - "description": "Arthas Help命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "help 命令", - "text": "help.md" - }, - { - "title": "查看具体命令的help信息", - "text": "help-sysprop.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-help-cn/intro.md b/tutorials/katacoda/command-help-cn/intro.md deleted file mode 100644 index 7caf4e3dd5e..00000000000 --- a/tutorials/katacoda/command-help-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示help命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-help-en/arthas-boot.md b/tutorials/katacoda/command-help-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-help-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-help-en/arthas-demo.md b/tutorials/katacoda/command-help-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-help-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-help-en/finish.md b/tutorials/katacoda/command-help-en/finish.md deleted file mode 100644 index 55ef4149598..00000000000 --- a/tutorials/katacoda/command-help-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-help-en/help-sysprop.md b/tutorials/katacoda/command-help-en/help-sysprop.md deleted file mode 100644 index ac6e87f461b..00000000000 --- a/tutorials/katacoda/command-help-en/help-sysprop.md +++ /dev/null @@ -1,30 +0,0 @@ - - -For example, to view the help information for the command `sysprop`: - -`help sysprop`{{execute T2}} - -```bash -[arthas@50759]$ help sysprop - USAGE: - sysprop [-h] [property-name] [property-value] - - SUMMARY: - Display, and change the system properties. - - EXAMPLES: - sysprop - sysprop file.encoding - sysprop production.mode true - - WIKI: - https://arthas.aliyun.com/doc/sysprop - - OPTIONS: - -h, --help this help - property name - property value -``` - -You can see the arguments, examples and WKI of specific commands. - diff --git a/tutorials/katacoda/command-help-en/help.md b/tutorials/katacoda/command-help-en/help.md deleted file mode 100644 index 110aaec6e11..00000000000 --- a/tutorials/katacoda/command-help-en/help.md +++ /dev/null @@ -1,19 +0,0 @@ -The `help`{{execute T2}} command allows you to view help information for all commands. - -```bash -[arthas@50759]$ help - NAME DESCRIPTION - help Display Arthas Help - keymap Display all the available keymap for the specified connection. - sc Search all the classes loaded by JVM - sm Search the method of classes loaded by JVM - classloader Show classloader info - jad Decompile class - getstatic Show the static field of a class - monitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc. - stack Display the stack trace for the specified class and method - thread Display thread info, thread stack - trace Trace the execution time of specified method invocation. - watch Display the input/output parameter, return object, and thrown exception of specified method invocation -... -``` diff --git a/tutorials/katacoda/command-help-en/index.json b/tutorials/katacoda/command-help-en/index.json deleted file mode 100644 index 6a6226ad040..00000000000 --- a/tutorials/katacoda/command-help-en/index.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Arthas Help Command", - "description": "Arthas Help Command", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Help command", - "text": "help.md" - }, - { - "title": "View the help information of a command", - "text": "help-sysprop.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-help-en/intro.md b/tutorials/katacoda/command-help-en/intro.md deleted file mode 100644 index a7e925fdd66..00000000000 --- a/tutorials/katacoda/command-help-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of help. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-history-cn/arthas-boot.md b/tutorials/katacoda/command-history-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-history-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-history-cn/arthas-demo.md b/tutorials/katacoda/command-history-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-history-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-history-cn/finish.md b/tutorials/katacoda/command-history-cn/finish.md deleted file mode 100644 index e842d7c845b..00000000000 --- a/tutorials/katacoda/command-history-cn/finish.md +++ /dev/null @@ -1,12 +0,0 @@ - -通过本教程基本掌握了Arthas history的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) - diff --git a/tutorials/katacoda/command-history-cn/history.md b/tutorials/katacoda/command-history-cn/history.md deleted file mode 100644 index 7b8ff5021d9..00000000000 --- a/tutorials/katacoda/command-history-cn/history.md +++ /dev/null @@ -1,35 +0,0 @@ - -通过`history`命令可以打印命令历史。 - -`history`{{execute T2}} - -## 使用参考 - -`history -h`{{execute T2}} - -```bash -[arthas@48]$ history -h - USAGE: - history [-c] [-h] [n] - - SUMMARY: - Display command history - - EXAMPLES: - history - history -c - history 5 - - OPTIONS: - -c, --clear clear history - -h, --help this help - how many history commnads to display -``` - -## 显示指定数目的历史 - -`history 5`{{execute T2}} - -## 清除历史 - -`history -c`{{execute T2}} diff --git a/tutorials/katacoda/command-history-cn/index.json b/tutorials/katacoda/command-history-cn/index.json deleted file mode 100644 index 5e713ad447f..00000000000 --- a/tutorials/katacoda/command-history-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas history命令教程", - "description": "Arthas history命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "history 命令", - "text": "history.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-history-cn/intro.md b/tutorials/katacoda/command-history-cn/intro.md deleted file mode 100644 index 914f0643962..00000000000 --- a/tutorials/katacoda/command-history-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示history命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-history-en/arthas-boot.md b/tutorials/katacoda/command-history-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-history-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-history-en/arthas-demo.md b/tutorials/katacoda/command-history-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-history-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-history-en/finish.md b/tutorials/katacoda/command-history-en/finish.md deleted file mode 100644 index 0f6fd0b23e4..00000000000 --- a/tutorials/katacoda/command-history-en/finish.md +++ /dev/null @@ -1,8 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `history`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) - diff --git a/tutorials/katacoda/command-history-en/history.md b/tutorials/katacoda/command-history-en/history.md deleted file mode 100644 index 3d5c21baae0..00000000000 --- a/tutorials/katacoda/command-history-en/history.md +++ /dev/null @@ -1,35 +0,0 @@ - -Use `history` to view command history - -`history`{{execute T2}} - -## Usage - -`history -h`{{execute T2}} - -```bash -[arthas@48]$ history -h - USAGE: - history [-c] [-h] [n] - - SUMMARY: - Display command history - - EXAMPLES: - history - history -c - history 5 - - OPTIONS: - -c, --clear clear history - -h, --help this help - how many history commands to display -``` - -## Set number of history commands to display - -`history 5`{{execute T2}} - -## Clear history - -`history -c`{{execute T2}} diff --git a/tutorials/katacoda/command-history-en/index.json b/tutorials/katacoda/command-history-en/index.json deleted file mode 100644 index 049e581a01f..00000000000 --- a/tutorials/katacoda/command-history-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas history", - "description": "Arthas history", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "history command", - "text": "history.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-history-en/intro.md b/tutorials/katacoda/command-history-en/intro.md deleted file mode 100644 index 2d079bd4042..00000000000 --- a/tutorials/katacoda/command-history-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of history. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-jad-cn/arthas-boot.md b/tutorials/katacoda/command-jad-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-jad-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jad-cn/arthas-demo.md b/tutorials/katacoda/command-jad-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-jad-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-jad-cn/finish.md b/tutorials/katacoda/command-jad-cn/finish.md deleted file mode 100644 index a24af6c9072..00000000000 --- a/tutorials/katacoda/command-jad-cn/finish.md +++ /dev/null @@ -1,12 +0,0 @@ - -在“heapdump”中,我们演示了了Arthas的heapdump命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) - diff --git a/tutorials/katacoda/command-jad-cn/index.json b/tutorials/katacoda/command-jad-cn/index.json deleted file mode 100644 index 6ec26f93707..00000000000 --- a/tutorials/katacoda/command-jad-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas jad命令", - "description": "Arthas jad命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jad命令", - "text": "jad.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-jad-cn/intro.md b/tutorials/katacoda/command-jad-cn/intro.md deleted file mode 100644 index 65ee6e983a7..00000000000 --- a/tutorials/katacoda/command-jad-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示jad命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-jad-cn/jad.md b/tutorials/katacoda/command-jad-cn/jad.md deleted file mode 100644 index 98e0206eaf0..00000000000 --- a/tutorials/katacoda/command-jad-cn/jad.md +++ /dev/null @@ -1,156 +0,0 @@ - -> 反编译指定已加载类的源码 - -`jad` 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑; - -* 在 Arthas Console 上,反编译出来的源码是带语法高亮的,阅读更方便 -* 当然,反编译出来的 java 代码可能会存在语法错误,但不影响你进行阅读理解 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|`[c:]`|类所属 ClassLoader 的 hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|[E]|开启正则表达式匹配,默认为通配符匹配| - -### 使用参考 - -#### 编译`java.lang.String` - -`jad java.lang.String`{{execute T2}} - -```java -$ jad java.lang.String - -ClassLoader: - -Location: - - -/* -* Decompiled with CFR 0_132. -*/ -package java.lang; - -import java.io.ObjectStreamField; -... -public final class String -implements Serializable, -Comparable, -CharSequence { - private final char[] value; - private int hash; - private static final long serialVersionUID = -6849794470754667710L; - private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; - public static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator(); - - public String(byte[] arrby, int n, int n2) { - String.checkBounds(arrby, n, n2); - this.value = StringCoding.decode(arrby, n, n2); - } -... -``` - -#### 反编译时只显示源代码 - -默认情况下,反编译结果里会带有`ClassLoader`信息,通过`--source-only`选项,可以只打印源代码。方便和`mc`/`redefine`命令结合使用。 - -`jad --source-only java.lang.String`{{execute T2}} - -``` -$ jad --source-only java.lang.String -... - @Override - public int compare(String string, String string2) { - int n = string.length(); - int n2 = string2.length(); - int n3 = Math.min(n, n2); - for (int i = 0; i < n3; ++i) { - char c; - char c2 = string.charAt(i); - if (c2 == (c = string2.charAt(i)) || (c2 = Character.toUpperCase(c2)) == (c = Character.toUpperCase(c)) || (c2 = Character.toLowerCase(c2)) == (c = Character.toLowerCase(c))) continue; - return c2 - c; - } - return n - n2; - } - - private Object readResolve() { - return String.CASE_INSENSITIVE_ORDER; - } - } -} -``` - -#### 反编译指定的函数 - -`jad java.lang.String toString`{{execute T2}} - -```java -$ jad java.lang.String toString - -ClassLoader: - -Location: - - -@Override -public String toString() { - return this; -} - -Affect(row-cnt:2) cost in 407 ms. -``` - -#### 反编译时指定ClassLoader - -> 当有多个 `ClassLoader` 都加载了这个类时,`jad` 命令会输出对应 `ClassLoader` 实例的 `hashcode`,然后你只需要重新执行 `jad` 命令,并使用参数 `-c ` 就可以反编译指定 ClassLoader 加载的那个类了; - -例如: - -```java -$ jad org.apache.log4j.Logger - -Found more than one class for: org.apache.log4j.Logger, Please use jad -c hashcode org.apache.log4j.Logger -HASHCODE CLASSLOADER -69dcaba4 +-monitor's ModuleClassLoader -6e51ad67 +-java.net.URLClassLoader@6e51ad67 - +-sun.misc.Launcher$AppClassLoader@6951a712 - +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 -2bdd9114 +-pandora-qos-service's ModuleClassLoader -4c0df5f8 +-pandora-framework's ModuleClassLoader - -Affect(row-cnt:0) cost in 38 ms. -``` - -```java -$ jad org.apache.log4j.Logger -c 69dcaba4 - -ClassLoader: -+-monitor's ModuleClassLoader - -Location: -/Users/admin/app/log4j-1.2.14.jar - -package org.apache.log4j; - -import org.apache.log4j.spi.*; - -public class Logger extends Category -{ - private static final String FQCN; - - protected Logger(String name) - { - super(name); - } - -... - -Affect(row-cnt:1) cost in 190 ms. -``` - -对于只有唯一实例的ClassLoader还可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 diff --git a/tutorials/katacoda/command-jad-en/arthas-boot.md b/tutorials/katacoda/command-jad-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-jad-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jad-en/arthas-demo.md b/tutorials/katacoda/command-jad-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-jad-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-jad-en/finish.md b/tutorials/katacoda/command-jad-en/finish.md deleted file mode 100644 index 9697c6917ae..00000000000 --- a/tutorials/katacoda/command-jad-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `heapdump Tutorial` demonstrates the usage of heapdump. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-jad-en/index.json b/tutorials/katacoda/command-jad-en/index.json deleted file mode 100644 index c4b2718337c..00000000000 --- a/tutorials/katacoda/command-jad-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas jad Command", - "description": "Arthas jad Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jad Command", - "text": "jad.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-jad-en/intro.md b/tutorials/katacoda/command-jad-en/intro.md deleted file mode 100644 index 65207326b14..00000000000 --- a/tutorials/katacoda/command-jad-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of jad. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-jad-en/jad.md b/tutorials/katacoda/command-jad-en/jad.md deleted file mode 100644 index 12470aaf8d7..00000000000 --- a/tutorials/katacoda/command-jad-en/jad.md +++ /dev/null @@ -1,156 +0,0 @@ - -> Decompile the specified classes. - -`jad` helps to decompile the byte code running in JVM to the source code to assist you to understand the logic behind better. - -* The decompiled code is syntax highlighted for better readability in Arthas console. -* It is possible that there's grammar error in the decompiled code, but it should not affect your interpretation. - -### Options - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|`[c:]`|hashcode of the class loader that loads the class| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[E]`|turn on regex match while the default is wildcard match| - -### Usage - -#### Decompile `java.lang.String` - -`jad java.lang.String`{{execute T2}} - -```java -$ jad java.lang.String - -ClassLoader: - -Location: - - -/* -* Decompiled with CFR 0_132. -*/ -package java.lang; - -import java.io.ObjectStreamField; -... -public final class String -implements Serializable, -Comparable, -CharSequence { - private final char[] value; - private int hash; - private static final long serialVersionUID = -6849794470754667710L; - private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; - public static final Comparator CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator(); - - public String(byte[] arrby, int n, int n2) { - String.checkBounds(arrby, n, n2); - this.value = StringCoding.decode(arrby, n, n2); - } -... -``` - -#### Print source only - -By default, the decompile result will have the `ClassLoader` information. With the `--source-only` option, you can print only the source code. Conveniently used with the [mc](mc.md)/[redefine](redefine.md) commands. - -`jad --source-only java.lang.String`{{execute T2}} - -``` -$ jad --source-only java.lang.String -... - @Override - public int compare(String string, String string2) { - int n = string.length(); - int n2 = string2.length(); - int n3 = Math.min(n, n2); - for (int i = 0; i < n3; ++i) { - char c; - char c2 = string.charAt(i); - if (c2 == (c = string2.charAt(i)) || (c2 = Character.toUpperCase(c2)) == (c = Character.toUpperCase(c)) || (c2 = Character.toLowerCase(c2)) == (c = Character.toLowerCase(c))) continue; - return c2 - c; - } - return n - n2; - } - - private Object readResolve() { - return String.CASE_INSENSITIVE_ORDER; - } - } -} -``` - -#### Decompile the specified method - -`jad java.lang.String toString`{{execute T2}} - -```java -$ jad java.lang.String toString - -ClassLoader: - -Location: - - -@Override -public String toString() { - return this; -} - -Affect(row-cnt:2) cost in 407 ms. -``` - -#### Decompile with specified classLoader - -> If the target class is loaded by multiple classloaders, `jad` outputs the `hashcode` of the corresponding classloaders, then you can re-run `jad` and specify `-c ` to decompile the target class from the specified classloader. - -Examples: - -```java -$ jad org.apache.log4j.Logger - -Found more than one class for: org.apache.log4j.Logger, Please use jad -c hashcode org.apache.log4j.Logger -HASHCODE CLASSLOADER -69dcaba4 +-monitor's ModuleClassLoader -6e51ad67 +-java.net.URLClassLoader@6e51ad67 - +-sun.misc.Launcher$AppClassLoader@6951a712 - +-sun.misc.Launcher$ExtClassLoader@6fafc4c2 -2bdd9114 +-pandora-qos-service's ModuleClassLoader -4c0df5f8 +-pandora-framework's ModuleClassLoader - -Affect(row-cnt:0) cost in 38 ms. -``` - -```java -$ jad org.apache.log4j.Logger -c 69dcaba4 - -ClassLoader: -+-monitor's ModuleClassLoader - -Location: -/Users/admin/app/log4j-1.2.14.jar - -package org.apache.log4j; - -import org.apache.log4j.spi.*; - -public class Logger extends Category -{ - private static final String FQCN; - - protected Logger(String name) - { - super(name); - } - -... - -Affect(row-cnt:1) cost in 190 ms. -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. diff --git a/tutorials/katacoda/command-jfr-cn/arthas-boot.md b/tutorials/katacoda/command-jfr-cn/arthas-boot.md deleted file mode 100644 index bd42b144e6d..00000000000 --- a/tutorials/katacoda/command-jfr-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jfr-cn/arthas-demo.md b/tutorials/katacoda/command-jfr-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-jfr-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-jfr-cn/finish.md b/tutorials/katacoda/command-jfr-cn/finish.md deleted file mode 100644 index d1e6fbadf04..00000000000 --- a/tutorials/katacoda/command-jfr-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“jfr”中,我们演示了了Arthas的jfr命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-jfr-cn/index.json b/tutorials/katacoda/command-jfr-cn/index.json deleted file mode 100644 index 94d0f78fedd..00000000000 --- a/tutorials/katacoda/command-jfr-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas jfr命令", - "description": "Arthas jfr命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jfr命令", - "text": "jfr.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-jfr-cn/intro.md b/tutorials/katacoda/command-jfr-cn/intro.md deleted file mode 100644 index 4f0c42a14ce..00000000000 --- a/tutorials/katacoda/command-jfr-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示jfr命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-jfr-cn/jfr.md b/tutorials/katacoda/command-jfr-cn/jfr.md deleted file mode 100644 index 430b32f6f47..00000000000 --- a/tutorials/katacoda/command-jfr-cn/jfr.md +++ /dev/null @@ -1,126 +0,0 @@ -::: tip -Java Flight Recorder (JFR) 是一种用于收集有关正在运行的 Java 应用程序的诊断和分析数据的工具。它集成到 Java 虚拟机 (JVM) 中,几乎不会造成性能开销,因此即使在负载较重的生产环境中也可以使用。 -::: - -`jfr` 命令支持在程序动态运行过程中开启和关闭JFR记录。 记录收集有关event的数据。事件在特定时间点发生在 JVM 或 Java 应用程序中。每个事件都有一个名称、一个时间戳和一个可选的有效负载。负载是与事件相关的数据,例如 CPU 使用率、事件前后的 Java 堆大小、锁持有者的线程 ID 等。 - -`jfr` 命令基本运行结构是 `jfr cmd [actionArg]` -> 注意: JDK8的8u262 版本之后才支持 jfr -## 参数说明 - -| 参数名称 | 参数说明 | -| ------------: | :----------------------------------------------------------- | -| _cmd_ | 要执行的命令,支持的命令【start,status,dump,stop】 | -| _actionArg_ | 属性名模式 | -| [n:] | 记录名称 | -| [r:] | 记录id值 | -| [dumponexit:] | 程序退出时,是否要dump出 .jfr文件,默认为false | -| [d:] | 延迟多久后启动 JFR 记录,支持带单位配置,eg: 60s,2m,5h,3d. 不带单位就是秒,默认无延迟 | -| [duration:] | JFR 记录持续时间,支持单位配置,不带单位就是秒,默认一直记录 | -| [s:] | 采集 Event 的详细配置文件,默认是default.jfc 位于 `$JAVA_HOME/lib/jfr/default.jfc` | -| [f:] | 将输出转储到指定路径 | -| [maxage:] | 缓冲区数据最大文件记录保存时间,支持单位配置,不带单位就是秒,默认是不限制 | -| [maxsize:] | 缓冲区的最大文件大小,支持单位配置, 不带单位是字节,m或者M代表MB,g或者G代表GB。 | -| [state:] | jfr记录状态 | - -## 启动 JFR 记录 - -`jfr start`{{execute T2}} - -``` -$ jfr start -Started recording 1. No limit specified, using maxsize=250MB as default. -``` - -::: tip -开启的是默认参数的jfr记录 -::: - -启动jfr记录,指定记录名,记录持续时间,记录文件保存路径。 - -`jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr`{{execute T2}} - -``` -$ jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr -Started recording 2. The result will be written to: -/tmp/myRecording.jfr -``` - -## 查看 JFR 记录状态 - -默认是查看所有JFR记录信息 - -`jfr status`{{execute T2}} - -```bash -$ jfr status -Recording: recording=1 name=Recording-1 (running) -Recording: recording=2 name=myRecording duration=PT1M (closed) -``` - -查看指定记录id的记录信息 - -`jfr status -r 1`{{execute T2}} - -```bash -$ jfr status -r 1 -Recording: recording=1 name=Recording-1 (running) -``` - -查看指定状态的记录信息 - -`jfr status --state closed`{{execute T2}} - -```bash -$ jfr status --state closed -Recording: recording=2 name=myRecording duration=PT1M (closed) -``` - -## dump jfr 记录 - -指定记录输出路径 - -`$ jfr dump -r 1 -f /tmp/myRecording1.jfr`{{execute T2}} - -```bash -$ jfr dump -r 1 -f /tmp/myRecording1.jfr -Dump recording 1, The result will be written to: -/tmp/myRecording1.jfr -``` - -不指定文件输出路径,默认是保存到`arthas-output`目录下 - -`jfr dump -r 1`{{execute T2}} - -```bash -$ jfr dump -r 1 -Dump recording 1, The result will be written to: -/tmp/test/arthas-output/20220819-200915.jfr -``` - -## 停止 jfr 记录 - -不指定记录输出路径,默认是保存到`arthas-output`目录下 - -`jfr stop -r 1`{{execute T2}} - -```bash -$ jfr stop -r 1 -Stop recording 1, The result will be written to: -/tmp/test/arthas-output/20220819-202049.jfr -``` - -> 注意一条记录只能停止一次。 - -也可以指定记录输出路径。 - -## 通过浏览器查看 arthas-output 下面JFR记录的结果 - -默认情况下,arthas 使用 8563 端口,则可以打开: [http://localhost:8563/arthas-output/](http://localhost:8563/arthas-output/) 查看到`arthas-output`目录下面的 JFR 记录结果: - -![](/images/arthas-output-recording.png) - - -生成的结果可以用支持 jfr 格式的工具来查看。比如: - -- JDK Mission Control : https://github.com/openjdk/jmc diff --git a/tutorials/katacoda/command-jfr-en/arthas-boot.md b/tutorials/katacoda/command-jfr-en/arthas-boot.md deleted file mode 100644 index 1726fe72727..00000000000 --- a/tutorials/katacoda/command-jfr-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jfr-en/arthas-demo.md b/tutorials/katacoda/command-jfr-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-jfr-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-jfr-en/finish.md b/tutorials/katacoda/command-jfr-en/finish.md deleted file mode 100644 index 25d62564d96..00000000000 --- a/tutorials/katacoda/command-jfr-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `jfr Tutorial` demonstrates the usage of profiler. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-jfr-en/index.json b/tutorials/katacoda/command-jfr-en/index.json deleted file mode 100644 index d6065c43b65..00000000000 --- a/tutorials/katacoda/command-jfr-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas jfr Command", - "description": "Arthas jfr Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jfr Command", - "text": "jfr.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-jfr-en/intro.md b/tutorials/katacoda/command-jfr-en/intro.md deleted file mode 100644 index 948575e6f2a..00000000000 --- a/tutorials/katacoda/command-jfr-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of jfr. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-jfr-en/jfr.md b/tutorials/katacoda/command-jfr-en/jfr.md deleted file mode 100644 index b4ea7a01c9f..00000000000 --- a/tutorials/katacoda/command-jfr-en/jfr.md +++ /dev/null @@ -1,126 +0,0 @@ -::: tip -Java Flight Recorder (JFR) is a tool for collecting diagnostic and profiling data about a running Java application. It is integrated into the Java Virtual Machine (JVM) and causes almost no performance overhead, so it can be used even in heavily loaded production environments. -::: - -The `jfr` command supports starting and stopping JFR recordings during dynamic program running. Recording collects data about *events*. Events occur in the JVM or the Java application at a specific point in time. Each event has a name, a time stamp, and an optional *payload*. The payload is the data associated with an event, for example, the CPU usage, the Java heap size before and after the event, the thread ID of the lock holder, and so on. - -The basic usage of the `jfr` command is`jfr cmd [actionArg]` -> Note: jfr is supported only after the 8u262 version of jdk8 -### Supported Options - -| Name | Specification | -| ------------: | :----------------------------------------------------------- | -| _cmd_ | Command to execute, support【start,status,dump,stop】 | -| _actionArg_ | Attribute name pattern | -| [n:] | Name of recording | -| [r:] | Recording id | -| [dumponexit:] | When the program exits, whether to dump the .jfr file. (boolean false) | -| [d:] | Duration of recording, i.e. 60s, 2m, 5h, 3d. default no delay | -| [duration:] | Duration of recording, default forever. | -| [s:] | Server-side template, The default is default.jfc located at `$JAVA_HOME/lib/jfr/default.jfc` | -| [f:] | Resulting recording filename | -| [maxage:] | Maximum age of buffer data | -| [maxsize:] | Maximum size of buffers in bytes | -| [state:] | Recording state | - -## Start jfr recording - -`jfr start`{{execute T2}} - -``` -$ jfr start -Started recording 1. No limit specified, using maxsize=250MB as default. -``` - -::: tip -The default JFR record is started. -::: - -Start the JFR recording, specify the recording name, duration, file saving path. - -`jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr`{{execute T2}} - -``` -$ jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr -Started recording 2. The result will be written to: -/tmp/myRecording.jfr -``` - -##View jfr recordings status - -The default is to view all JFR recordings. - -`jfr status`{{execute T2}} - -```bash -$ jfr status -Recording: recording=1 name=Recording-1 (running) -Recording: recording=2 name=myRecording duration=PT1M (closed) -``` - -View the records of the specified recording ID. - -`jfr status -r 1`{{execute T2}} - -```bash -$ jfr status -r 1 -Recording: recording=1 name=Recording-1 (running) -``` - -View recordings in a specified state. - -`jfr status --state closed`{{execute T2}} - -```bash -$ jfr status --state closed -Recording: recording=2 name=myRecording duration=PT1M (closed) -``` - -## dump jfr recording - -Specifies the record output path. - -`$ jfr dump -r 1 -f /tmp/myRecording1.jfr`{{execute T2}} - -```bash -$ jfr dump -r 1 -f /tmp/myRecording1.jfr -Dump recording 1, The result will be written to: -/tmp/myRecording1.jfr -``` - -The file output path is not specified. By default, it is saved to the `arthas-output` directory - -`jfr dump -r 1`{{execute T2}} - -```bash -$ jfr dump -r 1 -Dump recording 1, The result will be written to: -/tmp/test/arthas-output/20220819-200915.jfr -``` - -## Stop jfr recording - -No recording output path is specified, default is saved to `arthas-output` directory. - -`jfr stop -r 1`{{execute T2}} - -```bash -$ jfr stop -r 1 -Stop recording 1, The result will be written to: -/tmp/test/arthas-output/20220819-202049.jfr -``` - -> notice: A recording can only be stopped once. - -You can also specify the record output path. - -## View JFR recording results under arthas-output via browser - -By default, arthas uses http port 8563 , which can be opened:[http://localhost:8563/arthas-output/](http://localhost:8563/arthas-output/) View the `arthas-output` directory below JFR recording results: - -![](/images/arthas-output-recording.png) - - -The resulting results can be viewed with tools that support the JFR format. Such as: - -- JDK Mission Control : https://github.com/openjdk/jmc diff --git a/tutorials/katacoda/command-jvm-cn/arthas-boot.md b/tutorials/katacoda/command-jvm-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-jvm-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jvm-cn/arthas-demo.md b/tutorials/katacoda/command-jvm-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-jvm-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-jvm-cn/finish.md b/tutorials/katacoda/command-jvm-cn/finish.md deleted file mode 100644 index 7d4a416fb0d..00000000000 --- a/tutorials/katacoda/command-jvm-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“jvm”中,我们演示了了Arthas的jvm命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-jvm-cn/index.json b/tutorials/katacoda/command-jvm-cn/index.json deleted file mode 100644 index 333ebf3cf48..00000000000 --- a/tutorials/katacoda/command-jvm-cn/index.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Arthas jvm命令", - "description": "Arthas jvm命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jvm命令", - "text": "jvm.md" - }, - { - "title": "jvm使用参考", - "text": "jvm-usage.md" - }, - { - "title": "jvm使用参考", - "text": "notes-on-column-headers.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-jvm-cn/intro.md b/tutorials/katacoda/command-jvm-cn/intro.md deleted file mode 100644 index 6052cadf7db..00000000000 --- a/tutorials/katacoda/command-jvm-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示jvm命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-jvm-cn/jvm-usage.md b/tutorials/katacoda/command-jvm-cn/jvm-usage.md deleted file mode 100644 index 3d9090b1121..00000000000 --- a/tutorials/katacoda/command-jvm-cn/jvm-usage.md +++ /dev/null @@ -1,103 +0,0 @@ - -```bash -$ jvm -RUNTIME --------------------------------------------------------------------------------------------------------------- - MACHINE-NAME 37@ff267334bb65 - JVM-START-TIME 2020-07-23 07:50:36 - MANAGEMENT-SPEC-VERSION 1.2 - SPEC-NAME Java Virtual Machine Specification - SPEC-VENDOR Oracle Corporation - SPEC-VERSION 1.8 - VM-NAME Java HotSpot(TM) 64-Bit Server VM - VM-VENDOR Oracle Corporation - VM-VERSION 25.201-b09 - INPUT-ARGUMENTS [] - CLASS-PATH demo-arthas-spring-boot.jar - BOOT-CLASS-PATH /usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/j - re/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/sunrsasign.jar:/usr/lib/jvm/ - java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/us - r/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/l - ib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/classes - LIBRARY-PATH /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib - --------------------------------------------------------------------------------------------------------------- - CLASS-LOADING --------------------------------------------------------------------------------------------------------------- - LOADED-CLASS-COUNT 7529 - TOTAL-LOADED-CLASS-COUNT 7529 - UNLOADED-CLASS-COUNT 0 - IS-VERBOSE false - --------------------------------------------------------------------------------------------------------------- - COMPILATION --------------------------------------------------------------------------------------------------------------- - NAME HotSpot 64-Bit Tiered Compilers - TOTAL-COMPILE-TIME 14921(ms) - --------------------------------------------------------------------------------------------------------------- - GARBAGE-COLLECTORS --------------------------------------------------------------------------------------------------------------- - PS Scavenge name : PS Scavenge - [count/time (ms)] collectionCount : 7 - collectionTime : 68 - - PS MarkSweep name : PS MarkSweep - [count/time (ms)] collectionCount : 1 - collectionTime : 47 - --------------------------------------------------------------------------------------------------------------- - MEMORY-MANAGERS --------------------------------------------------------------------------------------------------------------- - CodeCacheManager Code Cache - - Metaspace Manager Metaspace - Compressed Class Space - - Copy Eden Space - Survivor Space - - MarkSweepCompact Eden Space - Survivor Space - Tenured Gen - - --------------------------------------------------------------------------------------------------------------- - MEMORY --------------------------------------------------------------------------------------------------------------- - HEAP-MEMORY-USAGE init : 268435456(256.0 MiB) - [memory in bytes] used : 18039504(17.2 MiB) - committed : 181403648(173.0 MiB) - max : 3817865216(3.6 GiB) - - NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB) - [memory in bytes] used : 33926216(32.4 MiB) - committed : 35176448(33.5 MiB) - max : -1(-1 B) - --------------------------------------------------------------------------------------------------------------- - OPERATING-SYSTEM --------------------------------------------------------------------------------------------------------------- - OS Linux - ARCH amd64 - PROCESSORS-COUNT 3 - LOAD-AVERAGE 29.53 - VERSION 4.15.0-52-generic - --------------------------------------------------------------------------------------------------------------- - THREAD --------------------------------------------------------------------------------------------------------------- - COUNT 30 - DAEMON-COUNT 24 - PEAK-COUNT 31 - STARTED-COUNT 36 - DEADLOCK-COUNT 0 - --------------------------------------------------------------------------------------------------------------- - FILE-DESCRIPTOR --------------------------------------------------------------------------------------------------------------- - MAX-FILE-DESCRIPTOR-COUNT 1048576 - OPEN-FILE-DESCRIPTOR-COUNT 100 -Affect(row-cnt:0) cost in 88 ms. -``` - diff --git a/tutorials/katacoda/command-jvm-cn/jvm.md b/tutorials/katacoda/command-jvm-cn/jvm.md deleted file mode 100644 index 45a29c818be..00000000000 --- a/tutorials/katacoda/command-jvm-cn/jvm.md +++ /dev/null @@ -1,13 +0,0 @@ - -`jvm`{{execute T2}} 命令可以查看当前JVM信息。 - -## 查找Java应用的classpath - -`jvm | grep PATH`{{execute T2}} - -```bash -[arthas@41064]$ jvm | grep PATH - CLASS-PATH packaging/target/arthas-bin/math-game.jar - BOOT-CLASS-PATH /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/resources.jar:/Librar - LIBRARY-PATH /Users/gongdewei/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extens -``` diff --git a/tutorials/katacoda/command-jvm-cn/notes-on-column-headers.md b/tutorials/katacoda/command-jvm-cn/notes-on-column-headers.md deleted file mode 100644 index a2749ead849..00000000000 --- a/tutorials/katacoda/command-jvm-cn/notes-on-column-headers.md +++ /dev/null @@ -1,18 +0,0 @@ - -### THREAD相关 - -* `COUNT`: JVM当前活跃的线程数 - -* `DAEMON-COUNT`: JVM当前活跃的守护线程数 - -* `PEAK-COUNT`: 从JVM启动开始曾经活着的最大线程数 - -* `STARTED-COUNT`: 从JVM启动开始总共启动过的线程次数 - -* `DEADLOCK-COUNT`: JVM当前死锁的线程数 - -### 文件描述符相关 - -* `MAX-FILE-DESCRIPTOR-COUNT`:JVM进程最大可以打开的文件描述符数 - -* `OPEN-FILE-DESCRIPTOR-COUNT`:JVM当前打开的文件描述符数 diff --git a/tutorials/katacoda/command-jvm-en/arthas-boot.md b/tutorials/katacoda/command-jvm-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-jvm-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-jvm-en/arthas-demo.md b/tutorials/katacoda/command-jvm-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-jvm-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-jvm-en/finish.md b/tutorials/katacoda/command-jvm-en/finish.md deleted file mode 100644 index 89b511c616a..00000000000 --- a/tutorials/katacoda/command-jvm-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `jvm Tutorial` demonstrates the usage of jvm. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-jvm-en/index.json b/tutorials/katacoda/command-jvm-en/index.json deleted file mode 100644 index b5c9bac2ad9..00000000000 --- a/tutorials/katacoda/command-jvm-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas jvm Command", - "description": "Arthas jvm Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "jvm Command", - "text": "jvm.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-jvm-en/intro.md b/tutorials/katacoda/command-jvm-en/intro.md deleted file mode 100644 index 2972a06ba0f..00000000000 --- a/tutorials/katacoda/command-jvm-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of mbean. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-jvm-en/jvm-usage.md b/tutorials/katacoda/command-jvm-en/jvm-usage.md deleted file mode 100644 index 7d160fa9f18..00000000000 --- a/tutorials/katacoda/command-jvm-en/jvm-usage.md +++ /dev/null @@ -1,102 +0,0 @@ - -```bash -$ jvm -RUNTIME --------------------------------------------------------------------------------------------------------------- - MACHINE-NAME 37@ff267334bb65 - JVM-START-TIME 2020-07-23 07:50:36 - MANAGEMENT-SPEC-VERSION 1.2 - SPEC-NAME Java Virtual Machine Specification - SPEC-VENDOR Oracle Corporation - SPEC-VERSION 1.8 - VM-NAME Java HotSpot(TM) 64-Bit Server VM - VM-VENDOR Oracle Corporation - VM-VERSION 25.201-b09 - INPUT-ARGUMENTS [] - CLASS-PATH demo-arthas-spring-boot.jar - BOOT-CLASS-PATH /usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/j - re/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/sunrsasign.jar:/usr/lib/jvm/ - java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/us - r/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/l - ib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/classes - LIBRARY-PATH /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib - --------------------------------------------------------------------------------------------------------------- - CLASS-LOADING --------------------------------------------------------------------------------------------------------------- - LOADED-CLASS-COUNT 7529 - TOTAL-LOADED-CLASS-COUNT 7529 - UNLOADED-CLASS-COUNT 0 - IS-VERBOSE false - --------------------------------------------------------------------------------------------------------------- - COMPILATION --------------------------------------------------------------------------------------------------------------- - NAME HotSpot 64-Bit Tiered Compilers - TOTAL-COMPILE-TIME 14921(ms) - --------------------------------------------------------------------------------------------------------------- - GARBAGE-COLLECTORS --------------------------------------------------------------------------------------------------------------- - PS Scavenge name : PS Scavenge - [count/time (ms)] collectionCount : 7 - collectionTime : 68 - - PS MarkSweep name : PS MarkSweep - [count/time (ms)] collectionCount : 1 - collectionTime : 47 - --------------------------------------------------------------------------------------------------------------- - MEMORY-MANAGERS --------------------------------------------------------------------------------------------------------------- - CodeCacheManager Code Cache - - Metaspace Manager Metaspace - Compressed Class Space - - Copy Eden Space - Survivor Space - - MarkSweepCompact Eden Space - Survivor Space - Tenured Gen - - --------------------------------------------------------------------------------------------------------------- - MEMORY --------------------------------------------------------------------------------------------------------------- - HEAP-MEMORY-USAGE init : 268435456(256.0 MiB) - [memory in bytes] used : 18039504(17.2 MiB) - committed : 181403648(173.0 MiB) - max : 3817865216(3.6 GiB) - - NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB) - [memory in bytes] used : 33926216(32.4 MiB) - committed : 35176448(33.5 MiB) - max : -1(-1 B) - --------------------------------------------------------------------------------------------------------------- - OPERATING-SYSTEM --------------------------------------------------------------------------------------------------------------- - OS Linux - ARCH amd64 - PROCESSORS-COUNT 3 - LOAD-AVERAGE 29.53 - VERSION 4.15.0-52-generic - --------------------------------------------------------------------------------------------------------------- - THREAD --------------------------------------------------------------------------------------------------------------- - COUNT 30 - DAEMON-COUNT 24 - PEAK-COUNT 31 - STARTED-COUNT 36 - DEADLOCK-COUNT 0 - --------------------------------------------------------------------------------------------------------------- - FILE-DESCRIPTOR --------------------------------------------------------------------------------------------------------------- - MAX-FILE-DESCRIPTOR-COUNT 1048576 - OPEN-FILE-DESCRIPTOR-COUNT 100 -Affect(row-cnt:0) cost in 88 ms. -``` diff --git a/tutorials/katacoda/command-jvm-en/jvm.md b/tutorials/katacoda/command-jvm-en/jvm.md deleted file mode 100644 index 4600a86007d..00000000000 --- a/tutorials/katacoda/command-jvm-en/jvm.md +++ /dev/null @@ -1,13 +0,0 @@ - -The `jvm`{{execute T2}} command allows you to check the current JVM’s info. - -## Search for current java application's classpath - -`jvm | grep PATH`{{execute T2}} - -```bash -[arthas@41064]$ jvm | grep PATH - CLASS-PATH packaging/target/arthas-bin/math-game.jar - BOOT-CLASS-PATH /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/resources.jar:/Librar - LIBRARY-PATH /Users/gongdewei/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extens -``` diff --git a/tutorials/katacoda/command-jvm-en/notes-on-column-headers.md b/tutorials/katacoda/command-jvm-en/notes-on-column-headers.md deleted file mode 100644 index c13a2553b45..00000000000 --- a/tutorials/katacoda/command-jvm-en/notes-on-column-headers.md +++ /dev/null @@ -1,18 +0,0 @@ - -### Thread related - -* `COUNT`: the count of active threads - -* `DAEMON-COUNT`: the count of active daemon threads - -* `PEAK-COUNT`: the maximum count of the live threads since JVM starts - -* `STARTED-COUNT`: the total count of the created threads since JVM starts - -* `DEADLOCK-COUNT`: the count of deadlocked threads - -### File descriptor related - -* `MAX-FILE-DESCRIPTOR-COUNT`:the count of max file descriptor JVM process can open - -* `OPEN-FILE-DESCRIPTOR-COUNT`:the current count of file descriptor JVM process open diff --git a/tutorials/katacoda/command-keymap-cn/arthas-boot.md b/tutorials/katacoda/command-keymap-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-keymap-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-keymap-cn/arthas-demo.md b/tutorials/katacoda/command-keymap-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-keymap-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-keymap-cn/custom-shortcuts.md b/tutorials/katacoda/command-keymap-cn/custom-shortcuts.md deleted file mode 100644 index da528bad4ed..00000000000 --- a/tutorials/katacoda/command-keymap-cn/custom-shortcuts.md +++ /dev/null @@ -1,63 +0,0 @@ - -首先退出Arthas, 在当前用户目录下新建`$USER_HOME/.arthas/conf/inputrc`文件,可加入自定义配置。 - -`exit`{{execute interrupt}} - -`mkdir -p /root/.arthas/conf/`{{execute T2}} - -假设我是vim的重度用户,我要把`ctrl+h`设置为光标向前一个字符,则首先拷贝默认配置: - -```text -"\C-a": beginning-of-line -"\C-e": end-of-line -"\C-f": forward-word -"\C-b": backward-word -"\e[D": backward-char -"\e[C": forward-char -"\e[B": next-history -"\e[A": previous-history -"\C-h": backward-delete-char -"\C-?": backward-delete-char -"\C-u": undo -"\C-d": delete-char -"\C-k": kill-line -"\C-i": complete -"\C-j": accept-line -"\C-m": accept-line -"\C-w": backward-delete-word -"\C-x\e[3~": backward-kill-line -"\e\C-?": backward-kill-word -``` - -然后把`"\C-h": backward-delete-char`换成`"\C-h": backward-char`,修改后的keymap配置即以下内容: - -`cat > /root/.arthas/conf/inputrc < /root/.arthas/conf/inputrc <` ,然后手动执行下面所述命令: - -#### 查看指定classloader的logger信息 - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ logger -c 5674cd4d -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -```bash -[arthas@2062]$ logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -name ROOT - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level INFO - effectiveLevel INFO - additivity true - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ - appenders name CONSOLE - class ch.qos.logback.core.ConsoleAppender - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - target System.out -... -``` - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -#### 更新logger level - -`logger --name ROOT --level debug`{{execute T2}} - -```bash -[arthas@2062]$ logger --name ROOT --level debug -update logger level success. -``` - -注意:在教程中执行会提示错误,需要指定classloader - -#### 指定classloader更新 logger level - -默认情况下,logger命令会在SystemClassloader下执行,如果应用是传统的`war`应用,或者spring boot fat jar启动的应用,那么需要指定classloader。 - -可以先用 `sc -d yourClassName` 来查看具体的 classloader hashcode,然后在更新level时指定classloader: - -`logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --name ROOT --level debug`{{execute T2}} - -```bash -[arthas@2062]$ logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --name ROOT --level debug -``` - -#### 查看没有appender的logger的信息 - - -默认情况下,`logger`命令只打印有appender的logger的信息。如果想查看没有`appender`的logger的信息,可以加上参数`--include-no-appender`。 - -注意,通常输出结果会很长。 - -`logger --include-no-appender`{{execute T2}} - -```bash -[arthas@2062]$ logger --include-no-appender - name org.thymeleaf - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level null - effectiveLevel INFO - additivity false - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ - appenders name DEBUG_LEVEL_REMAPPER - class org.springframework.boot.logging.logback.LevelRemappingAppender - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d -... -``` diff --git a/tutorials/katacoda/command-logger-cn/start-demo.md b/tutorials/katacoda/command-logger-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-logger-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-logger-en/arthas-boot.md b/tutorials/katacoda/command-logger-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-logger-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-logger-en/finish.md b/tutorials/katacoda/command-logger-en/finish.md deleted file mode 100644 index 394c5148a80..00000000000 --- a/tutorials/katacoda/command-logger-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `logger Tutorial` demonstrates the usage of logger. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-logger-en/index.json b/tutorials/katacoda/command-logger-en/index.json deleted file mode 100644 index 5e8022520ba..00000000000 --- a/tutorials/katacoda/command-logger-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas logger Command", - "description": "Arthas logger Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "logger Command", - "text": "logger.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-logger-en/intro.md b/tutorials/katacoda/command-logger-en/intro.md deleted file mode 100644 index 7c8679567bd..00000000000 --- a/tutorials/katacoda/command-logger-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the the usage of logger. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-logger-en/logger.md b/tutorials/katacoda/command-logger-en/logger.md deleted file mode 100644 index 42549e1c696..00000000000 --- a/tutorials/katacoda/command-logger-en/logger.md +++ /dev/null @@ -1,134 +0,0 @@ - -Print the logger information, update the logger level - -### Usage - -#### Print the logger information - -`logger`{{execute T2}} - -```bash -[arthas@2062]$ logger - name ROOT - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level INFO - effectiveLevel INFO - additivity true - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ - appenders name CONSOLE - class ch.qos.logback.core.ConsoleAppender - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - target System.out -... -``` - -#### View logger information for the special name - -`logger -n org.springframework.web`{{execute T2}} - -```bash -[arthas@2062]$ logger -n org.springframework.web - name org.springframework.web - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level null - effectiveLevel INFO - additivity true - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ -``` - - -Please write down your classLoaderHash here, in the case here, it's `5674cd4d`. It will be used in the future steps. - -Note: Please replace `` with your classLoaderHash above, then execute the commands manually in the following steps: - -#### View logger information for the special classloader - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ logger -c 5674cd4d -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -`logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader`{{execute T2}} - -```bash -[arthas@2062]$ logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -name ROOT - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level INFO - effectiveLevel INFO - additivity true - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ - appenders name CONSOLE - class ch.qos.logback.core.ConsoleAppender - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - target System.out -... -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -#### Update logger level - -`logger --name ROOT --level debug`{{execute T2}} - -```bash -[arthas@2062]$ logger --name ROOT --level debug -update logger level success. -``` - -PS: Here it will come up with an error message in tutorial, we have to specify the classloader. - -#### Speecify classloader to update logger level - -By default,logger command will be executed under SystemClassloader, if the application is a traditional `war`, or using spring boot fat jar, then it needs to specify classloader。 - -You can first use `sc -d yourClassName` to check specified classloader hashcode,then specify classloader when updating logger level: - -`logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --name ROOT --level debug`{{execute T2}} - -```bash -[arthas@2062]$ logger --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --name ROOT --level debug -``` - -#### View the logger information without appenders - - -By default, the `logger` command only prints information about the logger with appenders. If you want to see information about loggers without `appender`, you can use the parameter `--include-no-appender`. - -Note that the output will usually be very long. - -`logger --include-no-appender`{{execute T2}} - -```bash -[arthas@2062]$ logger --include-no-appender - name org.thymeleaf - class ch.qos.logback.classic.Logger - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d - level null - effectiveLevel INFO - additivity false - codeSource jar:file:/home/scrapbook/tutorial/demo-arthas-spring-boot.jar!/BOOT-INF/lib/logback-classi - c-1.1.11.jar!/ - appenders name DEBUG_LEVEL_REMAPPER - class org.springframework.boot.logging.logback.LevelRemappingAppender - classLoader org.springframework.boot.loader.LaunchedURLClassLoader@5674cd4d - classLoaderHash 5674cd4d -... -``` diff --git a/tutorials/katacoda/command-logger-en/start-demo.md b/tutorials/katacoda/command-logger-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-logger-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-mbean-cn/arthas-boot.md b/tutorials/katacoda/command-mbean-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-mbean-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mbean-cn/arthas-demo.md b/tutorials/katacoda/command-mbean-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-mbean-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-mbean-cn/finish.md b/tutorials/katacoda/command-mbean-cn/finish.md deleted file mode 100644 index 7531f9acc03..00000000000 --- a/tutorials/katacoda/command-mbean-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“mbean”中,我们演示了了Arthas的mbean命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-mbean-cn/index.json b/tutorials/katacoda/command-mbean-cn/index.json deleted file mode 100644 index b5da48db224..00000000000 --- a/tutorials/katacoda/command-mbean-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas mbean命令", - "description": "Arthas mbean命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mbean命令", - "text": "mbean.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-mbean-cn/intro.md b/tutorials/katacoda/command-mbean-cn/intro.md deleted file mode 100644 index a60c370f222..00000000000 --- a/tutorials/katacoda/command-mbean-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示mbean命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-mbean-cn/mbean.md b/tutorials/katacoda/command-mbean-cn/mbean.md deleted file mode 100644 index 8d223cc017b..00000000000 --- a/tutorials/katacoda/command-mbean-cn/mbean.md +++ /dev/null @@ -1,57 +0,0 @@ - -查看 Mbean 的信息 - -这个命令可以便捷的查看或监控 Mbean 的属性信息。 - -### 参数说明 - -| 参数名称 | 参数说明 | -| ---- | ---- | -| name-pattern | 名称表达式匹配 | -| attribute-pattern | 属性名表达式匹配 | -| [m] | 查看元信息 | -| [i:] | 刷新属性值的时间间隔 (ms) | -| [n:] | 刷新属性值的次数 | -| [E] | 开启正则表达式匹配,默认为通配符匹配。仅对属性名有效 | - -## 使用参考 - -### 列出所有 Mbean 的名称 - -`mbean`{{execute T2}} - -### 查看 Mbean 的元信息 - -`mbean -m java.lang:type=Threading`{{execute T2}} - -### 查看mbean属性信息 - -`mbean java.lang:type=Threading `{{execute T2}} - -### mbean的name支持通配符匹配 - -`mbean java.lang:type=Th*`{{execute T2}} - -注意:ObjectName 的匹配规则与正常的通配符存在差异,详细参见:[javax.management.ObjectName](https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html?is-external=true) - -### 多属性名称的匹配 - -查看内存池: - -`mbean java.lang:name=*,type=MemoryPool`{{execute T2}} - -### 通配符匹配特定的属性字段 - -`mbean java.lang:type=Threading *Count`{{execute T2}} - -### 使用`-E`命令切换为正则匹配 - -`mbean -E java.lang:type=Threading PeakThreadCount|ThreadCount|DaemonThreadCount`{{execute T2}} - -查看内存池: - -`mbean -E java.lang:name=*,type=MemoryPool Name|Usage|Type | grep " HEAP" -A3 -B1`{{execute T2}} - -### 使用`-i`命令实时监控 - -`mbean -i 1000 java.lang:type=Threading *Count`{{execute T2}} diff --git a/tutorials/katacoda/command-mbean-en/arthas-boot.md b/tutorials/katacoda/command-mbean-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-mbean-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mbean-en/arthas-demo.md b/tutorials/katacoda/command-mbean-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-mbean-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-mbean-en/finish.md b/tutorials/katacoda/command-mbean-en/finish.md deleted file mode 100644 index 9cc9f9c57e8..00000000000 --- a/tutorials/katacoda/command-mbean-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `mbean Tutorial` demonstrates the usage of mbean. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-mbean-en/index.json b/tutorials/katacoda/command-mbean-en/index.json deleted file mode 100644 index 53972d90a6a..00000000000 --- a/tutorials/katacoda/command-mbean-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas mbean Command", - "description": "Arthas mbean Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mbean Command", - "text": "mbean.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-mbean-en/intro.md b/tutorials/katacoda/command-mbean-en/intro.md deleted file mode 100644 index 2972a06ba0f..00000000000 --- a/tutorials/katacoda/command-mbean-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of mbean. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-mbean-en/mbean.md b/tutorials/katacoda/command-mbean-en/mbean.md deleted file mode 100644 index 30aa8529a54..00000000000 --- a/tutorials/katacoda/command-mbean-en/mbean.md +++ /dev/null @@ -1,57 +0,0 @@ - -show Mbean information - -This command can show or monitor Mbean attribute information. - -### Parameters - -| Name | Specification | -| ---- | ---- | -| name-pattern | pattern for the Mbean name | -| attribute-pattern | pattern for the attribute name | -| [m] | show meta information | -| [i:] | specify the interval to refresh attribute value (ms) | -| [n:] | execution times | -| [E] | turn on regex matching while the default mode is wildcard matching. Only effect on the attribute name | - -## Usage - -### Show all Mbean names - -`mbean`{{execute T2}} - -### Show meta data of Mbean - -`mbean -m java.lang:type=Threading`{{execute T2}} - -### Show attributes of Mbean - -`mbean java.lang:type=Threading `{{execute T2}} - -### Mbean name support wildcard matcher - -`mbean java.lang:type=Th*`{{execute T2}} - -Notes:ObjectName matching rules differ from normal wildcards, Reference resources:[javax.management.ObjectName](https://docs.oracle.com/javase/8/docs/api/javax/management/ObjectName.html?is-external=true) - -### Multiple properties name matcher - -Check memory pool: - -`mbean java.lang:name=*,type=MemoryPool`{{execute T2}} - -### Wildcards match specific attributes - -`mbean java.lang:type=Threading *Count`{{execute T2}} - -### Switch to regular matching using the `-E` command - -`mbean -E java.lang:type=Threading PeakThreadCount|ThreadCount|DaemonThreadCount`{{execute T2}} - -Check memory pool: - -`mbean -E java.lang:name=*,type=MemoryPool Name|Usage|Type | grep " HEAP" -A3 -B1`{{execute T2}} - -### Real-time monitoring using `-i` command - -`mbean -i 1000 java.lang:type=Threading *Count`{{execute T2}} diff --git a/tutorials/katacoda/command-mc-redefine-cn/arthas-boot.md b/tutorials/katacoda/command-mc-redefine-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mc-redefine-cn/case-jad-mc-redefine.md b/tutorials/katacoda/command-mc-redefine-cn/case-jad-mc-redefine.md deleted file mode 100644 index da6036af9ec..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/case-jad-mc-redefine.md +++ /dev/null @@ -1,95 +0,0 @@ -下面介绍通过`jad`/`mc`/`redefine` 命令实现动态更新代码的功能。 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -下面通过热更新代码,修改这个逻辑。 - -### jad反编译UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -jad反编译的结果保存在 `/tmp/UserController.java`文件里了。 - -再打开一个`Terminal 3`,然后用vim来编辑`/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -比如当 user id 小于1时,也正常返回,不抛出异常: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### sc查找加载UserController的ClassLoader - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -可以发现是 spring boot `LaunchedURLClassLoader@1be6f5c3` 加载的。 - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便. - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### mc - -保存好`/tmp/UserController.java`之后,使用`mc`(Memory Compiler)命令来编译,并且通过`--classLoaderClass`参数指定ClassLoader: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -也可以通过`mc -c /tmp/UserController.java -d /tmp`,使用`-c`参数指定ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -再使用`redefine`命令重新加载新编译好的`UserController.class`: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### 热修改代码结果 - -`redefine`成功之后,再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,结果是: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/command-mc-redefine-cn/finish.md b/tutorials/katacoda/command-mc-redefine-cn/finish.md deleted file mode 100644 index 14b1cbc2f07..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“mc-redefine”中,我们演示了了Arthas的mc-redefine命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-mc-redefine-cn/index.json b/tutorials/katacoda/command-mc-redefine-cn/index.json deleted file mode 100644 index fc14589e2ea..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/index.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "title": "Arthas mc-redefine命令", - "description": "Arthas mc-redefine命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "start-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mc命令", - "text": "mc.md" - }, - { - "title": "redefine命令", - "text": "redefine.md" - }, - { - "title": "热更新代码", - "text": "case-jad-mc-redefine.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-mc-redefine-cn/intro.md b/tutorials/katacoda/command-mc-redefine-cn/intro.md deleted file mode 100644 index 48d2d1337ee..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示mc-redefine命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-mc-redefine-cn/mc.md b/tutorials/katacoda/command-mc-redefine-cn/mc.md deleted file mode 100644 index 2408d8dca4e..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/mc.md +++ /dev/null @@ -1,7 +0,0 @@ - -> Memory Compiler/内存编译器,编译`.java`文件生成`.class`。 - - -可以通过`-c`/`--classLoaderClass`参数指定classloader,`-d`参数指定输出目录 - -编译生成`.class`文件之后,可以结合`redefine`命令实现热更新代码。 diff --git a/tutorials/katacoda/command-mc-redefine-cn/redefine.md b/tutorials/katacoda/command-mc-redefine-cn/redefine.md deleted file mode 100644 index bb3688c0e62..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/redefine.md +++ /dev/null @@ -1,33 +0,0 @@ - -> 加载外部的`.class`文件,redefine jvm已加载的类。 - -参考:[Instrumentation#redefineClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses-java.lang.instrument.ClassDefinition...-) - -### 常见问题 - -* redefine的class不能修改、添加、删除类的field和method,包括方法参数、方法名称及返回值 - -* 如果mc失败,可以在本地开发环境编译好class文件,上传到目标系统,使用redefine热加载class - -* 目前redefine 和watch/trace/jad/tt等命令冲突,以后重新实现redefine功能会解决此问题 - -> 注意, redefine后的原来的类不能恢复,redefine有可能失败(比如增加了新的field),参考jdk本身的文档。 - -> `reset`命令对`redefine`的类无效。如果想重置,需要`redefine`原始的字节码。 - -> `redefine`命令和`jad`/`watch`/`trace`/`monitor`/`tt`等命令会冲突。执行完`redefine`之后,如果再执行上面提到的命令,则会把`redefine`的字节码重置。 -> 原因是jdk本身redefine和Retransform是不同的机制,同时使用两种机制来更新字节码,只有最后修改的会生效。 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|[c:]|ClassLoader的hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|[p:]|外部的`.class`文件的完整路径,支持多个| - - -### redefine的限制 - -* 不允许新增加field/method -* 正在跑的函数,没有退出不能生效。 diff --git a/tutorials/katacoda/command-mc-redefine-cn/start-demo.md b/tutorials/katacoda/command-mc-redefine-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-mc-redefine-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-mc-redefine-en/arthas-boot.md b/tutorials/katacoda/command-mc-redefine-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mc-redefine-en/case-jad-mc-redefine.md b/tutorials/katacoda/command-mc-redefine-en/case-jad-mc-redefine.md deleted file mode 100644 index 80e93c96f3e..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/case-jad-mc-redefine.md +++ /dev/null @@ -1,98 +0,0 @@ -This case introduces the ability to dynamically update code via the `jad`/`mc`/`redefine` command. - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -This logic will be modified by `redefine` command below. - -### Use jad command to decompile UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -The result of jad command will be saved in the `/tmp/UserController.java` file. - - -Then open `Terminal 3`, use `vim` to edit `/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -For example, when the user id is less than 1, it also returns normally without throwing an exception: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### Use sc command to find the ClassLoader that loads the UserController - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -It can be found that it is loaded by spring boot `LaunchedURLClassLoader@1be6f5c3`. - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### mc - -After saving `/tmp/UserController.java`, compile with the `mc` (Memory Compiler) command and specify the ClassLoader with the `--classLoaderClass` option: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -You can also execute `mc -c /tmp/UserController.java -d /tmp`,using `-c` to specify ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### redefine - -Then reload the newly compiled `UserController.class` with the `redefine` command: - -`redefine /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ redefine /tmp/com/example/demo/arthas/user/UserController.class -redefine success, size: 1 -``` - -### Check the results of the hotswap code - -After the `redefine` command is executed successfully, visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 again. - -The result is: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/command-mc-redefine-en/finish.md b/tutorials/katacoda/command-mc-redefine-en/finish.md deleted file mode 100644 index e497866970d..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `mc-redefine Tutorial` demonstrates the usage of mc-redefine. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-mc-redefine-en/index.json b/tutorials/katacoda/command-mc-redefine-en/index.json deleted file mode 100644 index 8df2ad2587f..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/index.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "title": "Arthas mc-redefine Command", - "description": "Arthas mc-redefine Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mc Command", - "text": "mc.md" - }, - { - "title": "redefine Command", - "text": "redefine.md" - }, - { - "title": "Hotswap Code", - "text": "case-jad-mc-redefine.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-mc-redefine-en/intro.md b/tutorials/katacoda/command-mc-redefine-en/intro.md deleted file mode 100644 index 55f3fa792de..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the the usage of mc-redefine. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-mc-redefine-en/mc.md b/tutorials/katacoda/command-mc-redefine-en/mc.md deleted file mode 100644 index 6853f89989c..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/mc.md +++ /dev/null @@ -1,6 +0,0 @@ - -> Memory compiler, compiles `.java` files into `.class` files in memory. - -The classloader can be specified with the `-c`/`--classLoaderClass` option, the output directory can be specified with the `-d` option. - -After compiling the `.class` file, you can use the redefine command to re-define the loaded classes in JVM. diff --git a/tutorials/katacoda/command-mc-redefine-en/redefine.md b/tutorials/katacoda/command-mc-redefine-en/redefine.md deleted file mode 100644 index 2d4fe8af902..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/redefine.md +++ /dev/null @@ -1,33 +0,0 @@ - -> Load the external `*.class` files to re-define the loaded classes in JVM. - -Reference: [Instrumentation#redefineClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#redefineClasses-java.lang.instrument.ClassDefinition...-) - -### Frequently asked questions - -* The class of `redefine` cannot modify, add or delete the field and method of the class, including method parameters, method names and return values. - -* If `mc` fails, you can compile the class file in the local development environment, upload it to the target system, and use `redefine` to hot load the class. - -* At present, `redefine` conflicts with `watch / trace / jad / tt` commands. Reimplementing `redefine` function in the future will solve this problem. - -> Notes: Re-defined classes cannot be restored. There are chances that redefining may fail due to some reasons, for example: there's new field introduced in the new version of the class, pls. refer to JDK's documentation for the limitations. - -> The `reset` command is not valid for classes that have been processed by `redefine`. If you want to reset, you need `redefine` the original bytecode. - - -> The `redefine` command will conflict with the `jad`/`watch`/`trace`/`monitor`/`tt` commands. After executing `redefine`, if you execute the above mentioned command, the bytecode of the class will be reset. -> The reason is that in the JDK `redefine` and `retransform` are different mechanisms. When two mechanisms are both used to update the bytecode, only the last modified will take effect. - -### Options - -|Name|Specification| -|---:|:---| -|`[c:]`|hashcode of the class loader| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[p:]`|absolute path of the external `*.class`, multiple paths are separated with 'space'| - -### Restrictions of the redefine command - -* New field/method is not allowed -* The function that is running, no exit can not take effect. \ No newline at end of file diff --git a/tutorials/katacoda/command-mc-redefine-en/start-demo.md b/tutorials/katacoda/command-mc-redefine-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-mc-redefine-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-mc-retransform-cn/arthas-boot.md b/tutorials/katacoda/command-mc-retransform-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mc-retransform-cn/case-jad-mc-retransform.md b/tutorials/katacoda/command-mc-retransform-cn/case-jad-mc-retransform.md deleted file mode 100644 index 680fe27a7fe..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/case-jad-mc-retransform.md +++ /dev/null @@ -1,95 +0,0 @@ -下面介绍通过`jad`/`mc`/`retransform` 命令实现动态更新代码的功能。 - -目前,访问 http://localhost/user/0 ,会返回500异常: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -下面通过热更新代码,修改这个逻辑。 - -### jad反编译UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -jad反编译的结果保存在 `/tmp/UserController.java`文件里了。 - -再打开一个`Terminal 3`,然后用vim来编辑`/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -比如当 user id 小于1时,也正常返回,不抛出异常: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### sc查找加载UserController的ClassLoader - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -可以发现是 spring boot `LaunchedURLClassLoader@1be6f5c3` 加载的。 - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便. - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### mc - -保存好`/tmp/UserController.java`之后,使用`mc`(Memory Compiler)命令来编译,并且通过`--classLoaderClass`参数指定ClassLoader: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -也可以通过`mc -c /tmp/UserController.java -d /tmp`,使用`-c`参数指定ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### retransform - -再使用`retransform`命令重新加载新编译好的`UserController.class`: - -`retransform /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ retransform /tmp/com/example/demo/arthas/user/UserController.class -retransform success, size: 1 -``` - -### 热修改代码结果 - -`retransform`成功之后,再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,结果是: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/command-mc-retransform-cn/finish.md b/tutorials/katacoda/command-mc-retransform-cn/finish.md deleted file mode 100644 index 819e8cd4d3f..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“mc-retransform”中,我们演示了了Arthas的mc-retransform命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-mc-retransform-cn/index.json b/tutorials/katacoda/command-mc-retransform-cn/index.json deleted file mode 100644 index 151263c72fa..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas mc-retransform命令", - "description": "Arthas mc-retransform命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "start-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mc命令", - "text": "mc.md" - }, - { - "title": "retransform命令", - "text": "retransform.md" - }, - { - "title": "热更新代码", - "text": "case-jad-mc-retransform.md" - }, - { - "title": "retransform命令更多说明", - "text": "retransform-more.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-mc-retransform-cn/intro.md b/tutorials/katacoda/command-mc-retransform-cn/intro.md deleted file mode 100644 index e6e8197df9e..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示mc-retransform命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-mc-retransform-cn/mc.md b/tutorials/katacoda/command-mc-retransform-cn/mc.md deleted file mode 100644 index de0a45183c5..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/mc.md +++ /dev/null @@ -1,7 +0,0 @@ - -> Memory Compiler/内存编译器,编译`.java`文件生成`.class`。 - - -可以通过`-c`/`--classLoaderClass`参数指定classloader,`-d`参数指定输出目录 - -编译生成`.class`文件之后,可以结合`retransform`命令实现热更新代码。 diff --git a/tutorials/katacoda/command-mc-retransform-cn/retransform-more.md b/tutorials/katacoda/command-mc-retransform-cn/retransform-more.md deleted file mode 100644 index 0a1d61d7863..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/retransform-more.md +++ /dev/null @@ -1,62 +0,0 @@ - -> 加载外部的`.class`文件,retransform jvm已加载的类。 - -参考:[Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-) - - -### 查看 retransform entry - -`retransform -l`{{execute T2}} - -```bash -$ retransform -l -Id ClassName TransformCount LoaderHash LoaderClassName -1 com.example.dem 1 null null - o.arthas.user.U - serController -``` - -* TransformCount 统计在 ClassFileTransformer#transform 函数里尝试返回 entry对应的 .class文件的次数,但并不表明transform一定成功。 - -### 删除指定 retransform entry - -`retransform -d 1`{{execute T2}} - -需要指定 id: - -```bash -retransform -d 1 -``` - -### 删除所有 retransform entry - -`retransform --deleteAll`{{execute T2}} - -```bash -retransform --deleteAll -``` - -### 显式触发 retransform - -`retransform --classPattern com.example.demo.arthas.user.UserController`{{execute T2}} - -```bash -$ retransform --classPattern com.example.demo.arthas.user.UserController -retransform success, size: 1, classes: -com.example.demo.arthas.user.UserController -``` - -> 注意:对于同一个类,当存在多个 retransform entry时,如果显式触发 retransform ,则最后添加的entry生效(id最大的)。 - -### 消除 retransform 的影响 - -如果对某个类执行 retransform 之后,想消除影响,则需要: - -* 删除这个类对应的 retransform entry -* 重新触发 retransform - -> 如果不清除掉所有的 retransform entry,并重新触发 retransform ,则arthas stop时,retransform过的类仍然生效。 - -在上面删掉 retransform entry,再显式触发 retransform之后,可以用 `jad`命令来确认之前retransform的结果已经被消除了。 - -再次访问 https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 ,会抛出异常。 diff --git a/tutorials/katacoda/command-mc-retransform-cn/retransform.md b/tutorials/katacoda/command-mc-retransform-cn/retransform.md deleted file mode 100644 index 5a75714f132..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/retransform.md +++ /dev/null @@ -1,19 +0,0 @@ - -> 加载外部的`.class`文件,retransform jvm已加载的类。 - -参考:[Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-) - - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|[c:]|ClassLoader的hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|[p:]|外部的`.class`文件的完整路径,支持多个| - - -### retransform的限制 - -* 不允许新增加field/method -* 正在跑的函数,没有退出不能生效。 diff --git a/tutorials/katacoda/command-mc-retransform-cn/start-demo.md b/tutorials/katacoda/command-mc-retransform-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-mc-retransform-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-mc-retransform-en/arthas-boot.md b/tutorials/katacoda/command-mc-retransform-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-mc-retransform-en/case-jad-mc-retransform.md b/tutorials/katacoda/command-mc-retransform-en/case-jad-mc-retransform.md deleted file mode 100644 index 17f478abff5..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/case-jad-mc-retransform.md +++ /dev/null @@ -1,98 +0,0 @@ -This case introduces the ability to dynamically update code via the `jad`/`mc`/`retransform` command. - -Currently, visiting http://localhost/user/0 will return a 500 error: - -`curl http://localhost/user/0`{{execute T3}} - -``` -{"timestamp":1550223186170,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"id < 1","path":"/user/0"} -``` - -This logic will be modified by `retransform` command below. - -## Use jad command to decompile UserController - -`jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java`{{execute T2}} - -The result of jad command will be saved in the `/tmp/UserController.java` file. - - -Then open `Terminal 3`, use `vim` to edit `/tmp/UserController.java`: - -`vim /tmp/UserController.java`{{execute T3}} - -For example, when the user id is less than 1, it also returns normally without throwing an exception: - -```java - @GetMapping(value={"/user/{id}"}) - public User findUserById(@PathVariable Integer id) { - logger.info("id: {}", (Object)id); - if (id != null && id < 1) { - return new User(id, "name" + id); - // throw new IllegalArgumentException("id < 1"); - } - return new User(id.intValue(), "name" + id); - } -``` - -### Use sc command to find the ClassLoader that loads the UserController - -`sc -d *UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d *UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -It can be found that it is loaded by spring boot `LaunchedURLClassLoader@1be6f5c3`. - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### mc - -After saving `/tmp/UserController.java`, compile with the `mc` (Memory Compiler) command and specify the ClassLoader with the `--classLoaderClass` option: - -`mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp`{{execute T2}} - -```bash -$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp -Memory compiler output: -/tmp/com/example/demo/arthas/user/UserController.class -Affect(row-cnt:1) cost in 346 ms -``` - -You can also execute `mc -c /tmp/UserController.java -d /tmp`,using `-c` to specify ClassLoaderHash: - -```bash -$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp -``` - -### retransform - -Then reload the newly compiled `UserController.class` with the `retransform` command: - -`retransform /tmp/com/example/demo/arthas/user/UserController.class`{{execute T2}} - -``` -$ retransform /tmp/com/example/demo/arthas/user/UserController.class -retransform success, size: 1 -``` - -### Check the results of the hotswap code - -After the `retransform` command is executed successfully, visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 again. - -The result is: - -``` -{ - "id": 0, - "name": "name0" -} -``` diff --git a/tutorials/katacoda/command-mc-retransform-en/finish.md b/tutorials/katacoda/command-mc-retransform-en/finish.md deleted file mode 100644 index 6d6586a490b..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `mc-retransform Tutorial` demonstrates the usage of mc-retransform. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-mc-retransform-en/index.json b/tutorials/katacoda/command-mc-retransform-en/index.json deleted file mode 100644 index f60f08247c2..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas mc-retransform Command", - "description": "Arthas mc-retransform Command ", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "mc Command", - "text": "mc.md" - }, - { - "title": "retransform Command", - "text": "retransform.md" - }, - { - "title": "Hotswap Code", - "text": "case-jad-mc-retransform.md" - }, - { - "title": "More information about retransform", - "text": "retransform-more.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-mc-retransform-en/intro.md b/tutorials/katacoda/command-mc-retransform-en/intro.md deleted file mode 100644 index 3d07b429367..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the the usage of mc-retransform. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-mc-retransform-en/mc.md b/tutorials/katacoda/command-mc-retransform-en/mc.md deleted file mode 100644 index 77770e4744d..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/mc.md +++ /dev/null @@ -1,6 +0,0 @@ - -> Memory compiler, compiles `.java` files into `.class` files in memory. - -The classloader can be specified with the `-c`/`--classLoaderClass` option, the output directory can be specified with the `-d` option. - -After compiling the `.class` file, you can use the `retransform` command to update the loaded classes in JVM. diff --git a/tutorials/katacoda/command-mc-retransform-en/retransform-more.md b/tutorials/katacoda/command-mc-retransform-en/retransform-more.md deleted file mode 100644 index f1bb9cfda62..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/retransform-more.md +++ /dev/null @@ -1,64 +0,0 @@ - -> Load the external `*.class` files to retransform the loaded classes in JVM. - -Reference: [Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-) - - -### View retransform entry - -`retransform -l`{{execute T2}} - -```bash -$ retransform -l -Id ClassName TransformCount LoaderHash LoaderClassName -1 com.example.dem 1 null null - o.arthas.user.U - serController -``` - -* TransformCount counts the times of attempts to return the .class file corresponding to the entry in the ClassFileTransformer#transform method, but it does not mean that the transform must be successful. - -### Delete the specified retransform entry - -`retransform -d 1`{{execute T2}} - -Need to specify id: - -```bash -retransform -d 1 -``` - -### Delete all retransform entries - -`retransform --deleteAll`{{execute T2}} - -```bash -retransform --deleteAll -``` - -### Explicitly trigger retransform - -`retransform --classPattern com.example.demo.arthas.user.UserController`{{execute T2}} - -```bash -$ retransform --classPattern com.example.demo.arthas.user.UserController -retransform success, size: 1, classes: -com.example.demo.arthas.user.UserController -``` - -> Note: For the same class, when there are multiple retransform entries, if retransform is explicitly triggered, the entry added last will take effect (the one with the largest id). - -### Eliminate the influence of retransform - -If you want to eliminate the impact after performing retransform on a class, you need to: - -* Delete the retransform entry corresponding to this class -* Re-trigger retransform - -> If you do not clear all retransform entries and trigger retransform again, the retransformed classes will still take effect when arthas stop. - - -After deleting the retransform entry above and explicitly triggering the retransform, you can use the `jad` command to confirm that the result of the previous retransform has been eliminated. - -Visit https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com/user/0 again, an exception will be thrown. - diff --git a/tutorials/katacoda/command-mc-retransform-en/retransform.md b/tutorials/katacoda/command-mc-retransform-en/retransform.md deleted file mode 100644 index 28d6b456630..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/retransform.md +++ /dev/null @@ -1,18 +0,0 @@ - -> Load the external `*.class` files to retransform the loaded classes in JVM. - -Reference: [Instrumentation#retransformClasses](https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses-java.lang.Class...-) - - -### Options - -|Name|Specification| -|---:|:---| -|`[c:]`|hashcode of the class loader| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[p:]`|absolute path of the external `*.class`, multiple paths are separated with 'space'| - -### Restrictions of the retransform command - -* New field/method is not allowed -* The function that is running, no exit can not take effect. \ No newline at end of file diff --git a/tutorials/katacoda/command-mc-retransform-en/start-demo.md b/tutorials/katacoda/command-mc-retransform-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-mc-retransform-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-monitor-cn/arthas-boot.md b/tutorials/katacoda/command-monitor-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-monitor-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-monitor-cn/arthas-demo.md b/tutorials/katacoda/command-monitor-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-monitor-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-monitor-cn/finish.md b/tutorials/katacoda/command-monitor-cn/finish.md deleted file mode 100644 index ded52f16dbb..00000000000 --- a/tutorials/katacoda/command-monitor-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“monitor”中,我们演示了了Arthas的monitor命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-monitor-cn/index.json b/tutorials/katacoda/command-monitor-cn/index.json deleted file mode 100644 index cc188737529..00000000000 --- a/tutorials/katacoda/command-monitor-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas monitor命令", - "description": "Arthas monitor命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "monitor命令", - "text": "monitor.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-monitor-cn/intro.md b/tutorials/katacoda/command-monitor-cn/intro.md deleted file mode 100644 index 0b8000a4bdc..00000000000 --- a/tutorials/katacoda/command-monitor-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示monitor命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-monitor-cn/monitor.md b/tutorials/katacoda/command-monitor-cn/monitor.md deleted file mode 100644 index 54d4943c5d8..00000000000 --- a/tutorials/katacoda/command-monitor-cn/monitor.md +++ /dev/null @@ -1,69 +0,0 @@ - -> 方法执行监控 - -对匹配 `class-pattern`/`method-pattern`的类、方法的调用进行监控。 - -`monitor` 命令是一个非实时返回命令. - -实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 `Ctrl+C` 为止。 - -服务端是以任务的形式在后台跑任务,植入的代码随着任务的中止而不会被执行,所以任务关闭后,不会对原有性能产生太大影响,而且原则上,任何Arthas命令不会引起原有业务逻辑的改变。 - -### 监控的维度说明 - -|监控项|说明| -|---:|:---| -|timestamp|时间戳| -|class|Java类| -|method|方法(构造方法、普通方法)| -|total|调用次数| -|success|成功次数| -|fail|失败次数| -|rt|平均RT| -|fail-rate|失败率| - -### 参数说明 - -方法拥有一个命名参数 `[c:]`,意思是统计周期(cycle of output),拥有一个整型的参数值 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|`[c:]`|统计周期,默认值为120秒| - -### 使用参考 - -`monitor -c 5 demo.MathGame primeFactors`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ monitor -c 5 demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 94 ms. - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:38 demo.MathGame primeFactors 5 1 4 1.15 80.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:43 demo.MathGame primeFactors 5 3 2 42.29 40.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:48 demo.MathGame primeFactors 5 3 2 67.92 40.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:53 demo.MathGame primeFactors 5 2 3 0.25 60.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:58 demo.MathGame primeFactors 1 1 0 0.45 0.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:07:03 demo.MathGame primeFactors 2 2 0 3182.72 0.00% -``` diff --git a/tutorials/katacoda/command-monitor-en/arthas-boot.md b/tutorials/katacoda/command-monitor-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-monitor-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-monitor-en/arthas-demo.md b/tutorials/katacoda/command-monitor-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-monitor-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-monitor-en/finish.md b/tutorials/katacoda/command-monitor-en/finish.md deleted file mode 100644 index 548748245c6..00000000000 --- a/tutorials/katacoda/command-monitor-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `monitor Tutorial` demonstrates the usage of monitor. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-monitor-en/index.json b/tutorials/katacoda/command-monitor-en/index.json deleted file mode 100644 index 8b10acfed86..00000000000 --- a/tutorials/katacoda/command-monitor-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas monitor Command", - "description": "Arthas monitor Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "monitor Command", - "text": "monitor.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-monitor-en/intro.md b/tutorials/katacoda/command-monitor-en/intro.md deleted file mode 100644 index ed7ae26c73c..00000000000 --- a/tutorials/katacoda/command-monitor-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of monitor. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-monitor-en/monitor.md b/tutorials/katacoda/command-monitor-en/monitor.md deleted file mode 100644 index b2c3ea544f7..00000000000 --- a/tutorials/katacoda/command-monitor-en/monitor.md +++ /dev/null @@ -1,71 +0,0 @@ -monitor -======= - -> Monitor method invocation. - -Monitor invocation for the method matched with `class-pattern` and `method-pattern`. - -`monitor` is not a command returning immediately. - -A command returning immediately is a command immediately returns with the result after the command is input, while a non-immediate returning command will keep outputting the information from the target JVM process until user presses `Ctrl+C`. - -On Arthas's server side, the command is running as a background job, but the weaved code will not take further effect once the job is terminated, therefore, it will not impact the performance after the job quits. Furthermore, Arthas is designed to have no side effect to the business logic. - -### Items to monitor - -|Item|Specification| -|---:|:---| -|timestamp|timestamp| -|class|Java class| -|method|method (constructor and regular methods)| -|total|calling times| -|success|success count| -|fail|failure count| -|rt|average RT| -|fail-rate|failure ratio| - -### Parameters - -Parameter `[c:]` stands for cycles of statistics. Its value is an integer value in seconds. - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|*method-pattern*|pattern for the method name| -|`[E]`|turn on regex matching while the default is wildcard matching| -|`[c:]`|cycle of statistics, the default value: `120`s| - -### Usage - -`monitor -c 5 demo.MathGame primeFactors`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ monitor -c 5 demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 94 ms. - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:38 demo.MathGame primeFactors 5 1 4 1.15 80.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:43 demo.MathGame primeFactors 5 3 2 42.29 40.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:48 demo.MathGame primeFactors 5 3 2 67.92 40.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:53 demo.MathGame primeFactors 5 2 3 0.25 60.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:06:58 demo.MathGame primeFactors 1 1 0 0.45 0.00% - - timestamp class method total success fail avg-rt(ms) fail-rate ------------------------------------------------------------------------------------------------ - 2018-12-03 19:07:03 demo.MathGame primeFactors 2 2 0 3182.72 0.00% -``` diff --git a/tutorials/katacoda/command-ognl-cn/arthas-boot.md b/tutorials/katacoda/command-ognl-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-ognl-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-ognl-cn/case-logger-config-problem.md b/tutorials/katacoda/command-ognl-cn/case-logger-config-problem.md deleted file mode 100644 index da6ad4dc2a0..00000000000 --- a/tutorials/katacoda/command-ognl-cn/case-logger-config-problem.md +++ /dev/null @@ -1,52 +0,0 @@ - - -在这个案例里,展示排查logger冲突的方法。 - -### 确认应用使用的logger系统 - -以`UserController`为例,它使用的是slf4j api,但实际使用到的logger系统是logback。 - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 获取logback实际加载的配置文件 - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### 使用classloader命令查找可能存在的logger配置文件 - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -可以知道加载的配置的具体来源。 - -可以尝试加载容易冲突的文件: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/command-ognl-cn/case-ognl-update-logger-level.md b/tutorials/katacoda/command-ognl-cn/case-ognl-update-logger-level.md deleted file mode 100644 index a2c3fcca850..00000000000 --- a/tutorials/katacoda/command-ognl-cn/case-ognl-update-logger-level.md +++ /dev/null @@ -1,66 +0,0 @@ - - -在这个案例里,动态修改应用的Logger Level。 - - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -### 用ognl获取logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -可以知道`UserController@logger`实际使用的是logback。可以看到`level=null`,则说明实际最终的level是从`root` logger里来的。 - -### 单独设置UserController的logger level - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -再次获取`UserController@logger`,可以发现已经是`DEBUG`了: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### 修改logback的全局logger level - -通过获取`root` logger,可以修改全局的logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/command-ognl-cn/finish.md b/tutorials/katacoda/command-ognl-cn/finish.md deleted file mode 100644 index 714170a69c8..00000000000 --- a/tutorials/katacoda/command-ognl-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“ognl”中,我们演示了了Arthas的ognl命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-ognl-cn/index.json b/tutorials/katacoda/command-ognl-cn/index.json deleted file mode 100644 index 09e2c8b6680..00000000000 --- a/tutorials/katacoda/command-ognl-cn/index.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "title": "Arthas ognl", - "description": "Arthas ognl", - "difficulty": "入门者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "start-demo.md" - }, - { - "title": "启动arthas-boot,help命令", - "text": "arthas-boot.md" - }, - { - "title": "Ognl详解", - "text": "ognl.md" - }, - { - "title": "案例: 动态更新应用Logger Level", - "text": "case-ognl-update-logger-level.md" - }, - { - "title": "案例: 排查logger冲突问题", - "text": "case-logger-config-problem.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-ognl-cn/intro.md b/tutorials/katacoda/command-ognl-cn/intro.md deleted file mode 100644 index 275876771dc..00000000000 --- a/tutorials/katacoda/command-ognl-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个普通的Spring Boot应用为例,演示ognl命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-ognl-cn/ognl.md b/tutorials/katacoda/command-ognl-cn/ognl.md deleted file mode 100644 index 680950788b7..00000000000 --- a/tutorials/katacoda/command-ognl-cn/ognl.md +++ /dev/null @@ -1,73 +0,0 @@ - -在Arthas里,有一个单独的`ognl`命令,可以动态执行代码。 - - -查看用法:`ognl --help`{{execute T2}} - -### 调用static函数 - -`ognl '@java.lang.System@out.println("hello ognl")'`{{execute T2}} - -可以检查`Terminal 1`(不是arthas的Terminal 2)里的应用进程的输出,可以发现打印出了`hello ognl`。 - - -### 查找UserController的ClassLoader - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - - `--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -### 获取静态类的静态字段 - -获取`UserController`类里的`logger`字段: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -还可以通过`-x`参数控制返回值的展开层数。比如: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -### 执行多行表达式,赋值给临时变量,返回一个List - -`ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'`{{execute T2}} - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -### 更多 - -在Arthas里`ognl`表达式是很重要的功能,在很多命令里都可以使用`ognl`表达式。 - -一些更复杂的用法,可以参考: - -* OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71 -* OGNL表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html \ No newline at end of file diff --git a/tutorials/katacoda/command-ognl-cn/start-demo.md b/tutorials/katacoda/command-ognl-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-ognl-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-ognl-en/arthas-boot.md b/tutorials/katacoda/command-ognl-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-ognl-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-ognl-en/case-logger-config-problem.md b/tutorials/katacoda/command-ognl-en/case-logger-config-problem.md deleted file mode 100644 index 908298d5041..00000000000 --- a/tutorials/katacoda/command-ognl-en/case-logger-config-problem.md +++ /dev/null @@ -1,53 +0,0 @@ - - - -In this case, show how to troubleshoot logger conflicts. - -### View the logger system used by the app - -Take `UserController` as an example, it uses slf4j api, but the actual logger system used is logback. - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Find the configuration file actually loaded by the logback - - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '#map1=@org.slf4j.LoggerFactory@getLogger("root").loggerContext.objectMap, #map1.get("CONFIGURATION_WATCH_LIST")'`{{execute T2}} - - -### Use the classloader command to find possible logger configuration files - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml`{{execute T2}} - -``` -$ classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback-spring.xml - jar:file:/Users/hengyunabc/code/java/spring-boot-inside/demo-arthas-spring-boot/target/demo-arthas-spring-boot-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-spring.xml - -Affect(row-cnt:1) cost in 13 ms. -``` -You can know the specific source of the loaded configuration. - -You can try to load files that are prone to conflict: - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r logback.xml`{{execute T2}} - -`classloader --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -r log4j.properties`{{execute T2}} - - diff --git a/tutorials/katacoda/command-ognl-en/case-ognl-update-logger-level.md b/tutorials/katacoda/command-ognl-en/case-ognl-update-logger-level.md deleted file mode 100644 index 559970d979a..00000000000 --- a/tutorials/katacoda/command-ognl-en/case-ognl-update-logger-level.md +++ /dev/null @@ -1,64 +0,0 @@ - -In this case, show how to dynamically modify the Logger Level. - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -### Use ognl command to get the logger - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=null, - effectiveLevelInt=@Integer[20000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -The user can know that `UserController@logger` actually uses logback. Because `level=null`, the actual final level is from the `root` logger. - -### Change the logger level of UserController - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - -Get `UserController@logger` again, the user can see that it is already `DEBUG`: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger'`{{execute T2}} - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@com.example.demo.arthas.user.UserController@logger' -@Logger[ - serialVersionUID=@Long[5454405123156820674], - FQCN=@String[ch.qos.logback.classic.Logger], - name=@String[com.example.demo.arthas.user.UserController], - level=@Level[DEBUG], - effectiveLevelInt=@Integer[10000], - parent=@Logger[Logger[com.example.demo.arthas.user]], - childrenList=null, - aai=null, - additive=@Boolean[true], - loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]], -] -``` - -### Change the global logger level of the logback - -By getting the `root` logger, the user can modify the global logger level: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'`{{execute T2}} - diff --git a/tutorials/katacoda/command-ognl-en/finish.md b/tutorials/katacoda/command-ognl-en/finish.md deleted file mode 100644 index 9cccf4c76f1..00000000000 --- a/tutorials/katacoda/command-ognl-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `ognl Tutorial` demonstrates the usage of ognl. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-ognl-en/index.json b/tutorials/katacoda/command-ognl-en/index.json deleted file mode 100644 index 6e5b82f2495..00000000000 --- a/tutorials/katacoda/command-ognl-en/index.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "title": "Arthas ognl Command", - "description": "Arthas ognl Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Start math-game", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "ognl Details", - "text": "ognl.md" - }, - { - "title": "Case: Change Logger Level", - "text": "case-ognl-update-logger-level.md" - }, - { - "title": "Case: Troubleshoot logger conflicts", - "text": "case-logger-config-problem.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-ognl-en/intro.md b/tutorials/katacoda/command-ognl-en/intro.md deleted file mode 100644 index a0cccdbddf4..00000000000 --- a/tutorials/katacoda/command-ognl-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a normal Spring Boot application as an example to demonstrate the the usage of ognl. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-ognl-en/ognl.md b/tutorials/katacoda/command-ognl-en/ognl.md deleted file mode 100644 index 48680b45102..00000000000 --- a/tutorials/katacoda/command-ognl-en/ognl.md +++ /dev/null @@ -1,73 +0,0 @@ - -The `ognl` command can execute code dynamically. - -Check the usage: `ognl --help`{{execute T2}} - -### Invoke the static method - -`ognl '@java.lang.System@out.println("hello ognl")'`{{execute T2}} - -You can check the output of the process in `Terminal 1`, and find that it displays `hello ognl`. - -### Find the ClassLoader of the UserController - -`sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash - classLoaderHash 1be6f5c3 -``` - -Please write down your classLoaderHash here since it's dynamic. In the case here, it's `1be6f5c3`. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ ognl -c 1be6f5c3 @com.example.demo.arthas.user.UserController@logger -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -```bash -$ ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @org.springframework.boot.SpringApplication@logger -@Slf4jLocationAwareLog[ - FQCN=@String[org.apache.commons.logging.LogAdapter$Slf4jLocationAwareLog], - name=@String[org.springframework.boot.SpringApplication], - logger=@Logger[Logger[org.springframework.boot.SpringApplication]], -] -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -### Get static fields of static classes - -Get the `logger` field of the `UserController` class: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -Control the number of expansion layers of the return value with the `-x` parameter. such as: - -`ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 @com.example.demo.arthas.user.UserController@logger`{{execute T2}} - -### Execute multi-line expressions - -Return a list: - -`ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}'`{{execute T2}} - -```bash -$ ognl '#value1=@System@getProperty("java.home"), #value2=@System@getProperty("java.runtime.name"), {#value1, #value2}' -@ArrayList[ - @String[/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/jre], - @String[Java(TM) SE Runtime Environment], -] -``` - -### More - -The `ognl` expression in Arthas is an important feature, and the `ognl` expression can be used in many commands. - -For some more complicated usages, refer to: - -* For special usage of OGNL, please refer to: https://github.com/alibaba/arthas/issues/71 -* Official Guide to OGNL Expressions: https://commons.apache.org/proper/commons-ognl/language-guide.html diff --git a/tutorials/katacoda/command-ognl-en/start-demo.md b/tutorials/katacoda/command-ognl-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-ognl-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-options-cn/arthas-boot.md b/tutorials/katacoda/command-options-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-options-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-options-cn/arthas-demo.md b/tutorials/katacoda/command-options-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-options-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-options-cn/finish.md b/tutorials/katacoda/command-options-cn/finish.md deleted file mode 100644 index ef586213157..00000000000 --- a/tutorials/katacoda/command-options-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“options”中,我们演示了了Arthas的options命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-options-cn/index.json b/tutorials/katacoda/command-options-cn/index.json deleted file mode 100644 index 4bf20face50..00000000000 --- a/tutorials/katacoda/command-options-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas options命令", - "description": "Arthas options命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "options命令", - "text": "options.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-options-cn/intro.md b/tutorials/katacoda/command-options-cn/intro.md deleted file mode 100644 index ca289b8f117..00000000000 --- a/tutorials/katacoda/command-options-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示options命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-options-cn/options.md b/tutorials/katacoda/command-options-cn/options.md deleted file mode 100644 index 7cda822aa89..00000000000 --- a/tutorials/katacoda/command-options-cn/options.md +++ /dev/null @@ -1,96 +0,0 @@ - -> 全局开关 - -| 名称 | 默认值 | 描述 | -| ------------------ | ----- | ---------------------------------------- | -| unsafe | false | 是否支持对系统级别的类进行增强,打开该开关可能导致把JVM搞挂,请慎重选择! | -| dump | false | 是否支持被增强了的类dump到外部文件中,如果打开开关,class文件会被dump到`/${application working dir}/arthas-class-dump/`目录下,具体位置详见控制台输出 | -| batch-re-transform | true | 是否支持批量对匹配到的类执行retransform操作 | -| json-format | false | 是否支持json化的输出 | -| disable-sub-class | false | 是否禁用子类匹配,默认在匹配目标类的时候会默认匹配到其子类,如果想精确匹配,可以关闭此开关 | -| support-default-method | true | 是否支持匹配到default method,默认会查找interface,匹配里面的default method。参考 [#1105](https://github.com/alibaba/arthas/issues/1105) | -| save-result | false | 是否打开执行结果存日志功能,打开之后所有命令的运行结果都将保存到`~/logs/arthas-cache/result.log`中 | -| job-timeout | 1d | 异步后台任务的默认超时时间,超过这个时间,任务自动停止;比如设置 1d, 2h, 3m, 25s,分别代表天、小时、分、秒 | -| print-parent-fields | true | 是否打印在parent class里的filed | - -### 查看所有的options - -`options`{{execute T2}} - -```bash -$ options - LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION --------------------------------------------------------------------------------------------- - 0 bool unsafe false Option to support This option enables to proxy function - ean system-level class ality of JVM classes. Due to serious - security risk a JVM crash is possibly - be introduced. Do not activate it un - less you are able to manage. - 1 bool dump false Option to dump the This option enables the enhanced clas - ean enhanced classes ses to be dumped to external file for - further de-compilation and analysis. - 1 bool batch-re-tr true Option to support This options enables to reTransform c - ean ansform batch reTransform lasses with batch mode. - Class - 2 bool json-format false Option to support This option enables to format object - ean JSON format of obj output with JSON when -x option selec - ect output ted. - 1 bool disable-sub false Option to control This option disable to include sub cl - ean -class include sub class ass when matching class. - when class matchin - g - 1 bool save-result false Option to print co This option enables to save each comm - ean mmand's result to and's result to log file, which path - log file is ${user.home}/logs/arthas-cache/res - ult.log. - 2 Stri job-timeout 1d Option to job time This option setting job timeout,The u - ng out nit can be d, h, m, s for day, hour, - minute, second. 1d is one day in defa - ult - 1 bool print-paren true Option to print al This option enables print files in pa - ean t-fields l fileds in parent rent class, default value true. - class -``` - - -### 获取option的值 - -`options json-format`{{execute T2}} - -``` -$ options json-format - LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION --------------------------------------------------------------------------------------------- - 2 bool json-format false Option to support This option enables to format object - ean JSON format of obj output with JSON when -x option selec - ect output ted. -``` - -> 默认情况下`json-format`为false,如果希望`watch`/`tt`等命令结果以json格式输出,则可以设置`json-format`为true。 - -### 设置指定的option - -例如,想打开执行结果存日志功能首先查看日志,发现无记录: - -`cat /root/logs/arthas-cache/result.log`{{execute T2}} - -输入如下命令即可激活记录日志功能: - -`options save-result true`{{execute T2}} - -``` -$ options save-result true - NAME BEFORE-VALUE AFTER-VALUE ----------------------------------------- - save-result false true -``` - -稍候片刻,再次查看,发现出现记录: - -`cat /root/logs/arthas-cache/result.log`{{execute T2}} - -```bash -$ cat /root/logs/arthas-cache/result.log -2020-07-26 04:27:08 [arthas-command-execute] INFO result - -2020-07-26 04:27:08 [arthas-command-execute] INFO result - -``` diff --git a/tutorials/katacoda/command-options-en/arthas-boot.md b/tutorials/katacoda/command-options-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-options-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-options-en/arthas-demo.md b/tutorials/katacoda/command-options-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-options-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-options-en/finish.md b/tutorials/katacoda/command-options-en/finish.md deleted file mode 100644 index 0b00d26aa16..00000000000 --- a/tutorials/katacoda/command-options-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `options Tutorial` demonstrates the usage of options. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-options-en/index.json b/tutorials/katacoda/command-options-en/index.json deleted file mode 100644 index f8c81473dad..00000000000 --- a/tutorials/katacoda/command-options-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas options Command", - "description": "Arthas options Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "options Command", - "text": "options.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-options-en/intro.md b/tutorials/katacoda/command-options-en/intro.md deleted file mode 100644 index baedd2d4425..00000000000 --- a/tutorials/katacoda/command-options-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of options. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-options-en/options.md b/tutorials/katacoda/command-options-en/options.md deleted file mode 100644 index 2c9a39bb21a..00000000000 --- a/tutorials/katacoda/command-options-en/options.md +++ /dev/null @@ -1,101 +0,0 @@ - -> Global options - -|Name| Default Value | Description | -| ------------------------- | ----- | ---------------------------------------- | -| unsafe | false | whether to enhance to system-level class. Use it with caution since JVM may hang| -| dump | false | whether to dump enhanced class to the external files. If it's on, enhanced class will be dumped into `/${application dir}/arthas-class-dump/`, the specific output path will be output in the console | -| batch-re-transform | true | whether to re-transform matched classes in batch| -| json-format | false | whether to output in JSON format| -| disable-sub-class | false | whether to enable matching child classes. The default value is `true`. If exact match is desire, turn off this flag| -| support-default-method | true | whether to enable matching default method in interface. The default value is `true`. Refer to [#1105](https://github.com/alibaba/arthas/issues/1105) | -| save-result | false | whether to save execution result. All execution results will be saved to `~/logs/arthas-cache/result.log` when it's turned on| -| job-timeout | 1d | default timeout for background jobs. Background job will be terminated once it's timed out (i.e. 1d, 2h, 3m, 25s)| print-parent-fields | true | This option enables print files in parent class, default value true.| - - - -### View all options - -`options`{{execute T2}} - -```bash -$ options - LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION --------------------------------------------------------------------------------------------- - 0 bool unsafe false Option to support This option enables to proxy function - ean system-level class ality of JVM classes. Due to serious - security risk a JVM crash is possibly - be introduced. Do not activate it un - less you are able to manage. - 1 bool dump false Option to dump the This option enables the enhanced clas - ean enhanced classes ses to be dumped to external file for - further de-compilation and analysis. - 1 bool batch-re-tr true Option to support This options enables to reTransform c - ean ansform batch reTransform lasses with batch mode. - Class - 2 bool json-format false Option to support This option enables to format object - ean JSON format of obj output with JSON when -x option selec - ect output ted. - 1 bool disable-sub false Option to control This option disable to include sub cl - ean -class include sub class ass when matching class. - when class matchin - g - 1 bool debug-for-a false Option to print DE This option enables to print DEBUG me - ean sm BUG message if ASM ssage of ASM for each method invocati - is involved on. - 1 bool save-result false Option to print co This option enables to save each comm - ean mmand's result to and's result to log file, which path - log file is ${user.home}/logs/arthas-cache/res - ult.log. - 2 Stri job-timeout 1d Option to job time This option setting job timeout,The u - ng out nit can be d, h, m, s for day, hour, - minute, second. 1d is one day in defa - ult - 1 bool print-paren true Option to print al This option enables print files in pa - ean t-fields l fileds in parent rent class, default value true. - class -``` - - -### Get special option value - -`options json-format`{{execute T2}} - -``` -$ options json-format - LEVEL TYPE NAME VALUE SUMMARY DESCRIPTION --------------------------------------------------------------------------------------------- - 2 bool json-format false Option to support This option enables to format object - ean JSON format of obj output with JSON when -x option selec - ect output ted. -``` - -> By default, `json-format` is false. When set `json-format` to true, commands like `wathc`/`tt` will print result with `json` format. - -### Set special option value - -For example, to enable saving command execution result, first check the log, and you can see there's no result: - -`cat /root/logs/arthas-cache/result.log`{{execute T2}} - -To enable saving command execution result, input the command below: - -`options save-result true`{{execute T2}} - -``` -$ options save-result true - NAME BEFORE-VALUE AFTER-VALUE ----------------------------------------- - save-result false true -``` - -Wait for a second, and you will see there exist some results: - - -`cat /root/logs/arthas-cache/result.log`{{execute T2}} - -```bash -$ cat /root/logs/arthas-cache/result.log -2020-07-26 04:27:08 [arthas-command-execute] INFO result - -2020-07-26 04:27:08 [arthas-command-execute] INFO result - -``` diff --git a/tutorials/katacoda/command-perfcounter-cn/arthas-boot.md b/tutorials/katacoda/command-perfcounter-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-perfcounter-cn/arthas-demo.md b/tutorials/katacoda/command-perfcounter-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-perfcounter-cn/finish.md b/tutorials/katacoda/command-perfcounter-cn/finish.md deleted file mode 100644 index a7e8a374742..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“perfcounter”中,我们演示了了Arthas的perfcounter命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-perfcounter-cn/index.json b/tutorials/katacoda/command-perfcounter-cn/index.json deleted file mode 100644 index 82e52db7f2c..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas perfcounter命令", - "description": "Arthas perfcounter命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "perfcounter命令", - "text": "perfcounter.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-perfcounter-cn/intro.md b/tutorials/katacoda/command-perfcounter-cn/intro.md deleted file mode 100644 index 9aa540ec53e..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示perfcounter命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-perfcounter-cn/perfcounter.md b/tutorials/katacoda/command-perfcounter-cn/perfcounter.md deleted file mode 100644 index d770ea6b736..00000000000 --- a/tutorials/katacoda/command-perfcounter-cn/perfcounter.md +++ /dev/null @@ -1,60 +0,0 @@ - -查看当前JVM的 Perf Counter信息 - -`perfcounter -h`{{execute T2}} - -```bash - USAGE: - perfcounter [-d] [-h] - - SUMMARY: - Display the perf counter information. - - Examples: - perfcounter - perfcounter -d - - WIKI: - https://arthas.aliyun.com/doc/perfcounter - - OPTIONS: - -d, --details print all perf counter details - -h, --help this help -``` - -## 使用参考 - -`perfcounter`{{execute T2}} - -```bash -$ perfcounter - java.ci.totalTime 2325637411 - java.cls.loadedClasses 3403 - java.cls.sharedLoadedClasses 0 - java.cls.sharedUnloadedClasses 0 - java.cls.unloadedClasses 0 - java.property.java.version 11.0.4 - java.property.java.vm.info mixed mode - java.property.java.vm.name OpenJDK 64-Bit Server VM - ``` - -可以用-d参数打印更多信息: - -`perfcounter -d`{{execute T2}} - -```bash -$ perfcounter -d - Name Variability Units Value ---------------------------------------------------------------------------------- - java.ci.totalTime Monotonic Ticks 3242526906 - java.cls.loadedClasses Monotonic Events 3404 - java.cls.sharedLoadedClasses Monotonic Events 0 - java.cls.sharedUnloadedClasses Monotonic Events 0 - java.cls.unloadedClasses Monotonic Events 0 -``` - -## 备注: 对于jdk9以上的应用 - -如果没有打印出信息,应用在启动时,加下面的参数: - -`--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED --add-opens java.management/sun.management.counter.perf=ALL-UNNAMED --add-opens java.management/sun.management.counter=ALL-UNNAMED` diff --git a/tutorials/katacoda/command-perfcounter-en/arthas-boot.md b/tutorials/katacoda/command-perfcounter-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-perfcounter-en/arthas-demo.md b/tutorials/katacoda/command-perfcounter-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-perfcounter-en/finish.md b/tutorials/katacoda/command-perfcounter-en/finish.md deleted file mode 100644 index fbf1b41b740..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `perfcounter Tutorial` demonstrates the usage of perfcounter.If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-perfcounter-en/index.json b/tutorials/katacoda/command-perfcounter-en/index.json deleted file mode 100644 index 632009a1532..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas perfcounter Command", - "description": "Arthas perfcounter Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "perfcounter Command", - "text": "perfcounter.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-perfcounter-en/intro.md b/tutorials/katacoda/command-perfcounter-en/intro.md deleted file mode 100644 index e2e54acdf00..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the perfcounters, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running perfcounters. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, perfcounter states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of perfcounter. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-perfcounter-en/perfcounter.md b/tutorials/katacoda/command-perfcounter-en/perfcounter.md deleted file mode 100644 index ec74e1ae2b7..00000000000 --- a/tutorials/katacoda/command-perfcounter-en/perfcounter.md +++ /dev/null @@ -1,60 +0,0 @@ - -Check the current JVM Perf Counter information. - -`perfcounter -h`{{execute T2}} - -```bash - USAGE: - perfcounter [-d] [-h] - - SUMMARY: - Display the perf counter information. - - Examples: - perfcounter - perfcounter -d - - WIKI: - https://arthas.aliyun.com/doc/perfcounter - - OPTIONS: - -d, --details print all perf counter details - -h, --help this help -``` - -## Usage - -`perfcounter`{{execute T2}} - -```bash -$ perfcounter - java.ci.totalTime 2325637411 - java.cls.loadedClasses 3403 - java.cls.sharedLoadedClasses 0 - java.cls.sharedUnloadedClasses 0 - java.cls.unloadedClasses 0 - java.property.java.version 11.0.4 - java.property.java.vm.info mixed mode - java.property.java.vm.name OpenJDK 64-Bit Server VM - ``` - -Print more information with the `-d` option: - -`perfcounter -d`{{execute T2}} - -```bash -$ perfcounter -d - Name Variability Units Value ---------------------------------------------------------------------------------- - java.ci.totalTime Monotonic Ticks 3242526906 - java.cls.loadedClasses Monotonic Events 3404 - java.cls.sharedLoadedClasses Monotonic Events 0 - java.cls.sharedUnloadedClasses Monotonic Events 0 - java.cls.unloadedClasses Monotonic Events 0 -``` - -## PS: for JVM above JDK9 - -If the information is not printed, when the application starts, add the following parameters: - -`--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED --add-opens java.management/sun.management.counter.perf=ALL-UNNAMED --add-opens java.management/sun.management.counter=ALL-UNNAMED` diff --git a/tutorials/katacoda/command-plaintext-cn/arthas-boot.md b/tutorials/katacoda/command-plaintext-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-plaintext-cn/arthas-demo.md b/tutorials/katacoda/command-plaintext-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-plaintext-cn/finish.md b/tutorials/katacoda/command-plaintext-cn/finish.md deleted file mode 100644 index 04428a5f102..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“plaintext”中,我们演示了了Arthas的plaintext命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-plaintext-cn/index.json b/tutorials/katacoda/command-plaintext-cn/index.json deleted file mode 100644 index 6fd9510ae2d..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas plaintext命令", - "description": "Arthas plaintext命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "plaintext命令", - "text": "plaintext.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-plaintext-cn/intro.md b/tutorials/katacoda/command-plaintext-cn/intro.md deleted file mode 100644 index 23cc846862c..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示plaintext命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-plaintext-cn/plaintext.md b/tutorials/katacoda/command-plaintext-cn/plaintext.md deleted file mode 100644 index 19ac0118e5c..00000000000 --- a/tutorials/katacoda/command-plaintext-cn/plaintext.md +++ /dev/null @@ -1,8 +0,0 @@ - -将输出结果去除ANSI颜色 - -示例: - -`jad demo.MathGame main`{{execute T2}} - -`jad demo.MathGame main | plaintext`{{execute T2}} diff --git a/tutorials/katacoda/command-plaintext-en/arthas-boot.md b/tutorials/katacoda/command-plaintext-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-plaintext-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-plaintext-en/arthas-demo.md b/tutorials/katacoda/command-plaintext-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-plaintext-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-plaintext-en/finish.md b/tutorials/katacoda/command-plaintext-en/finish.md deleted file mode 100644 index f2f0b16dd70..00000000000 --- a/tutorials/katacoda/command-plaintext-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `plaintext Tutorial` demonstrates the usage of plaintext. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-plaintext-en/index.json b/tutorials/katacoda/command-plaintext-en/index.json deleted file mode 100644 index 590b14a33d3..00000000000 --- a/tutorials/katacoda/command-plaintext-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas plaintext Command", - "description": "Arthas plaintext Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "plaintext Command", - "text": "plaintext.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-plaintext-en/intro.md b/tutorials/katacoda/command-plaintext-en/intro.md deleted file mode 100644 index 465c7a9d621..00000000000 --- a/tutorials/katacoda/command-plaintext-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of plaintext. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-plaintext-en/plaintext.md b/tutorials/katacoda/command-plaintext-en/plaintext.md deleted file mode 100644 index 1eefa592454..00000000000 --- a/tutorials/katacoda/command-plaintext-en/plaintext.md +++ /dev/null @@ -1,8 +0,0 @@ - -remove the ANSI color - -Example: - -`jad demo.MathGame main`{{execute T2}} - -`jad demo.MathGame main | plaintext`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/command-profiler-cn/arthas-boot.md b/tutorials/katacoda/command-profiler-cn/arthas-boot.md deleted file mode 100644 index bd42b144e6d..00000000000 --- a/tutorials/katacoda/command-profiler-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-profiler-cn/arthas-demo.md b/tutorials/katacoda/command-profiler-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-profiler-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-profiler-cn/finish.md b/tutorials/katacoda/command-profiler-cn/finish.md deleted file mode 100644 index 2dfc41df3b4..00000000000 --- a/tutorials/katacoda/command-profiler-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“profiler”中,我们演示了了Arthas的profiler命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-profiler-cn/index.json b/tutorials/katacoda/command-profiler-cn/index.json deleted file mode 100644 index d393f9087be..00000000000 --- a/tutorials/katacoda/command-profiler-cn/index.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "title": "Arthas profiler命令", - "description": "Arthas profiler命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "profiler命令", - "text": "profiler.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 8563", - "port": 8563 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-profiler-cn/intro.md b/tutorials/katacoda/command-profiler-cn/intro.md deleted file mode 100644 index d0f557684f0..00000000000 --- a/tutorials/katacoda/command-profiler-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示profiler命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-profiler-cn/profiler.md b/tutorials/katacoda/command-profiler-cn/profiler.md deleted file mode 100644 index 780a8070631..00000000000 --- a/tutorials/katacoda/command-profiler-cn/profiler.md +++ /dev/null @@ -1,188 +0,0 @@ - -> 使用[async-profiler](https://github.com/jvm-profiling-tools/async-profiler)生成火焰图 - -`profiler` 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。 - -`profiler` 命令基本运行结构是 `profiler action [actionArg]` - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*action*|要执行的操作| -|*actionArg*|属性名模式| -|[i:]|采样间隔(单位:ns)(默认值:10'000'000,即10 ms)| -|[f:]|将输出转储到指定路径| -|[d:]|运行评测指定秒| -|[e:]|要跟踪哪个事件(cpu, alloc, lock, cache-misses等),默认是cpu| - -### 查看所有支持的action - -`profiler actions`{{execute T2}} - -```bash -$ profiler actions -Supported Actions: [resume, dumpCollapsed, getSamples, start, list, execute, version, stop, load, dumpFlat, actions, dumpTraces, status] -``` - -### 查看版本 - -`profiler version`{{execute T2}} - -```bash -$ profiler version -Async-profiler 1.6 built on Sep 9 2019 -Copyright 2019 Andrei Pangin -``` - -### 启动profiler - -`profiler start -e itimer`{{execute T2}} - -``` -$ profiler start -e itimer -Started [itimer] profiling -``` - -> 默认情况下,生成的是cpu的火焰图,即event为`cpu`。可以用`--event`参数来指定。 -> 因为katacoda环境不支持perf_events,所以这里使用`-e itimer`参数指定event为itimer - - - -### 获取已采集的sample的数量 - -`profiler getSamples`{{execute T2}} - -``` -$ profiler getSamples -23 -``` - -### 查看profiler状态 - -`profiler status`{{execute T2}} - -```bash -$ profiler status -[itimer] profiling is running for 4 seconds -``` - -可以查看当前profiler在采样哪种`event`和采样时间。 - -### 停止profiler - -#### 生成html格式结果 - -默认情况下,结果文件是`html`格式。也可以用`--format`参数指定: - -`profiler stop --format html`{{execute T2}} - -```bash -$ profiler stop --format html -profiler output file: /tmp/test/arthas-output/20211207-111550.html -OK -``` - -或者在`--file`参数里用文件名指名格式。比如`--file /tmp/result.html` 。 - -`profiler stop --file /tmp/result.html`{{execute T2}} - -### 通过浏览器查看arthas-output下面的profiler结果 - -默认情况下,arthas使用8563http端口,则可以打开: https://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/arthas-output/ 目录下面的profiler结果: - -![](https://arthas.aliyun.com/doc/_images/arthas-output.jpg) - -点击可以查看具体的结果: - -![](https://arthas.aliyun.com/doc/_images/arthas-output-svg.jpg) - -> 如果是chrome浏览器,可能需要多次刷新。 - -### profiler支持的events - -`profiler list`{{execute T2}} - -在不同的平台,不同的OS下面,支持的events各有不同。比如在macos下面: - -```bash -$ profiler list -Basic events: - cpu - alloc - lock - wall - itimer -``` - -在linux下面 - -```bash -$ profiler list -Basic events: - cpu - alloc - lock - wall - itimer -Perf events: - page-faults - context-switches - cycles - instructions - cache-references - cache-misses - branches - branch-misses - bus-cycles - L1-dcache-load-misses - LLC-load-misses - dTLB-load-misses - mem:breakpoint - trace:tracepoint -``` - -如果遇到OS本身的权限/配置问题,然后缺少部分event,可以参考`async-profiler`本身文档:[async-profiler](https://github.com/jvm-profiling-tools/async-profiler) - -可以用`--event`参数指定要采样的事件,比如对`alloc`事件进入采样: - -`profiler start --event alloc`{{execute T2}} - -```bash -$ profiler start --event alloc -``` - - -### 恢复采样 - -`profiler resume`{{execute T2}} - -```bash -$ profiler resume -Started [cpu] profiling -``` - -`start`和`resume`的区别是:`start`是新开始采样,`resume`会保留上次`stop`时的数据。 - -通过执行`profiler getSamples`可以查看samples的数量来验证。 - - -### 使用`execute`来执行复杂的命令 - -比如开始采样: - -`profiler execute 'start,framebuf=5000000'`{{execute T2}} - -```bash -profiler execute 'start,framebuf=5000000' -``` - -停止采样,并保存到指定文件里: - -`profiler execute 'stop,file=/tmp/result.html'`{{execute T2}} - -```bash -profiler execute 'stop,file=/tmp/result.html' -``` - -具体的格式参考: [arguments.cpp](https://github.com/jvm-profiling-tools/async-profiler/blob/v2.5/src/arguments.cpp#L50) diff --git a/tutorials/katacoda/command-profiler-en/arthas-boot.md b/tutorials/katacoda/command-profiler-en/arthas-boot.md deleted file mode 100644 index 1726fe72727..00000000000 --- a/tutorials/katacoda/command-profiler-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar --target-ip 0.0.0.0`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-profiler-en/arthas-demo.md b/tutorials/katacoda/command-profiler-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-profiler-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-profiler-en/finish.md b/tutorials/katacoda/command-profiler-en/finish.md deleted file mode 100644 index 968f8ddd79b..00000000000 --- a/tutorials/katacoda/command-profiler-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `profiler Tutorial` demonstrates the usage of profiler. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-profiler-en/index.json b/tutorials/katacoda/command-profiler-en/index.json deleted file mode 100644 index 4482398ff2f..00000000000 --- a/tutorials/katacoda/command-profiler-en/index.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "title": "Arthas profiler Command", - "description": "Arthas profiler Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "profiler Command", - "text": "profiler.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 8563", - "port": 8563 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-profiler-en/intro.md b/tutorials/katacoda/command-profiler-en/intro.md deleted file mode 100644 index 35e21955663..00000000000 --- a/tutorials/katacoda/command-profiler-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of profiler. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-profiler-en/profiler.md b/tutorials/katacoda/command-profiler-en/profiler.md deleted file mode 100644 index c92cf5eb10d..00000000000 --- a/tutorials/katacoda/command-profiler-en/profiler.md +++ /dev/null @@ -1,189 +0,0 @@ - -> Generate a flame graph using [async-profiler](https://github.com/jvm-profiling-tools/async-profiler) - -The `profiler` command supports generate flame graph for application hotspots. - -The basic usage of the `profiler` command is `profiler action [actionArg]` - -### Supported Options - -|Name|Specification| -|---:|:---| -|*action*|Action to execute| -|*actionArg*|Attribute name pattern| -|[i:]|sampling interval in ns (default: 10'000'000, i.e. 10 ms)| -|[f:]|dump output to specified directory| -|[d:]|run profiling for specified seconds| -|[e:]|which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu| - -### View all supported actions - -`profiler actions`{{execute T2}} - -```bash -$ profiler actions -Supported Actions: [resume, dumpCollapsed, getSamples, start, list, execute, version, stop, load, dumpFlat, actions, dumpTraces, status] -``` - - -### View version - -`profiler version`{{execute T2}} - -```bash -$ profiler version -Async-profiler 1.6 built on Sep 9 2019 -Copyright 2019 Andrei Pangin -``` - -### Start profiler - -`profiler start -e itimer`{{execute T2}} - -``` -$ profiler start -Started [cpu] profiling -``` - -> By default, the sample event is `cpu`. Can be specified with the `--event` parameter. -> Since katacoda environment doesn't support `perf_events`,here use `-e itimer` to specify event to be `itimer` - - -### Get the number of samples collected - -`profiler getSamples`{{execute T2}} - -``` -$ profiler getSamples -23 -``` - -### View profiler status - -`profiler status`{{execute T2}} - -```bash -$ profiler status -[cpu] profiling is running for 4 seconds -``` - -Can view which `event` and sampling time. - -### Stop profiler - - -#### Generating html format results - -By default, the result file is `html` format. You can also specify it with the `--format` parameter: - -`profiler stop --format html`{{execute T2}} - -```bash -$ profiler stop --format html -profiler output file: /tmp/test/arthas-output/20211207-111550.html -OK -``` - -Or use the file name name format in the `--file` parameter. For example, `--file /tmp/result.html`. - -`profiler stop --file /tmp/result.html`{{execute T2}} - -### View profiler results under arthas-output via browser - -By default, arthas uses http port 8563, which can be opened: https://[[HOST_SUBDOMAIN]]-8563-[[KATACODA_HOST]].environments.katacoda.com/arthas-output/ View the `arthas-output` directory below Profiler results: - -![](https://arthas.aliyun.com/doc/_images/arthas-output.jpg) - -Click to view specific results: - -![](https://arthas.aliyun.com/doc/_images/arthas-output-svg.jpg) - -> If using the chrome browser, may need to be refreshed multiple times. - -### Profiler supported events - -`profiler list`{{execute T2}} - -Under different platforms and different OSs, the supported events are different. For example, under macos: - -```bash -$ profiler list -Basic events: - cpu - alloc - lock - wall - itimer -``` - -Under linux - -```bash -$ profiler list -Basic events: - cpu - alloc - lock - wall - itimer -Perf events: - page-faults - context-switches - cycles - instructions - cache-references - cache-misses - branches - branch-misses - bus-cycles - L1-dcache-load-misses - LLC-load-misses - dTLB-load-misses - mem:breakpoint - trace:tracepoint -``` - -If you encounter the permissions/configuration issues of the OS itself and then missing some events, you can refer to the [async-profiler](https://github.com/jvm-profiling-tools/async-profiler) documentation. - -You can use the `--event` parameter to specify the event to sample, such as sampling the `alloc` event: - -`profiler start --event alloc`{{execute T2}} - -```bash -$ profiler start --event alloc -``` - - -### Resume sampling - -`profiler resume`{{execute T2}} - -```bash -$ profiler resume -Started [cpu] profiling -``` - -The difference between `start` and `resume` is: `start` is the new start sampling, `resume` will retain the data of the last `stop`. - -You can verify the number of samples by executing `profiler getSamples`. - - -### Use `execute` action to execute complex commands - -`profiler execute 'start,framebuf=5000000'`{{execute T2}} - -For example, start sampling: - -```bash -profiler execute 'start,framebuf=5000000' -``` - -Stop sampling and save to the specified file: - -`profiler execute 'stop,file=/tmp/result.html'`{{execute T2}} - -```bash -profiler execute 'stop,file=/tmp/result.html' -``` - -Specific format reference: [arguments.cpp](https://github.com/jvm-profiling-tools/async-profiler/blob/v2.5/src/arguments.cpp#L50) diff --git a/tutorials/katacoda/command-pwd-cn/arthas-boot.md b/tutorials/katacoda/command-pwd-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-pwd-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-pwd-cn/arthas-demo.md b/tutorials/katacoda/command-pwd-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-pwd-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-pwd-cn/finish.md b/tutorials/katacoda/command-pwd-cn/finish.md deleted file mode 100644 index f707b1bcd38..00000000000 --- a/tutorials/katacoda/command-pwd-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas pwd的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-pwd-cn/index.json b/tutorials/katacoda/command-pwd-cn/index.json deleted file mode 100644 index a196216a97d..00000000000 --- a/tutorials/katacoda/command-pwd-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas pwd命令教程", - "description": "Arthas pwd命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "pwd 命令", - "text": "pwd.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-pwd-cn/intro.md b/tutorials/katacoda/command-pwd-cn/intro.md deleted file mode 100644 index 64be66950a3..00000000000 --- a/tutorials/katacoda/command-pwd-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示pwd命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-pwd-cn/pwd.md b/tutorials/katacoda/command-pwd-cn/pwd.md deleted file mode 100644 index e5285be2cf1..00000000000 --- a/tutorials/katacoda/command-pwd-cn/pwd.md +++ /dev/null @@ -1,4 +0,0 @@ - -通过`pwd`命令可以获知当前的工作目录,和linux命令类似 - -`pwd`{{execute T2}} diff --git a/tutorials/katacoda/command-pwd-en/arthas-boot.md b/tutorials/katacoda/command-pwd-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-pwd-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-pwd-en/arthas-demo.md b/tutorials/katacoda/command-pwd-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-pwd-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-pwd-en/finish.md b/tutorials/katacoda/command-pwd-en/finish.md deleted file mode 100644 index 96ca624fc90..00000000000 --- a/tutorials/katacoda/command-pwd-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `pwd`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-pwd-en/index.json b/tutorials/katacoda/command-pwd-en/index.json deleted file mode 100644 index b762d4b3bfe..00000000000 --- a/tutorials/katacoda/command-pwd-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas pwd", - "description": "Arthas pwd", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "pwd command", - "text": "pwd.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-pwd-en/intro.md b/tutorials/katacoda/command-pwd-en/intro.md deleted file mode 100644 index 23185febba4..00000000000 --- a/tutorials/katacoda/command-pwd-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of pwd. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-pwd-en/pwd.md b/tutorials/katacoda/command-pwd-en/pwd.md deleted file mode 100644 index 82ebdc55ddb..00000000000 --- a/tutorials/katacoda/command-pwd-en/pwd.md +++ /dev/null @@ -1,4 +0,0 @@ - -Use `pwd` to get working directory name - -`pwd`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/command-quit-stop-cn/arthas-boot.md b/tutorials/katacoda/command-quit-stop-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-quit-stop-cn/arthas-demo.md b/tutorials/katacoda/command-quit-stop-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-quit-stop-cn/finish.md b/tutorials/katacoda/command-quit-stop-cn/finish.md deleted file mode 100644 index 8703a02059b..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas quit-stop的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-quit-stop-cn/index.json b/tutorials/katacoda/command-quit-stop-cn/index.json deleted file mode 100644 index f2a79207703..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas quit-stop命令教程", - "description": "Arthas quit-stop命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "quit-stop 命令", - "text": "quit-stop.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-quit-stop-cn/intro.md b/tutorials/katacoda/command-quit-stop-cn/intro.md deleted file mode 100644 index ab9e0e78109..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示quit, stop命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-quit-stop-cn/quit-stop.md b/tutorials/katacoda/command-quit-stop-cn/quit-stop.md deleted file mode 100644 index 99dfde4719f..00000000000 --- a/tutorials/katacoda/command-quit-stop-cn/quit-stop.md +++ /dev/null @@ -1,15 +0,0 @@ - - -## 退出Arthas - -用 `exit`{{execute interrupt}} 或者 `quit`{{execute interrupt}} 命令可以退出Arthas。 - -退出Arthas之后,还可以再次用 `java -jar arthas-boot.jar`{{execute interrupt}} 来连接。 - - -## 彻底退出Arthas - -`exit/quit`命令只是退出当前session,arthas server还在目标进程中运行。 - -想完全退出Arthas,可以执行 `stop`{{execute interrupt}} 命令。 - diff --git a/tutorials/katacoda/command-quit-stop-en/arthas-boot.md b/tutorials/katacoda/command-quit-stop-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-quit-stop-en/arthas-demo.md b/tutorials/katacoda/command-quit-stop-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-quit-stop-en/finish.md b/tutorials/katacoda/command-quit-stop-en/finish.md deleted file mode 100644 index 81fa2c2fbf0..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `quit-stop`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-quit-stop-en/index.json b/tutorials/katacoda/command-quit-stop-en/index.json deleted file mode 100644 index 90d7f952e01..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas quit-stop", - "description": "Arthas quit-stop", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "quit-stop command", - "text": "quit-stop.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-quit-stop-en/intro.md b/tutorials/katacoda/command-quit-stop-en/intro.md deleted file mode 100644 index 06291efdb83..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of quit, stop. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-quit-stop-en/quit-stop.md b/tutorials/katacoda/command-quit-stop-en/quit-stop.md deleted file mode 100644 index d031457ef1b..00000000000 --- a/tutorials/katacoda/command-quit-stop-en/quit-stop.md +++ /dev/null @@ -1,12 +0,0 @@ - -## Exit/Stop Arthas - -Arthas can be exited with the `exit`{{execute interrupt}} or `quit`{{execute interrupt}} command. - -After exiting Arthas, you can also connect with `java -jar arthas-boot.jar`{{execute interrupt}} again. - -## Stop Arthas - -The `exit/quit` command simply exits the current session and the arthas server still runs in the target process. - -To completely exit Arthas, you can execute the `stop`{{execute interrupt}} command. diff --git a/tutorials/katacoda/command-reset-cn/arthas-boot.md b/tutorials/katacoda/command-reset-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-reset-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-reset-cn/arthas-demo.md b/tutorials/katacoda/command-reset-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-reset-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-reset-cn/finish.md b/tutorials/katacoda/command-reset-cn/finish.md deleted file mode 100644 index f29506cc096..00000000000 --- a/tutorials/katacoda/command-reset-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas reset的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-reset-cn/index.json b/tutorials/katacoda/command-reset-cn/index.json deleted file mode 100644 index 39045d04713..00000000000 --- a/tutorials/katacoda/command-reset-cn/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas reset命令教程", - "description": "Arthas reset命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "reset 命令", - "text": "reset.md" - }, - { - "title": "reset 使用参考", - "text": "reset-usage.md" - }, - { - "title": "reset 还原指定类", - "text": "reset-specified-class.md" - }, - { - "title": "reset 还原所有类", - "text": "reset-all-classes.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-cn/intro.md b/tutorials/katacoda/command-reset-cn/intro.md deleted file mode 100644 index aa2c3ae0dec..00000000000 --- a/tutorials/katacoda/command-reset-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示reset命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-reset-cn/reset-all-classes.md b/tutorials/katacoda/command-reset-cn/reset-all-classes.md deleted file mode 100644 index 2829a765671..00000000000 --- a/tutorials/katacoda/command-reset-cn/reset-all-classes.md +++ /dev/null @@ -1,22 +0,0 @@ - -`trace demo.MathGame primeFactors`{{execute T2}} - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 可以退出 - -`reset`{{execute T2}} - - -```bash -$ trace demo.MathGame primeFactors -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 92 ms, listenerId: 3 ----ts=2020-07-16 05:41:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.523823ms] demo.MathGame:primeFactors() - ---[0.004476ms] throw:java.lang.IllegalArgumentException() #46 - ----ts=2020-07-16 05:41:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.111285ms] demo.MathGame:primeFactors() - -$ reset -Affect(class count: 1 , method count: 0) cost in 5 ms, listenerId: 0 -``` diff --git a/tutorials/katacoda/command-reset-cn/reset-specified-class.md b/tutorials/katacoda/command-reset-cn/reset-specified-class.md deleted file mode 100644 index 62fb2c8393b..00000000000 --- a/tutorials/katacoda/command-reset-cn/reset-specified-class.md +++ /dev/null @@ -1,22 +0,0 @@ - -`trace demo.MathGame primeFactors`{{execute T2}} - -输入 `Q`{{execute T2}} 或者 `Ctrl+C` 可以退出 - -`reset demo.MathGame`{{execute T2}} - - -```bash -$ trace demo.MathGame primeFactors -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 92 ms, listenerId: 3 ----ts=2020-07-16 05:41:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.523823ms] demo.MathGame:primeFactors() - ---[0.004476ms] throw:java.lang.IllegalArgumentException() #46 - ----ts=2020-07-16 05:41:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.111285ms] demo.MathGame:primeFactors() - -$ reset demo.MathGame -Affect(class count: 1 , method count: 0) cost in 5 ms, listenerId: 0 -``` diff --git a/tutorials/katacoda/command-reset-cn/reset-usage.md b/tutorials/katacoda/command-reset-cn/reset-usage.md deleted file mode 100644 index ff85ae8888c..00000000000 --- a/tutorials/katacoda/command-reset-cn/reset-usage.md +++ /dev/null @@ -1,22 +0,0 @@ - - `reset -h`{{execute T2}} - -```bash -$ reset -h - USAGE: - reset [-h] [-E] [class-pattern] - - SUMMARY: - Reset all the enhanced classes - - EXAMPLES: - reset - reset *List - reset -E .*List - - OPTIONS: - -h, --help this help - -E, --regex Enable regular expression to match (wildcard matching by default) - Path and classname of Pattern Matching - ``` - \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-cn/reset.md b/tutorials/katacoda/command-reset-cn/reset.md deleted file mode 100644 index 187920570de..00000000000 --- a/tutorials/katacoda/command-reset-cn/reset.md +++ /dev/null @@ -1,5 +0,0 @@ - - -通过`reset`命令可以重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类 - -Arthas在 watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 `reset`{{execute T2}} 命令,可以清除掉这些增强代码。 diff --git a/tutorials/katacoda/command-reset-en/arthas-boot.md b/tutorials/katacoda/command-reset-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-reset-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-reset-en/arthas-demo.md b/tutorials/katacoda/command-reset-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-reset-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-en/finish.md b/tutorials/katacoda/command-reset-en/finish.md deleted file mode 100644 index ed9db7c939a..00000000000 --- a/tutorials/katacoda/command-reset-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `reset`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-reset-en/index.json b/tutorials/katacoda/command-reset-en/index.json deleted file mode 100644 index 630ee62b70a..00000000000 --- a/tutorials/katacoda/command-reset-en/index.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "Arthas reset", - "description": "Arthas reset", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "reset command", - "text": "reset.md" - }, - { - "title": "reset usage", - "text": "reset-usage.md" - }, - { - "title": "reset specified class", - "text": "reset-specified-class.md" - }, - { - "title": "reset all classes", - "text": "reset-all-classes.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-en/intro.md b/tutorials/katacoda/command-reset-en/intro.md deleted file mode 100644 index 2e35fa9eae5..00000000000 --- a/tutorials/katacoda/command-reset-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of reset. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-reset-en/reset-all-classes.md b/tutorials/katacoda/command-reset-en/reset-all-classes.md deleted file mode 100644 index f63c401c629..00000000000 --- a/tutorials/katacoda/command-reset-en/reset-all-classes.md +++ /dev/null @@ -1,22 +0,0 @@ - -`trace demo.MathGame primeFactors`{{execute T2}} - -Enter `Q`{{execute T2}} or `Ctrl+C` to exit - -`reset`{{execute T2}} - - -```bash -$ trace demo.MathGame primeFactors -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 92 ms, listenerId: 3 ----ts=2020-07-16 05:41:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.523823ms] demo.MathGame:primeFactors() - ---[0.004476ms] throw:java.lang.IllegalArgumentException() #46 - ----ts=2020-07-16 05:41:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.111285ms] demo.MathGame:primeFactors() - -$ reset -Affect(class count: 1 , method count: 0) cost in 5 ms, listenerId: 0 -``` diff --git a/tutorials/katacoda/command-reset-en/reset-specified-class.md b/tutorials/katacoda/command-reset-en/reset-specified-class.md deleted file mode 100644 index f14b8d56033..00000000000 --- a/tutorials/katacoda/command-reset-en/reset-specified-class.md +++ /dev/null @@ -1,22 +0,0 @@ - -`trace demo.MathGame primeFactors`{{execute T2}} - -Enter `Q`{{execute T2}} or `Ctrl+C` to exit - -`reset demo.MathGame`{{execute T2}} - - -```bash -$ trace demo.MathGame primeFactors -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 92 ms, listenerId: 3 ----ts=2020-07-16 05:41:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.523823ms] demo.MathGame:primeFactors() - ---[0.004476ms] throw:java.lang.IllegalArgumentException() #46 - ----ts=2020-07-16 05:41:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@70dea4e - ---[0.111285ms] demo.MathGame:primeFactors() - -$ reset demo.MathGame -Affect(class count: 1 , method count: 0) cost in 5 ms, listenerId: 0 -``` \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-en/reset-usage.md b/tutorials/katacoda/command-reset-en/reset-usage.md deleted file mode 100644 index ff85ae8888c..00000000000 --- a/tutorials/katacoda/command-reset-en/reset-usage.md +++ /dev/null @@ -1,22 +0,0 @@ - - `reset -h`{{execute T2}} - -```bash -$ reset -h - USAGE: - reset [-h] [-E] [class-pattern] - - SUMMARY: - Reset all the enhanced classes - - EXAMPLES: - reset - reset *List - reset -E .*List - - OPTIONS: - -h, --help this help - -E, --regex Enable regular expression to match (wildcard matching by default) - Path and classname of Pattern Matching - ``` - \ No newline at end of file diff --git a/tutorials/katacoda/command-reset-en/reset.md b/tutorials/katacoda/command-reset-en/reset.md deleted file mode 100644 index f708bc1e52d..00000000000 --- a/tutorials/katacoda/command-reset-en/reset.md +++ /dev/null @@ -1,4 +0,0 @@ - -`reset` can reset enhanced classes. All enhanced classes will be reset to their original states. When Arthas server closes, all these enhanced classes will be reset too. - -When Arthas executes commands such as watch/trace, it actually modifies the application's bytecode and inserts the enhanced code. These enhancement codes can be removed by explicitly executing the `reset`{{execute T2}} command. \ No newline at end of file diff --git a/tutorials/katacoda/command-sc-cn/arthas-boot.md b/tutorials/katacoda/command-sc-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-sc-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sc-cn/arthas-demo.md b/tutorials/katacoda/command-sc-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-sc-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-sc-cn/finish.md b/tutorials/katacoda/command-sc-cn/finish.md deleted file mode 100644 index dd431d5d9c8..00000000000 --- a/tutorials/katacoda/command-sc-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“sc”中,我们演示了了Arthas的sc命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-sc-cn/index.json b/tutorials/katacoda/command-sc-cn/index.json deleted file mode 100644 index dbef880b469..00000000000 --- a/tutorials/katacoda/command-sc-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas sc命令", - "description": "Arthas sc命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sc命令", - "text": "sc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sc-cn/intro.md b/tutorials/katacoda/command-sc-cn/intro.md deleted file mode 100644 index 0921235c4f1..00000000000 --- a/tutorials/katacoda/command-sc-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示sc命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-sc-cn/sc.md b/tutorials/katacoda/command-sc-cn/sc.md deleted file mode 100644 index 4f6bfc71bf1..00000000000 --- a/tutorials/katacoda/command-sc-cn/sc.md +++ /dev/null @@ -1,126 +0,0 @@ - -> 查看JVM已加载的类信息 - -“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 `[d]`、`[E]`、`[f]` 和 `[x:]`。 - -参数说明 ---- - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|[d]|输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
如果一个类被多个ClassLoader所加载,则会出现多次| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|[f]|输出当前类的成员变量信息(需要配合参数-d一起使用)| -|[x:]|指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 `toString` 输出| -|`[c:]`|指定class的 ClassLoader 的 hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|`[n:]`|具有详细信息的匹配类的最大数量(默认为100)| - -> class-pattern支持全限定名,如com.taobao.test.AAA,也支持com/taobao/test/AAA这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把`/`替换为`.`啦。 - -> sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开`options disable-sub-class true`开关 - -### 使用参考 - -* 模糊搜索 - - `sc demo.*`{{execute T2}} - - ```bash - $ sc demo.* - demo.MathGame - Affect(row-cnt:1) cost in 55 ms. - ``` - -* 打印类的详细信息 - - `sc -d demo.MathGame`{{execute T2}} - - ```bash - $ sc -d demo.MathGame - class-info demo.MathGame - code-source /private/tmp/math-game.jar - name demo.MathGame - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name MathGame - modifier public - annotation - interfaces - super-class +-java.lang.Object - class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 - +-sun.misc.Launcher$ExtClassLoader@66350f69 - classLoaderHash 3d4eac69 - - Affect(row-cnt:1) cost in 875 ms. - ``` - -* 指定classLoader - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ sc -c 3d4eac69 -d demo* -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`sc --classLoaderClass sun.misc.Launcher$AppClassLoader -d demo*`{{execute T2}} - - * 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda目前环境是java8。 - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -* 打印出类的Field信息 - - `sc -d -f demo.MathGame`{{execute T2}} - - ```bash - $ sc -d -f demo.MathGame - class-info demo.MathGame - code-source /private/tmp/math-game.jar - name demo.MathGame - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name MathGame - modifier public - annotation - interfaces - super-class +-java.lang.Object - class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 - +-sun.misc.Launcher$ExtClassLoader@66350f69 - classLoaderHash 3d4eac69 - fields modifierprivate,static - type java.util.Random - name random - value java.util.Random@522b4 - 08a - - modifierprivate - type int - name illegalArgumentCount - - - Affect(row-cnt:1) cost in 19 ms. - ``` - \ No newline at end of file diff --git a/tutorials/katacoda/command-sc-en/arthas-boot.md b/tutorials/katacoda/command-sc-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-sc-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sc-en/arthas-demo.md b/tutorials/katacoda/command-sc-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-sc-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-sc-en/finish.md b/tutorials/katacoda/command-sc-en/finish.md deleted file mode 100644 index 57f703cad4c..00000000000 --- a/tutorials/katacoda/command-sc-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `sc Tutorial` demonstrates the usage of sc. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-sc-en/index.json b/tutorials/katacoda/command-sc-en/index.json deleted file mode 100644 index 6f2e2a31bdd..00000000000 --- a/tutorials/katacoda/command-sc-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas sc Command", - "description": "Arthas sc Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sc Command", - "text": "sc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sc-en/intro.md b/tutorials/katacoda/command-sc-en/intro.md deleted file mode 100644 index 9152e765fd5..00000000000 --- a/tutorials/katacoda/command-sc-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of sc. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-sc-en/sc.md b/tutorials/katacoda/command-sc-en/sc.md deleted file mode 100644 index c12c874c7ec..00000000000 --- a/tutorials/katacoda/command-sc-en/sc.md +++ /dev/null @@ -1,123 +0,0 @@ - -> Search classes loaded by JVM. - -`sc` stands for search class. This command can search all possible classes loaded by JVM and show their information. The supported options are: `[d]`、`[E]`、`[f]` and `[x:]`. - -### Supported Options - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|*method-pattern*|pattern for the method name| -|`[d]`|print the details of the current class, including its code source, class specification, its class loader and so on.
If a class is loaded by more than one class loader, then the class details will be printed several times| -|`[E]`|turn on regex match, the default behavior is wildcards match| -|`[f]`|print the fields info of the current class, MUST be used with `-d` together| -|`[x:]`|specify the depth of recursive traverse the static fields, the default value is '0' - equivalent to use `toString` to output| -|`[c:]`|The hash code of the special class's classLoader| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[n:]`|Maximum number of matching classes with details (100 by default)| - -> *class-patten* supports full qualified class name, e.g. com.taobao.test.AAA and com/taobao/test/AAA. It also supports the format of 'com/taobao/test/AAA', so that it is convenient to directly copy class name from the exception stack trace without replacing '/' to '.'.

-> `sc` turns on matching sub-class match by default, that is, `sc` will also search the sub classes of the target class too. If exact-match is desired, pls. use `options disable-sub-class true`. - -### Usage - -* Wildcards match search - - `sc demo.*`{{execute T2}} - - ```bash - $ sc demo.* - demo.MathGame - Affect(row-cnt:1) cost in 55 ms. - ``` - -* View class details - - `sc -d demo.MathGame`{{execute T2}} - - ```bash - $ sc -d demo.MathGame - class-info demo.MathGame - code-source /private/tmp/math-game.jar - name demo.MathGame - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name MathGame - modifier public - annotation - interfaces - super-class +-java.lang.Object - class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 - +-sun.misc.Launcher$ExtClassLoader@66350f69 - classLoaderHash 3d4eac69 - - Affect(row-cnt:1) cost in 875 ms. - ``` - -Take a note of the classLoaderHash here:`3d4eac69`, and use it to replace `` and execute the following command. - -* Specify classLoader - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ sc -c 3d4eac69 -d demo* -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -`sc --classLoaderClass sun.misc.Launcher$AppClassLoader -d demo*`{{execute T2}} - - * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8. - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -* View class fields - - `sc -d -f demo.MathGame`{{execute T2}} - - ```bash - $ sc -d -f demo.MathGame - class-info demo.MathGame - code-source /private/tmp/math-game.jar - name demo.MathGame - isInterface false - isAnnotation false - isEnum false - isAnonymousClass false - isArray false - isLocalClass false - isMemberClass false - isPrimitive false - isSynthetic false - simple-name MathGame - modifier public - annotation - interfaces - super-class +-java.lang.Object - class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 - +-sun.misc.Launcher$ExtClassLoader@66350f69 - classLoaderHash 3d4eac69 - fields modifierprivate,static - type java.util.Random - name random - value java.util.Random@522b4 - 08a - - modifierprivate - type int - name illegalArgumentCount - - - Affect(row-cnt:1) cost in 19 ms. - ``` diff --git a/tutorials/katacoda/command-session-cn/arthas-boot.md b/tutorials/katacoda/command-session-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-session-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-session-cn/arthas-demo.md b/tutorials/katacoda/command-session-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-session-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-session-cn/finish.md b/tutorials/katacoda/command-session-cn/finish.md deleted file mode 100644 index 17dd70ca793..00000000000 --- a/tutorials/katacoda/command-session-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas session的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-session-cn/index.json b/tutorials/katacoda/command-session-cn/index.json deleted file mode 100644 index 4e87b42df6e..00000000000 --- a/tutorials/katacoda/command-session-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas session命令教程", - "description": "Arthas session命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "session 命令", - "text": "session.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-session-cn/intro.md b/tutorials/katacoda/command-session-cn/intro.md deleted file mode 100644 index 6046de5a2cb..00000000000 --- a/tutorials/katacoda/command-session-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示session命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-session-cn/session.md b/tutorials/katacoda/command-session-cn/session.md deleted file mode 100644 index 8264376cff5..00000000000 --- a/tutorials/katacoda/command-session-cn/session.md +++ /dev/null @@ -1,12 +0,0 @@ - -通过`session`命令可以查看当前会话的信息,显示JAVA_PID和SESSION_ID的值。 - -`session`{{execute T2}} - -```bash -[arthas@37]$ session - Name Value --------------------------------------------------- - JAVA_PID 37 - SESSION_ID d90541f0-d245-422c-92fa-39d4ae288107 -``` diff --git a/tutorials/katacoda/command-session-en/arthas-boot.md b/tutorials/katacoda/command-session-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-session-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-session-en/arthas-demo.md b/tutorials/katacoda/command-session-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-session-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-session-en/finish.md b/tutorials/katacoda/command-session-en/finish.md deleted file mode 100644 index bfaa9ff5a85..00000000000 --- a/tutorials/katacoda/command-session-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `session`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-session-en/index.json b/tutorials/katacoda/command-session-en/index.json deleted file mode 100644 index 3967ff7bc97..00000000000 --- a/tutorials/katacoda/command-session-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas session", - "description": "Arthas session", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "session command", - "text": "session.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-session-en/intro.md b/tutorials/katacoda/command-session-en/intro.md deleted file mode 100644 index 40983eb2eb9..00000000000 --- a/tutorials/katacoda/command-session-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of session. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-session-en/session.md b/tutorials/katacoda/command-session-en/session.md deleted file mode 100644 index d5a01cccbe2..00000000000 --- a/tutorials/katacoda/command-session-en/session.md +++ /dev/null @@ -1,12 +0,0 @@ - -`session`can examine the current session, get the values of JAVA_PID and SESSION_ID. - -`session`{{execute T2}} - -```bash -[arthas@37]$ session - Name Value --------------------------------------------------- - JAVA_PID 37 - SESSION_ID d90541f0-d245-422c-92fa-39d4ae288107 -``` diff --git a/tutorials/katacoda/command-sm-cn/arthas-boot.md b/tutorials/katacoda/command-sm-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-sm-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sm-cn/arthas-demo.md b/tutorials/katacoda/command-sm-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-sm-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-sm-cn/finish.md b/tutorials/katacoda/command-sm-cn/finish.md deleted file mode 100644 index 7ecebade36d..00000000000 --- a/tutorials/katacoda/command-sm-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“sm”中,我们演示了了Arthas的sm命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-sm-cn/index.json b/tutorials/katacoda/command-sm-cn/index.json deleted file mode 100644 index becfa3d8bd6..00000000000 --- a/tutorials/katacoda/command-sm-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas sm命令", - "description": "Arthas sm命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sm命令", - "text": "sm.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sm-cn/intro.md b/tutorials/katacoda/command-sm-cn/intro.md deleted file mode 100644 index 9b72a43a5b2..00000000000 --- a/tutorials/katacoda/command-sm-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示sm命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-sm-cn/sm.md b/tutorials/katacoda/command-sm-cn/sm.md deleted file mode 100644 index 2a5171a4682..00000000000 --- a/tutorials/katacoda/command-sm-cn/sm.md +++ /dev/null @@ -1,129 +0,0 @@ - -> 查看已加载类的方法信息 - -“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。 - -`sm` 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|[d]|展示每个方法的详细信息| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|`[c:]`|指定class的 ClassLoader 的 hashcode| -|`[classLoaderClass:]`|指定执行表达式的 ClassLoader 的 class name| -|`[n:]`|具有详细信息的匹配类的最大数量(默认为100)| - -### 使用参考 - -* 查找`java.lang.String`类的具体方法 - -`sm java.lang.String`{{execute T2}} - -```bash -$ sm java.lang.String -java.lang.String-> -java.lang.String->equals -java.lang.String->toString -java.lang.String->hashCode -java.lang.String->compareTo -java.lang.String->indexOf -java.lang.String->valueOf -java.lang.String->checkBounds -java.lang.String->length -java.lang.String->isEmpty -java.lang.String->charAt -java.lang.String->codePointAt -java.lang.String->codePointBefore -java.lang.String->codePointCount -java.lang.String->offsetByCodePoints -java.lang.String->getChars -java.lang.String->getBytes -java.lang.String->contentEquals -java.lang.String->nonSyncContentEquals -java.lang.String->equalsIgnoreCase -java.lang.String->compareToIgnoreCase -java.lang.String->regionMatches -java.lang.String->startsWith -java.lang.String->endsWith -java.lang.String->indexOfSupplementary -java.lang.String->lastIndexOf -java.lang.String->lastIndexOfSupplementary -java.lang.String->substring -java.lang.String->subSequence -java.lang.String->concat -java.lang.String->replace -java.lang.String->matches -java.lang.String->contains -java.lang.String->replaceFirst -java.lang.String->replaceAll -java.lang.String->split -java.lang.String->join -java.lang.String->toLowerCase -java.lang.String->toUpperCase -java.lang.String->trim -java.lang.String->toCharArray -java.lang.String->format -java.lang.String->copyValueOf -java.lang.String->intern -Affect(row-cnt:44) cost in 1342 ms. -``` - -* 指定ClassLoader - -查找ClassLoaderHash: - -`sc -d demo.MathGame | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d demo.MathGame | grep classLoaderHash - classLoaderHash 70dea4e -``` - -* 指定classLoader - -注意hashcode是变化的,需要先查看当前的ClassLoader信息,提取对应ClassLoader的hashcode。 - -如果你使用`-c`,你需要手动输入hashcode:`-c ` - -```bash -$ sm -c 70dea4e demo.MathGame -``` - -对于只有唯一实例的ClassLoader可以通过`--classLoaderClass`指定class name,使用起来更加方便: - -`sm --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame`{{execute T2}} - -```bash -$ sm --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame -demo.MathGame ()V -demo.MathGame primeFactors(I)Ljava/util/List; -demo.MathGame main([Ljava/lang/String;)V -demo.MathGame run()V -demo.MathGame print(ILjava/util/List;)V -Affect(row-cnt:5) cost in 2 ms. -``` - - * 注: 这里classLoaderClass 在 java 8 是 sun.misc.Launcher$AppClassLoader,而java 11的classloader是jdk.internal.loader.ClassLoaders$AppClassLoader,katacoda目前环境是java8。 - -`--classLoaderClass` 的值是ClassLoader的类名,只有匹配到唯一的ClassLoader实例时才能工作,目的是方便输入通用命令,而`-c `是动态变化的。 - -* 查找`java.lang.String#toString`函数并打印详细信息 - -`sm -d java.lang.String toString`{{execute T2}} - -```bash -$ sm -d java.lang.String toString - declaring-class java.lang.String - method-name toString - modifier public - annotation - parameters - return java.lang.String - exceptions - -Affect(row-cnt:1) cost in 3 ms. -``` diff --git a/tutorials/katacoda/command-sm-en/arthas-boot.md b/tutorials/katacoda/command-sm-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-sm-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sm-en/arthas-demo.md b/tutorials/katacoda/command-sm-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-sm-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-sm-en/finish.md b/tutorials/katacoda/command-sm-en/finish.md deleted file mode 100644 index 8a6d57f3d54..00000000000 --- a/tutorials/katacoda/command-sm-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `sm Tutorial` demonstrates the usage of sm. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-sm-en/index.json b/tutorials/katacoda/command-sm-en/index.json deleted file mode 100644 index 6a18074d300..00000000000 --- a/tutorials/katacoda/command-sm-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas sm Command", - "description": "Arthas sm Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sm Command", - "text": "sm.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sm-en/intro.md b/tutorials/katacoda/command-sm-en/intro.md deleted file mode 100644 index f109f18f8fe..00000000000 --- a/tutorials/katacoda/command-sm-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of sm. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-sm-en/sm.md b/tutorials/katacoda/command-sm-en/sm.md deleted file mode 100644 index 2ec62fd075d..00000000000 --- a/tutorials/katacoda/command-sm-en/sm.md +++ /dev/null @@ -1,128 +0,0 @@ - -> Search method from the loaded classes. - -`sm` stands for search method. This command can search and show method information from all loaded classes. `sm` can only view the methods declared on the target class, that is, methods from its parent classes are invisible. - - -### Options - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for class name| -|*method-pattern*|pattern for method name| -|`[d]`|print the details of the method| -|`[E]`|turn on regex matching while the default mode is wildcard matching| -|`[c:]`|The hash code of the special class's classLoader| -|`[classLoaderClass:]`| The class name of the ClassLoader that executes the expression. | -|`[n:]`|Maximum number of matching classes with details (100 by default)| - -### Usage - -* View methods of `java.lang.String`: - -`sm java.lang.String`{{execute T2}} - -```bash -$ sm java.lang.String -java.lang.String-> -java.lang.String->equals -java.lang.String->toString -java.lang.String->hashCode -java.lang.String->compareTo -java.lang.String->indexOf -java.lang.String->valueOf -java.lang.String->checkBounds -java.lang.String->length -java.lang.String->isEmpty -java.lang.String->charAt -java.lang.String->codePointAt -java.lang.String->codePointBefore -java.lang.String->codePointCount -java.lang.String->offsetByCodePoints -java.lang.String->getChars -java.lang.String->getBytes -java.lang.String->contentEquals -java.lang.String->nonSyncContentEquals -java.lang.String->equalsIgnoreCase -java.lang.String->compareToIgnoreCase -java.lang.String->regionMatches -java.lang.String->startsWith -java.lang.String->endsWith -java.lang.String->indexOfSupplementary -java.lang.String->lastIndexOf -java.lang.String->lastIndexOfSupplementary -java.lang.String->substring -java.lang.String->subSequence -java.lang.String->concat -java.lang.String->replace -java.lang.String->matches -java.lang.String->contains -java.lang.String->replaceFirst -java.lang.String->replaceAll -java.lang.String->split -java.lang.String->join -java.lang.String->toLowerCase -java.lang.String->toUpperCase -java.lang.String->trim -java.lang.String->toCharArray -java.lang.String->format -java.lang.String->copyValueOf -java.lang.String->intern -Affect(row-cnt:44) cost in 1342 ms. -``` - -* Specify ClassLoader - -Find ClassLoaderHash: - -`sc -d demo.MathGame | grep classLoaderHash`{{execute T2}} - -```bash -$ sc -d demo.MathGame | grep classLoaderHash - classLoaderHash 70dea4e -``` - -* Specify Classloader - -Note that the hashcode changes, you need to check the current ClassLoader information first, and extract the hashcode corresponding to the ClassLoader. - -if you use`-c`, you have to manually type hashcode by `-c `. - -```bash -$ sm -c 70dea4e demo.MathGame -``` - -For classloader with only one instance, it can be specified by `--classLoaderClass` using class name, which is more convenient to use. - -`sm --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame`{{execute T2}} - - * PS: Here the classLoaderClass in java 8 is sun.misc.Launcher$AppClassLoader, while in java 11 it's jdk.internal.loader.ClassLoaders$AppClassLoader. Currently katacoda using java 8. - -```bash -$ sm --classLoaderClass sun.misc.Launcher$AppClassLoader demo.MathGame -demo.MathGame ()V -demo.MathGame primeFactors(I)Ljava/util/List; -demo.MathGame main([Ljava/lang/String;)V -demo.MathGame run()V -demo.MathGame print(ILjava/util/List;)V -Affect(row-cnt:5) cost in 2 ms. -``` - -The value of `--classloaderclass` is the class name of classloader. It can only work when it matches a unique classloader instance. The purpose is to facilitate the input of general commands. However, `-c ` is dynamic. - -* View method `java.lang.String#toString` details: - -`sm -d java.lang.String toString`{{execute T2}} - -```bash -$ sm -d java.lang.String toString - declaring-class java.lang.String - method-name toString - modifier public - annotation - parameters - return java.lang.String - exceptions - -Affect(row-cnt:1) cost in 3 ms. -``` diff --git a/tutorials/katacoda/command-stack-cn/arthas-boot.md b/tutorials/katacoda/command-stack-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-stack-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-stack-cn/arthas-demo.md b/tutorials/katacoda/command-stack-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-stack-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-stack-cn/finish.md b/tutorials/katacoda/command-stack-cn/finish.md deleted file mode 100644 index 3ced70287b5..00000000000 --- a/tutorials/katacoda/command-stack-cn/finish.md +++ /dev/null @@ -1,12 +0,0 @@ - -在“stack”中,我们演示了了Arthas的stack命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) - diff --git a/tutorials/katacoda/command-stack-cn/index.json b/tutorials/katacoda/command-stack-cn/index.json deleted file mode 100644 index 7697d7556ff..00000000000 --- a/tutorials/katacoda/command-stack-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas stack命令", - "description": "Arthas stack命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "stack命令", - "text": "stack.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-stack-cn/intro.md b/tutorials/katacoda/command-stack-cn/intro.md deleted file mode 100644 index 7ec11e165c0..00000000000 --- a/tutorials/katacoda/command-stack-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示stack命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-stack-cn/stack.md b/tutorials/katacoda/command-stack-cn/stack.md deleted file mode 100644 index 22f6f341f8a..00000000000 --- a/tutorials/katacoda/command-stack-cn/stack.md +++ /dev/null @@ -1,76 +0,0 @@ - -> 输出当前方法被调用的调用路径 - -很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|*condition-express*|条件表达式| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|`[n:]`|执行次数限制| - -这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。 - -观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。 - -* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) -* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -### 使用例子 - -#### stack - -`stack demo.MathGame primeFactors`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ stack demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. -ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) -``` - -#### 据条件表达式来过滤 - -`stack demo.MathGame primeFactors 'params[0]<0' -n 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ stack demo.MathGame primeFactors 'params[0]<0' -n 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 30 ms. -ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) - -ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) - -Command execution times exceed limit: 2, so command will exit. You can set it with -n option. -``` - - -#### 据执行时间来过滤 - -`stack demo.MathGame primeFactors '#cost>5'`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ stack demo.MathGame primeFactors '#cost>5' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 35 ms. -ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) -``` - diff --git a/tutorials/katacoda/command-stack-en/arthas-boot.md b/tutorials/katacoda/command-stack-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-stack-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-stack-en/arthas-demo.md b/tutorials/katacoda/command-stack-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-stack-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-stack-en/finish.md b/tutorials/katacoda/command-stack-en/finish.md deleted file mode 100644 index fc16dcf89e5..00000000000 --- a/tutorials/katacoda/command-stack-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `stack Tutorial` demonstrates the usage of stack. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-stack-en/index.json b/tutorials/katacoda/command-stack-en/index.json deleted file mode 100644 index 90bd1d8597d..00000000000 --- a/tutorials/katacoda/command-stack-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas stack Command", - "description": "Arthas stack Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "stack Command", - "text": "stack.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-stack-en/intro.md b/tutorials/katacoda/command-stack-en/intro.md deleted file mode 100644 index bb00dd99063..00000000000 --- a/tutorials/katacoda/command-stack-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of stack. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-stack-en/stack.md b/tutorials/katacoda/command-stack-en/stack.md deleted file mode 100644 index 5b1778b1237..00000000000 --- a/tutorials/katacoda/command-stack-en/stack.md +++ /dev/null @@ -1,77 +0,0 @@ - -> Print out the full call stack of the current method. - -Most often we know one method gets called, but we have no idea on which code path gets executed or when the method gets called since there are so many code paths to the target method. The command `stack` comes to rescue in this difficult situation. - -### Parameters - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|*method-pattern*|pattern for the method name| -|*condition-expression*|condition expression| -|`[E]`|turn on regex match, the default behavior is wildcard match| -|`[n:]`|execution times| - -There's one thing worthy noting here is observation expression. The observation expression supports OGNL grammar, for example, you can come up a expression like this `"{params,returnObj}"`. All OGNL expressions are supported as long as they are legal to the grammar. - -Thanks for `advice`'s data structure, it is possible to observe from varieties of different angles. Inside `advice` parameter, all necessary information for notification can be found. - -* Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage -* OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -### Usage - -#### stack - -`stack demo.MathGame primeFactors`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ stack demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. -ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) -``` - -#### Filtering by condition expression - -`stack demo.MathGame primeFactors 'params[0]<0' -n 2`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ stack demo.MathGame primeFactors 'params[0]<0' -n 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 30 ms. -ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) - -ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) - -Command execution times exceed limit: 2, so command will exit. You can set it with -n option. -``` - - -#### Filtering by cost - -`stack demo.MathGame primeFactors '#cost>5'`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ stack demo.MathGame primeFactors '#cost>5' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 35 ms. -ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - @demo.MathGame.run() - at demo.MathGame.main(MathGame.java:16) -``` - - diff --git a/tutorials/katacoda/command-sysenv-cn/arthas-boot.md b/tutorials/katacoda/command-sysenv-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sysenv-cn/arthas-demo.md b/tutorials/katacoda/command-sysenv-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-sysenv-cn/auto-completion.md b/tutorials/katacoda/command-sysenv-cn/auto-completion.md deleted file mode 100644 index 37cab23ed3d..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/auto-completion.md +++ /dev/null @@ -1,10 +0,0 @@ - -Arthas支持丰富的自动补全功能,在使用有疑惑时,可以输入`Tab`来获取更多信息。 - -比如输入 `sysenv US` 之后,再输入`Tab`,会补全出对应的key: - -``` -$ sysenv US -USER -... -``` diff --git a/tutorials/katacoda/command-sysenv-cn/check-all-properties.md b/tutorials/katacoda/command-sysenv-cn/check-all-properties.md deleted file mode 100644 index c6474d432ba..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/check-all-properties.md +++ /dev/null @@ -1,38 +0,0 @@ - -`sysenv`{{execute T2}} - -```bash -$ sysenv - KEY VALUE ----------------------------------------------------------------------------------------------------------------------------- - PATH /Users/admin/.sdkman/candidates/visualvm/current/bin:/Users/admin/.sdkman/candidates/ja - va/current/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/ - MacOS - SDKMAN_VERSION 5.7.3+337 - JAVA_HOME /Users/admin/.sdkman/candidates/java/current - JAVA_MAIN_CLASS_65244 demo.MathGame - TERM xterm-256color - LANG zh_CN.UTF-8 - AUTOJUMP_SOURCED 1 - COLORTERM truecolor - LOGNAME admin - XPC_SERVICE_NAME 0 - PWD /Users/admin/code/ali/arthas/demo - TERM_PROGRAM_VERSION 3.2.5 - _ /Users/admin/.sdkman/candidates/java/current/bin/java - SHELL /bin/bash - TERM_PROGRAM iTerm.app - SDKMAN_PLATFORM Darwin - USER admin - ITERM_PROFILE Default - TMPDIR /var/folders/0r/k561bkk917gg972stqclbz9h0000gn/T/ - XPC_FLAGS 0x0 - TERM_SESSION_ID w0t4p0:60BC264D-9649-42AC-A7E4-AF85B69F93F8 - __CF_USER_TEXT_ENCODING 0x1F5:0x19:0x34 - Apple_PubSub_Socket_Ren /private/tmp/com.apple.launchd.DwmmjSQsll/Render - der - COLORFGBG 7;0 - HOME /Users/admin - SHLVL 1 - AUTOJUMP_ERROR_PATH /Users/admin/Library/autojump/errors.log -``` diff --git a/tutorials/katacoda/command-sysenv-cn/check-one-single-property.md b/tutorials/katacoda/command-sysenv-cn/check-one-single-property.md deleted file mode 100644 index b883610dbd3..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/check-one-single-property.md +++ /dev/null @@ -1,7 +0,0 @@ - -`sysenv USER`{{execute T2}} - -```bash -$ sysenv USER -USER=admin -``` diff --git a/tutorials/katacoda/command-sysenv-cn/completion-of-history-commands.md b/tutorials/katacoda/command-sysenv-cn/completion-of-history-commands.md deleted file mode 100644 index 1f9dc71e3cb..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/completion-of-history-commands.md +++ /dev/null @@ -1,8 +0,0 @@ - -支持通过`TAB`键自动补全 - -如果想再执行之前的命令,可以在输入一半时,按`Up/↑` 或者 `Ddown/↓`,来匹配到之前的命令。 - -比如之前执行过`sysenv USER`,那么在输入`sysenv US`之后,可以输入`Up/↑`,就会自动补全为`sysenv USER`。 - -如果想查看所有的历史命令,也可以通过 `history`{{execute T2}} 命令查看到。 diff --git a/tutorials/katacoda/command-sysenv-cn/finish.md b/tutorials/katacoda/command-sysenv-cn/finish.md deleted file mode 100644 index d8b886f6181..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“sysenv”中,我们演示了了Arthas的sysenv命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-sysenv-cn/index.json b/tutorials/katacoda/command-sysenv-cn/index.json deleted file mode 100644 index 1f5780d4746..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/index.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "title": "Arthas sysenv命令", - "description": "Arthas sysenv命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sysenv命令", - "text": "sysenv.md" - }, - { - "title": "查看所有环境变量", - "text": "check-all-properties.md" - }, - { - "title": "查看单个环境变量", - "text": "check-one-single-property.md" - }, - { - "title": "自动补全", - "text": "auto-completion.md" - }, - { - "title": "历史命令的补全", - "text": "completion-of-history-commands.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sysenv-cn/intro.md b/tutorials/katacoda/command-sysenv-cn/intro.md deleted file mode 100644 index 57909ea4646..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示sysenv命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-sysenv-cn/sysenv.md b/tutorials/katacoda/command-sysenv-cn/sysenv.md deleted file mode 100644 index 4d273fcb2b3..00000000000 --- a/tutorials/katacoda/command-sysenv-cn/sysenv.md +++ /dev/null @@ -1,25 +0,0 @@ - -`sysenv`{{execute T2}} 命令可以查看当前JVM的环境属性(`System Property`),与`sysprop`类似 - -## 使用参考 - -`sysenv -h`{{execute T2}} - -``` - USAGE: - sysenv [-h] [env-name] - - SUMMARY: - Display the system env. - - EXAMPLES: - sysenv - sysenv USER - - WIKI: - https://arthas.aliyun.com/doc/sysenv - - OPTIONS: - -h, --help this help - env name -``` diff --git a/tutorials/katacoda/command-sysenv-en/arthas-boot.md b/tutorials/katacoda/command-sysenv-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-sysenv-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sysenv-en/arthas-demo.md b/tutorials/katacoda/command-sysenv-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-sysenv-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-sysenv-en/auto-completion.md b/tutorials/katacoda/command-sysenv-en/auto-completion.md deleted file mode 100644 index 2359c3a43e9..00000000000 --- a/tutorials/katacoda/command-sysenv-en/auto-completion.md +++ /dev/null @@ -1,10 +0,0 @@ - -Arthas supports a wide range of auto-completion features, and you can type `Tab` to get more information when you have doubts about your use. - -For example, after typing `sysenv US`, enter `Tab`, which will complete the corresponding key: - -``` -$ sysenv US -USER -... -``` diff --git a/tutorials/katacoda/command-sysenv-en/check-all-properties.md b/tutorials/katacoda/command-sysenv-en/check-all-properties.md deleted file mode 100644 index c6474d432ba..00000000000 --- a/tutorials/katacoda/command-sysenv-en/check-all-properties.md +++ /dev/null @@ -1,38 +0,0 @@ - -`sysenv`{{execute T2}} - -```bash -$ sysenv - KEY VALUE ----------------------------------------------------------------------------------------------------------------------------- - PATH /Users/admin/.sdkman/candidates/visualvm/current/bin:/Users/admin/.sdkman/candidates/ja - va/current/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/ - MacOS - SDKMAN_VERSION 5.7.3+337 - JAVA_HOME /Users/admin/.sdkman/candidates/java/current - JAVA_MAIN_CLASS_65244 demo.MathGame - TERM xterm-256color - LANG zh_CN.UTF-8 - AUTOJUMP_SOURCED 1 - COLORTERM truecolor - LOGNAME admin - XPC_SERVICE_NAME 0 - PWD /Users/admin/code/ali/arthas/demo - TERM_PROGRAM_VERSION 3.2.5 - _ /Users/admin/.sdkman/candidates/java/current/bin/java - SHELL /bin/bash - TERM_PROGRAM iTerm.app - SDKMAN_PLATFORM Darwin - USER admin - ITERM_PROFILE Default - TMPDIR /var/folders/0r/k561bkk917gg972stqclbz9h0000gn/T/ - XPC_FLAGS 0x0 - TERM_SESSION_ID w0t4p0:60BC264D-9649-42AC-A7E4-AF85B69F93F8 - __CF_USER_TEXT_ENCODING 0x1F5:0x19:0x34 - Apple_PubSub_Socket_Ren /private/tmp/com.apple.launchd.DwmmjSQsll/Render - der - COLORFGBG 7;0 - HOME /Users/admin - SHLVL 1 - AUTOJUMP_ERROR_PATH /Users/admin/Library/autojump/errors.log -``` diff --git a/tutorials/katacoda/command-sysenv-en/check-one-single-property.md b/tutorials/katacoda/command-sysenv-en/check-one-single-property.md deleted file mode 100644 index b883610dbd3..00000000000 --- a/tutorials/katacoda/command-sysenv-en/check-one-single-property.md +++ /dev/null @@ -1,7 +0,0 @@ - -`sysenv USER`{{execute T2}} - -```bash -$ sysenv USER -USER=admin -``` diff --git a/tutorials/katacoda/command-sysenv-en/completion-of-history-commands.md b/tutorials/katacoda/command-sysenv-en/completion-of-history-commands.md deleted file mode 100644 index 4f83bd9547d..00000000000 --- a/tutorials/katacoda/command-sysenv-en/completion-of-history-commands.md +++ /dev/null @@ -1,6 +0,0 @@ - -If you want to execute the previous command again, you can match the previous command by pressing `Up/↑` or `Ddown/↓` when you enter halfway. - -For example, if `sysenv USER` was executed before, then after entering `sysenv US`, you can type `Up/↑`, and it will be automatically completed as `sysenv USER`. - -If you want to see all the history commands, you can also view them with the `history`{{execute T2}} command. diff --git a/tutorials/katacoda/command-sysenv-en/finish.md b/tutorials/katacoda/command-sysenv-en/finish.md deleted file mode 100644 index c764c2707bb..00000000000 --- a/tutorials/katacoda/command-sysenv-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `sysenv Tutorial` demonstrates the usage of sysenv. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-sysenv-en/index.json b/tutorials/katacoda/command-sysenv-en/index.json deleted file mode 100644 index 5fc38d0b7da..00000000000 --- a/tutorials/katacoda/command-sysenv-en/index.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "title": "Arthas sysenv Command", - "description": "Arthas sysenv Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sysenv Command", - "text": "sysenv.md" - }, - { - "title": "Check all environment variables", - "text": "check-all-properties.md" - }, - { - "title": "Check One Single environment variable", - "text": "check-one-single-property.md" - }, - { - "title": "Auto completion", - "text": "auto-completion.md" - }, - { - "title": "Completion of history commands", - "text": "completion-of-history-commands.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-sysenv-en/intro.md b/tutorials/katacoda/command-sysenv-en/intro.md deleted file mode 100644 index 96ebffe58e0..00000000000 --- a/tutorials/katacoda/command-sysenv-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of sysenv. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-sysenv-en/sysenv.md b/tutorials/katacoda/command-sysenv-en/sysenv.md deleted file mode 100644 index cd964ff453c..00000000000 --- a/tutorials/katacoda/command-sysenv-en/sysenv.md +++ /dev/null @@ -1,25 +0,0 @@ - -The `sysenv`{{execute T2}} command allows you to view the current JVM environment variables. (Similar to `sysenv`.) - -## Usage - -`sysenv -h`{{execute T2}} - -``` - USAGE: - sysenv [-h] [env-name] - - SUMMARY: - Display the system env. - - EXAMPLES: - sysenv - sysenv USER - - WIKI: - https://arthas.aliyun.com/doc/sysenv - - OPTIONS: - -h, --help this help - env name -``` diff --git a/tutorials/katacoda/command-sysprop-cn/arthas-boot.md b/tutorials/katacoda/command-sysprop-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sysprop-cn/arthas-demo.md b/tutorials/katacoda/command-sysprop-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-sysprop-cn/auto-completion.md b/tutorials/katacoda/command-sysprop-cn/auto-completion.md deleted file mode 100644 index 0d7526e1611..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/auto-completion.md +++ /dev/null @@ -1,11 +0,0 @@ - -Arthas支持丰富的自动补全功能,在使用有疑惑时,可以输入`Tab`来获取更多信息。 - -比如输入 `sysprop java.` 之后,再输入`Tab`,会补全出对应的key: - -``` -$ sysprop java. -java.runtime.name java.protocol.handler.pkgs java.vm.version -java.vm.vendor java.vendor.url java.vm.name -... -``` diff --git a/tutorials/katacoda/command-sysprop-cn/check-all-properties.md b/tutorials/katacoda/command-sysprop-cn/check-all-properties.md deleted file mode 100644 index 8e9c7a4347b..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/check-all-properties.md +++ /dev/null @@ -1,75 +0,0 @@ - -`sysprop`{{execute T2}} - -```bash -$ sysprop - KEY VALUE -------------------------------------------------------------------------------------------------------------------------------------- - java.runtime.name Java(TM) SE Runtime Environment - sun.boot.library.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib - java.vm.version 25.51-b03 - user.country.format CN - gopherProxySet false - java.vm.vendor Oracle Corporation - java.vendor.url http://java.oracle.com/ - path.separator : - java.vm.name Java HotSpot(TM) 64-Bit Server VM - file.encoding.pkg sun.io - user.country US - sun.java.launcher SUN_STANDARD - sun.os.patch.level unknown - java.vm.specification.name Java Virtual Machine Specification - user.dir /private/var/tmp - java.runtime.version 1.8.0_51-b16 - java.awt.graphicsenv sun.awt.CGraphicsEnvironment - java.endorsed.dirs /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endors - ed - os.arch x86_64 - java.io.tmpdir /var/folders/2c/tbxwzs4s4sbcvh7frbcc7n000000gn/T/ - line.separator - - java.vm.specification.vendor Oracle Corporation - os.name Mac OS X - sun.jnu.encoding UTF-8 - java.library.path /Users/wangtao/Library/Java/Extensions:/Library/Java/Extensions:/Network/Libra - ry/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. - sun.nio.ch.bugLevel - java.specification.name Java Platform API Specification - java.class.version 52.0 - sun.management.compiler HotSpot 64-Bit Tiered Compilers - os.version 10.12.6 - user.home /Users/wangtao - user.timezone Asia/Shanghai - java.awt.printerjob sun.lwawt.macosx.CPrinterJob - file.encoding UTF-8 - java.specification.version 1.8 - user.name wangtao - java.class.path . - java.vm.specification.version 1.8 - sun.arch.data.model 64 - java.home /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre - sun.java.command Test - java.specification.vendor Oracle Corporation - user.language en - awt.toolkit sun.lwawt.macosx.LWCToolkit - java.vm.info mixed mode - java.version 1.8.0_51 - java.ext.dirs /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1. - 8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library - /Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java - sun.boot.class.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resour - ces.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/li - b/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/l - ib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/H - ome/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Content - s/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Conte - nts/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jd - k/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51. - jdk/Contents/Home/jre/classes - java.vendor Oracle Corporation - file.separator / - java.vendor.url.bug http://bugreport.sun.com/bugreport/ - sun.cpu.endian little - sun.io.unicode.encoding UnicodeBig - sun.cpu.isalist -``` diff --git a/tutorials/katacoda/command-sysprop-cn/check-one-single-property.md b/tutorials/katacoda/command-sysprop-cn/check-one-single-property.md deleted file mode 100644 index de937cc8cbc..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/check-one-single-property.md +++ /dev/null @@ -1,21 +0,0 @@ - -`sysprop java.version`{{execute T2}} - -```bash -$ sysprop java.version -java.version=1.8.0_51 -``` - -## 修改单个属性 - -`sysprop user.country`{{execute T2}} - -`sysprop user.country CN`{{execute T2}} - -```bash -$ sysprop user.country -user.country=US -$ sysprop user.country CN -Successfully changed the system property. -user.country=CN -``` diff --git a/tutorials/katacoda/command-sysprop-cn/completion-of-history-commands.md b/tutorials/katacoda/command-sysprop-cn/completion-of-history-commands.md deleted file mode 100644 index d2153e3a374..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/completion-of-history-commands.md +++ /dev/null @@ -1,8 +0,0 @@ - -支持通过`TAB`键自动补全 - -如果想再执行之前的命令,可以在输入一半时,按`Up/↑` 或者 `Ddown/↓`,来匹配到之前的命令。 - -比如之前执行过`sysprop java.version`,那么在输入`sysprop ja`之后,可以输入`Up/↑`,就会自动补全为`sysprop java.version`。 - -如果想查看所有的历史命令,也可以通过 `history`{{execute T2}} 命令查看到。 diff --git a/tutorials/katacoda/command-sysprop-cn/finish.md b/tutorials/katacoda/command-sysprop-cn/finish.md deleted file mode 100644 index 67e0c0fc178..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“sysprop”中,我们演示了了Arthas的sysprop命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-sysprop-cn/index.json b/tutorials/katacoda/command-sysprop-cn/index.json deleted file mode 100644 index a6e44ee303f..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/index.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "title": "Arthas sysprop命令", - "description": "Arthas sysprop命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sysprop命令", - "text": "sysprop.md" - }, - { - "title": "查看所有属性", - "text": "check-all-properties.md" - }, - { - "title": "查看单个属性", - "text": "check-one-single-property.md" - }, - { - "title": "自动补全", - "text": "auto-completion.md" - }, - { - "title": "历史命令的补全", - "text": "completion-of-history-commands.md" - }, - { - "title": "管道", - "text": "pipeline.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-sysprop-cn/intro.md b/tutorials/katacoda/command-sysprop-cn/intro.md deleted file mode 100644 index 1d576a0f1b1..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示sysprop命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-sysprop-cn/pipeline.md b/tutorials/katacoda/command-sysprop-cn/pipeline.md deleted file mode 100644 index 778009e9d87..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/pipeline.md +++ /dev/null @@ -1,10 +0,0 @@ - -Arthas支持在pipeline之后,执行一些简单的命令,比如: - -`sysprop | grep java`{{execute T2}} - -`sysprop | wc -l`{{execute T2}} - -## 通过`grep`来过滤 - -`sysprop | grep user`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/command-sysprop-cn/sysprop.md b/tutorials/katacoda/command-sysprop-cn/sysprop.md deleted file mode 100644 index 7eeb7bd4cad..00000000000 --- a/tutorials/katacoda/command-sysprop-cn/sysprop.md +++ /dev/null @@ -1,27 +0,0 @@ - -`sysprop`{{execute T2}} 命令可以查看当前JVM的系统属性(`System Property`) - -## 使用参考 - -`sysprop -h`{{execute T2}} - -``` -USAGE: - sysprop [-h] [property-name] [property-value] - - SUMMARY: - Display, and change all the system properties. - - EXAMPLES: - sysprop - sysprop file.encoding - sysprop production.mode true - - WIKI: - https://arthas.aliyun.com/doc/sysprop - - OPTIONS: - -h, --help this help - property name - property value -``` diff --git a/tutorials/katacoda/command-sysprop-en/arthas-boot.md b/tutorials/katacoda/command-sysprop-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-sysprop-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-sysprop-en/arthas-demo.md b/tutorials/katacoda/command-sysprop-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-sysprop-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-sysprop-en/auto-completion.md b/tutorials/katacoda/command-sysprop-en/auto-completion.md deleted file mode 100644 index 360a3e54364..00000000000 --- a/tutorials/katacoda/command-sysprop-en/auto-completion.md +++ /dev/null @@ -1,11 +0,0 @@ - -Arthas supports a wide range of auto-completion features, and you can type `Tab` to get more information when you have doubts about your use. - -For example, after typing `sysprop java.`, enter `Tab`, which will complete the corresponding key: - -``` -$ sysprop java. -java.runtime.name java.protocol.handler.pkgs java.vm.version -java.vm.vendor java.vendor.url java.vm.name -... -``` diff --git a/tutorials/katacoda/command-sysprop-en/check-all-properties.md b/tutorials/katacoda/command-sysprop-en/check-all-properties.md deleted file mode 100644 index 8e9c7a4347b..00000000000 --- a/tutorials/katacoda/command-sysprop-en/check-all-properties.md +++ /dev/null @@ -1,75 +0,0 @@ - -`sysprop`{{execute T2}} - -```bash -$ sysprop - KEY VALUE -------------------------------------------------------------------------------------------------------------------------------------- - java.runtime.name Java(TM) SE Runtime Environment - sun.boot.library.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib - java.vm.version 25.51-b03 - user.country.format CN - gopherProxySet false - java.vm.vendor Oracle Corporation - java.vendor.url http://java.oracle.com/ - path.separator : - java.vm.name Java HotSpot(TM) 64-Bit Server VM - file.encoding.pkg sun.io - user.country US - sun.java.launcher SUN_STANDARD - sun.os.patch.level unknown - java.vm.specification.name Java Virtual Machine Specification - user.dir /private/var/tmp - java.runtime.version 1.8.0_51-b16 - java.awt.graphicsenv sun.awt.CGraphicsEnvironment - java.endorsed.dirs /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endors - ed - os.arch x86_64 - java.io.tmpdir /var/folders/2c/tbxwzs4s4sbcvh7frbcc7n000000gn/T/ - line.separator - - java.vm.specification.vendor Oracle Corporation - os.name Mac OS X - sun.jnu.encoding UTF-8 - java.library.path /Users/wangtao/Library/Java/Extensions:/Library/Java/Extensions:/Network/Libra - ry/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. - sun.nio.ch.bugLevel - java.specification.name Java Platform API Specification - java.class.version 52.0 - sun.management.compiler HotSpot 64-Bit Tiered Compilers - os.version 10.12.6 - user.home /Users/wangtao - user.timezone Asia/Shanghai - java.awt.printerjob sun.lwawt.macosx.CPrinterJob - file.encoding UTF-8 - java.specification.version 1.8 - user.name wangtao - java.class.path . - java.vm.specification.version 1.8 - sun.arch.data.model 64 - java.home /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre - sun.java.command Test - java.specification.vendor Oracle Corporation - user.language en - awt.toolkit sun.lwawt.macosx.LWCToolkit - java.vm.info mixed mode - java.version 1.8.0_51 - java.ext.dirs /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1. - 8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library - /Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java - sun.boot.class.path /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resour - ces.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/li - b/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/l - ib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/H - ome/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Content - s/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Conte - nts/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jd - k/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51. - jdk/Contents/Home/jre/classes - java.vendor Oracle Corporation - file.separator / - java.vendor.url.bug http://bugreport.sun.com/bugreport/ - sun.cpu.endian little - sun.io.unicode.encoding UnicodeBig - sun.cpu.isalist -``` diff --git a/tutorials/katacoda/command-sysprop-en/check-one-single-property.md b/tutorials/katacoda/command-sysprop-en/check-one-single-property.md deleted file mode 100644 index 26035aaab35..00000000000 --- a/tutorials/katacoda/command-sysprop-en/check-one-single-property.md +++ /dev/null @@ -1,19 +0,0 @@ - -`sysprop java.version`{{execute T2}} - -```bash -$ sysprop java.version -java.version=1.8.0_51 -``` - -`sysprop user.country`{{execute T2}} - -`sysprop user.country CN`{{execute T2}} - -```bash -$ sysprop user.country -user.country=US -$ sysprop user.country CN -Successfully changed the system property. -user.country=CN -``` diff --git a/tutorials/katacoda/command-sysprop-en/completion-of-history-commands.md b/tutorials/katacoda/command-sysprop-en/completion-of-history-commands.md deleted file mode 100644 index 24bdc9cec8f..00000000000 --- a/tutorials/katacoda/command-sysprop-en/completion-of-history-commands.md +++ /dev/null @@ -1,6 +0,0 @@ - -If you want to execute the previous command again, you can match the previous command by pressing `Up/↑` or `Ddown/↓` when you enter halfway. - -For example, if `sysprop java.version` was executed before, then after entering `sysprop ja`, you can type `Up/↑`, and it will be automatically completed as `sysprop java.version`. - -If you want to see all the history commands, you can also view them with the `history`{{execute T2}} command. diff --git a/tutorials/katacoda/command-sysprop-en/finish.md b/tutorials/katacoda/command-sysprop-en/finish.md deleted file mode 100644 index 3d5b8c9309a..00000000000 --- a/tutorials/katacoda/command-sysprop-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `sysprop Tutorial` demonstrates the usage of sysprop. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-sysprop-en/index.json b/tutorials/katacoda/command-sysprop-en/index.json deleted file mode 100644 index 7722ac07514..00000000000 --- a/tutorials/katacoda/command-sysprop-en/index.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "title": "Arthas sysprop Command", - "description": "Arthas sysprop Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "sysprop Command", - "text": "sysprop.md" - }, - { - "title": "Check all properties", - "text": "check-all-properties.md" - }, - { - "title": "Check One Single Property", - "text": "check-one-single-property.md" - }, - { - "title": "Auto completion", - "text": "auto-completion.md" - }, - { - "title": "Completion of history commands", - "text": "completion-of-history-commands.md" - }, - { - "title": "Pipeline", - "text": "pipeline.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-sysprop-en/intro.md b/tutorials/katacoda/command-sysprop-en/intro.md deleted file mode 100644 index cb3a5d646e8..00000000000 --- a/tutorials/katacoda/command-sysprop-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of sysprop. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-sysprop-en/pipeline.md b/tutorials/katacoda/command-sysprop-en/pipeline.md deleted file mode 100644 index 312c16d130e..00000000000 --- a/tutorials/katacoda/command-sysprop-en/pipeline.md +++ /dev/null @@ -1,11 +0,0 @@ - -Arthas supports some simple commands after the pipeline, such as: - -`sysprop | grep java`{{execute T2}} - -`sysprop | wc -l`{{execute T2}} - - -## filtered by `grep` - -`sysprop | grep user`{{execute T2}} diff --git a/tutorials/katacoda/command-sysprop-en/sysprop.md b/tutorials/katacoda/command-sysprop-en/sysprop.md deleted file mode 100644 index bac07a51166..00000000000 --- a/tutorials/katacoda/command-sysprop-en/sysprop.md +++ /dev/null @@ -1,27 +0,0 @@ - -The `sysprop`{{execute T2}} command allows you to examine the system properties from the target JVM. - -## Usage - -`sysprop -h`{{execute T2}} - -``` -USAGE: - sysprop [-h] [property-name] [property-value] - - SUMMARY: - Display, and change all the system properties. - - EXAMPLES: - sysprop - sysprop file.encoding - sysprop production.mode true - - WIKI: - https://arthas.aliyun.com/doc/sysprop - - OPTIONS: - -h, --help this help - property name - property value -``` diff --git a/tutorials/katacoda/command-tee-cn/arthas-boot.md b/tutorials/katacoda/command-tee-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-tee-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-tee-cn/arthas-demo.md b/tutorials/katacoda/command-tee-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-tee-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-tee-cn/finish.md b/tutorials/katacoda/command-tee-cn/finish.md deleted file mode 100644 index d932bf6d769..00000000000 --- a/tutorials/katacoda/command-tee-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas tee的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-tee-cn/index.json b/tutorials/katacoda/command-tee-cn/index.json deleted file mode 100644 index 3441ecc58c3..00000000000 --- a/tutorials/katacoda/command-tee-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas tee命令教程", - "description": "Arthas tee命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "tee 命令", - "text": "tee.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-tee-cn/intro.md b/tutorials/katacoda/command-tee-cn/intro.md deleted file mode 100644 index fc9c88f9f8d..00000000000 --- a/tutorials/katacoda/command-tee-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示tee命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-tee-cn/tee.md b/tutorials/katacoda/command-tee-cn/tee.md deleted file mode 100644 index d7e0430e964..00000000000 --- a/tutorials/katacoda/command-tee-cn/tee.md +++ /dev/null @@ -1,44 +0,0 @@ - -类似传统的`tee`命令 用于读取标准输入的数据,并将其内容输出成文件。 - -tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。 - -`tee -h`{{execute T2}} - -```bash - USAGE: - tee [-a] [-h] [file] - - SUMMARY: - tee command for pipes. - - EXAMPLES: - sysprop | tee /path/to/logfile | grep java - sysprop | tee -a /path/to/logfile | grep java - - WIKI: - https://arthas.aliyun.com/doc/tee - - OPTIONS: - -a, --append Append to file - -h, --help this help - File path -``` - -## 命令示范 - -### 将sysprop命令执行结果另外存储在`/tmp/logfile`中 - -`sysprop | tee /tmp/logfile`{{execute T2}} - -查看`/tmp/logfile`文件: - -`cat /tmp/logfile`{{execute T2}} - -### 将sysprop命令执行结果匹配`java`后另外追加在`/tmp/logfile`中 - -`sysprop | grep java | tee -a /path/to/logfile`{{execute T2}} - -查看`/tmp/logfile`文件: - -`cat /tmp/logfile`{{execute T2}} diff --git a/tutorials/katacoda/command-tee-en/arthas-boot.md b/tutorials/katacoda/command-tee-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-tee-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-tee-en/arthas-demo.md b/tutorials/katacoda/command-tee-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-tee-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-tee-en/finish.md b/tutorials/katacoda/command-tee-en/finish.md deleted file mode 100644 index d98136d26aa..00000000000 --- a/tutorials/katacoda/command-tee-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `tee`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-tee-en/index.json b/tutorials/katacoda/command-tee-en/index.json deleted file mode 100644 index 87be49dc666..00000000000 --- a/tutorials/katacoda/command-tee-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas tee", - "description": "Arthas tee", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "tee command", - "text": "tee.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-tee-en/intro.md b/tutorials/katacoda/command-tee-en/intro.md deleted file mode 100644 index 48cd32dd4c9..00000000000 --- a/tutorials/katacoda/command-tee-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of tee. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-tee-en/tee.md b/tutorials/katacoda/command-tee-en/tee.md deleted file mode 100644 index 77b18b3c28f..00000000000 --- a/tutorials/katacoda/command-tee-en/tee.md +++ /dev/null @@ -1,44 +0,0 @@ - -Similar to the traditional `tee` command, it is used to read standard input data and output its contents into a file. - -`tee` will read data from standard input device, output its content to standard output device, and save it as a file. - -`tee -h`{{execute T2}} - -```bash - USAGE: - tee [-a] [-h] [file] - - SUMMARY: - tee command for pipes. - - EXAMPLES: - sysprop | tee /path/to/logfile | grep java - sysprop | tee -a /path/to/logfile | grep java - - WIKI: - https://arthas.aliyun.com/doc/tee - - OPTIONS: - -a, --append Append to file - -h, --help this help - File path -``` - -## Examples - -### Store sysprop execution result into `/tmp/logfile` - -`sysprop | tee /tmp/logfile`{{execute T2}} - -Check `/tmp/logfile`: - -`cat /tmp/logfile`{{execute T2}} - -### Append sysprop matching `java` result into `/tmp/logfile` - -`sysprop | grep java | tee -a /path/to/logfile`{{execute T2}} - -Check `/tmp/logfile`: - -`cat /tmp/logfile`{{execute T2}} diff --git a/tutorials/katacoda/command-thread-cn/CPU-ratios-calculate.md b/tutorials/katacoda/command-thread-cn/CPU-ratios-calculate.md deleted file mode 100644 index 712da17b08e..00000000000 --- a/tutorials/katacoda/command-thread-cn/CPU-ratios-calculate.md +++ /dev/null @@ -1,15 +0,0 @@ - -### cpu使用率是如何统计出来的? - -这里的cpu使用率与linux 命令`top -H -p ` 的线程`%CPU`类似,一段采样间隔时间内,当前JVM里各个线程的增量cpu时间与采样间隔时间的比例。 - -> 工作原理说明: - -* 首先第一次采样,获取所有线程的CPU时间(调用的是`java.lang.management.ThreadMXBean#getThreadCpuTime()`及`sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()`接口) -* 然后睡眠等待一个间隔时间(默认为200ms,可以通过`-i`指定间隔时间) -* 再次第二次采样,获取所有线程的CPU时间,对比两次采样数据,计算出每个线程的增量CPU时间 -* 线程CPU使用率 = 线程增量CPU时间 / 采样间隔时间 * 100% - -> 注意: 这个统计也会产生一定的开销(JDK这个接口本身开销比较大),因此会看到as的线程占用一定的百分比,为了降低统计自身的开销带来的影响,可以把采样间隔拉长一些,比如5000毫秒。 - -> 另外一种查看Java进程的线程cpu使用率方法:可以使用[`show-busy-java-threads`](https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/java.md#-show-busy-java-threads)这个脚本。 diff --git a/tutorials/katacoda/command-thread-cn/arthas-boot.md b/tutorials/katacoda/command-thread-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-thread-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-thread-cn/arthas-demo.md b/tutorials/katacoda/command-thread-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-thread-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-thread-cn/finish.md b/tutorials/katacoda/command-thread-cn/finish.md deleted file mode 100644 index 9f6316a0c35..00000000000 --- a/tutorials/katacoda/command-thread-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“thread”中,我们演示了了Arthas的thread命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-thread-cn/index.json b/tutorials/katacoda/command-thread-cn/index.json deleted file mode 100644 index e2dc45e007b..00000000000 --- a/tutorials/katacoda/command-thread-cn/index.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Arthas thread命令", - "description": "Arthas thread命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Thread命令", - "text": "thread.md" - }, - { - "title": "cpu占比是如何统计出来的?", - "text": "CPU-ratios-calculate.md" - }, - { - "title": "Thread用法", - "text": "thread-usage.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-thread-cn/intro.md b/tutorials/katacoda/command-thread-cn/intro.md deleted file mode 100644 index 20c450c555c..00000000000 --- a/tutorials/katacoda/command-thread-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示thread命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-thread-cn/thread-usage.md b/tutorials/katacoda/command-thread-cn/thread-usage.md deleted file mode 100644 index 5b56eb47855..00000000000 --- a/tutorials/katacoda/command-thread-cn/thread-usage.md +++ /dev/null @@ -1,180 +0,0 @@ - -### 支持一键展示当前最忙的前N个线程并打印堆栈: - -`thread -n 3`{{execute T2}} - -```bash -$ thread -n 3 -"C1 CompilerThread0" [Internal] cpuUsage=1.63% deltaTime=3ms time=1170ms - - -"arthas-command-execute" Id=23 cpuUsage=0.11% deltaTime=0ms time=401ms RUNNABLE - at java.management@11.0.7/sun.management.ThreadImpl.dumpThreads0(Native Method) - at java.management@11.0.7/sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:466) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:199) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108) - at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385) - at java.base@11.0.7/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) - at java.base@11.0.7/java.util.concurrent.FutureTask.run(FutureTask.java:264) - at java.base@11.0.7/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) - at java.base@11.0.7/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) - at java.base@11.0.7/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) - at java.base@11.0.7/java.lang.Thread.run(Thread.java:834) - - -"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms -``` - -* 没有线程ID,包含`[Internal]`表示为JVM内部线程,参考`dashboard`命令的介绍。 -* `cpuUsage`为采样间隔时间内线程的CPU使用率,与`dashboard`命令的数据一致。 -* `deltaTime`为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。 -* `time` 线程运行总CPU时间。 - -注意:线程栈为第二采样结束时获取,不能表明采样间隔时间内该线程都是在处理相同的任务。建议间隔时间不要太长,可能间隔时间越大越不准确。 -可以根据具体情况尝试指定不同的间隔时间,观察输出结果。 - -### 当没有参数时,显示第一页线程信息 - -默认按照CPU增量时间降序排列,只显示第一页数据,避免滚屏。 - -`thread`{{execute T2}} - -```bash -$ thread -Threads Total: 33, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 4, TERMINATED: 0, Internal threads: 17 -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPT DAEMON --1 C2 CompilerThread0 - -1 - 5.06 0.010 0:0.973 false true --1 C1 CompilerThread0 - -1 - 0.95 0.001 0:0.603 false true -23 arthas-command-execute system 5 RUNNABLE 0.17 0.000 0:0.226 false true --1 VM Periodic Task Thread - -1 - 0.05 0.000 0:0.094 false true --1 Sweeper thread - -1 - 0.04 0.000 0:0.011 false true --1 G1 Young RemSet Sampling - -1 - 0.02 0.000 0:0.025 false true -12 Attach Listener system 9 RUNNABLE 0.0 0.000 0:0.022 false true -11 Common-Cleaner InnocuousThrea 8 TIMED_WAI 0.0 0.000 0:0.000 false true -3 Finalizer system 8 WAITING 0.0 0.000 0:0.000 false true -2 Reference Handler system 10 RUNNABLE 0.0 0.000 0:0.000 false true -4 Signal Dispatcher system 9 RUNNABLE 0.0 0.000 0:0.000 false true -15 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.029 false true -22 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.196 false true -24 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.038 false true -16 arthas-NettyWebsocketTtyBootst system 5 RUNNABLE 0.0 0.000 0:0.001 false true -17 arthas-NettyWebsocketTtyBootst system 5 RUNNABLE 0.0 0.000 0:0.001 false true -``` - -### thread --all, 显示所有匹配的线程 - -显示所有匹配线程信息,有时需要获取全部JVM的线程数据进行分析。 - -`thread --all`{{execute T2}} - -### thread id, 显示指定线程的运行堆栈 - -查看线程ID 16的栈: - -`thread 16`{{execute T2}} - -```bash -$ thread 1 -"main" Id=1 WAITING on java.util.concurrent.CountDownLatch$Sync@29fafb28 - at sun.misc.Unsafe.park(Native Method) - - waiting on java.util.concurrent.CountDownLatch$Sync@29fafb28 - at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) - at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) -``` - -### thread -b, 找出当前阻塞其他线程的线程 - -有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。 为了排查这类问题, arthas提供了`thread -b`, 一键找出那个罪魁祸首。 - -`thread -b`{{execute T2}} - -```bash -$ thread -b -"http-bio-8080-exec-4" Id=27 TIMED_WAITING - at java.lang.Thread.sleep(Native Method) - at test.arthas.TestThreadBlocking.doGet(TestThreadBlocking.java:22) - - locked java.lang.Object@725be470 <---- but blocks 4 other threads! - at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) - at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at test.filter.TestDurexFilter.doFilter(TestDurexFilter.java:46) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) - at com.taobao.tomcat.valves.ContextLoadFilterValve$FilterChainAdapter.doFilter(ContextLoadFilterValve.java:191) - at com.taobao.eagleeye.EagleEyeFilter.doFilter(EagleEyeFilter.java:81) - at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:150) - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429) - at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) - at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) - at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) - - locked org.apache.tomcat.util.net.SocketWrapper@7127ee12 - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) - at java.lang.Thread.run(Thread.java:745) - - Number of locked synchronizers = 1 - - java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e -``` - -**注意**, 目前只支持找出synchronized关键字阻塞住的线程, 如果是`java.util.concurrent.Lock`, 目前还不支持。 - -### thread -i, 指定采样时间间隔 -* `thread -i 1000` : 统计最近1000ms内的线程CPU时间。 - -`thread -i 1000`{{execute T2}} - -* `thread -n 3 -i 1000` : 列出1000ms内最忙的3个线程栈 - -`thread -n 3 -i 1000`{{execute T2}} - -```bash -$ thread -n 3 -i 1000 -"as-command-execute-daemon" Id=4759 cpuUsage=23% RUNNABLE - at sun.management.ThreadImpl.dumpThreads0(Native Method) - at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:133) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:79) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:96) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:27) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:125) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:122) - at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:332) - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) - at java.lang.Thread.run(Thread.java:756) - - Number of locked synchronizers = 1 - - java.util.concurrent.ThreadPoolExecutor$Worker@546aeec1 -... -``` - -### thread –state ,查看指定状态的线程 - -`thread --state WAITING`{{execute T2}} - -```bash -[arthas@28114]$ thread --state WAITING -Threads Total: 16, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 4, TERMINATED: 0 -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTE DAEMON -3 Finalizer system 8 WAITING 0.0 0.000 0:0.000 false true -20 arthas-UserStat system 9 WAITING 0.0 0.000 0:0.001 false true -14 arthas-timer system 9 WAITING 0.0 0.000 0:0.000 false true -``` diff --git a/tutorials/katacoda/command-thread-cn/thread.md b/tutorials/katacoda/command-thread-cn/thread.md deleted file mode 100644 index c552d941686..00000000000 --- a/tutorials/katacoda/command-thread-cn/thread.md +++ /dev/null @@ -1,12 +0,0 @@ - -查看当前线程信息,查看线程的堆栈 - -### 参数说明 - -| 参数名称 | 参数说明 | -| ---- | ---- | -| id | 线程id | -| [n:] | 指定最忙的前N个线程并打印堆栈 | -| [b] | 找出当前阻塞其他线程的线程 | -| [i ] | 指定cpu占比统计的采样间隔,单位为毫秒 | -|[--all]|显示所有匹配的线程| diff --git a/tutorials/katacoda/command-thread-en/CPU-ratios-calculate.md b/tutorials/katacoda/command-thread-en/CPU-ratios-calculate.md deleted file mode 100644 index 41a2903696e..00000000000 --- a/tutorials/katacoda/command-thread-en/CPU-ratios-calculate.md +++ /dev/null @@ -1,15 +0,0 @@ -### How the CPU ratios are calculated? - -The cpu ratios here is similar to the thread `%CPU` of the linux command `top -H -p `. During a sampling interval, -the ratio of the incremental cpu time of each thread in the current JVM to the sampling interval time. - -> Working principle description: -* Do the first sampling, get the CPU time of all threads ( by calling `java.lang.management.ThreadMXBean#getThreadCpuTime()` and -`sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()` ) -* Sleep and wait for an interval (the default is 200ms, the interval can be specified by `-i`) -* Do the second sampling, get the CPU time of all threads, compare the two sampling data, and calculate the incremental CPU time of each thread -* `Thread CPU usage ratio` = `Thread increment CPU time` / `Sampling interval time` * 100% - -**Note:** this operation consumes CPU time too (`getThreadCpuTime` is time-consuming), therefore it is possible to observe Arthas's thread appears in the list. To avoid this, try to increase sample interval, for example: 5000 ms.
- -> Another way to view the thread cpu usage of the Java process, [`show-busy-java-threads`](https://github.com/oldratlee/useful-scripts/blob/dev-2.x/docs/java.md#-show-busy-java-threads) can come to help. diff --git a/tutorials/katacoda/command-thread-en/arthas-boot.md b/tutorials/katacoda/command-thread-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-thread-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-thread-en/arthas-demo.md b/tutorials/katacoda/command-thread-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-thread-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-thread-en/finish.md b/tutorials/katacoda/command-thread-en/finish.md deleted file mode 100644 index 6df17db21b0..00000000000 --- a/tutorials/katacoda/command-thread-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `thread Tutorial` demonstrates the usage of thread. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-thread-en/index.json b/tutorials/katacoda/command-thread-en/index.json deleted file mode 100644 index 735ae615c22..00000000000 --- a/tutorials/katacoda/command-thread-en/index.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Arthas thread Command", - "description": "Arthas thread Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Thread Command", - "text": "thread.md" - }, - { - "title": "How the CPU ratios are calculated?", - "text": "CPU-ratios-calculate.md" - }, - { - "title": "Thread Usage", - "text": "thread-usage.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-thread-en/intro.md b/tutorials/katacoda/command-thread-en/intro.md deleted file mode 100644 index 664e2def2ba..00000000000 --- a/tutorials/katacoda/command-thread-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of thread. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-thread-en/thread-usage.md b/tutorials/katacoda/command-thread-en/thread-usage.md deleted file mode 100644 index 4c938ebad11..00000000000 --- a/tutorials/katacoda/command-thread-en/thread-usage.md +++ /dev/null @@ -1,179 +0,0 @@ - -### List the top n busiest threads with detailed stack trace - -`thread -n 3`{{execute T2}} - -```bash -$ thread -n 3 -"C1 CompilerThread0" [Internal] cpuUsage=1.63% deltaTime=3ms time=1170ms - - -"arthas-command-execute" Id=23 cpuUsage=0.11% deltaTime=0ms time=401ms RUNNABLE - at java.management@11.0.7/sun.management.ThreadImpl.dumpThreads0(Native Method) - at java.management@11.0.7/sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:466) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:199) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108) - at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385) - at java.base@11.0.7/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) - at java.base@11.0.7/java.util.concurrent.FutureTask.run(FutureTask.java:264) - at java.base@11.0.7/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) - at java.base@11.0.7/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) - at java.base@11.0.7/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) - at java.base@11.0.7/java.lang.Thread.run(Thread.java:834) - - -"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms -``` - -* Without thread ID, including `[Internal]` means JVM internal thread, refer to the introduction of `dashboard` command. -* `cpuUsage` is the CPU usage of the thread during the sampling interval, consistent with the data of the `dashboard` command. -* `deltaTime` is the incremental CPU time of the thread during the sampling interval. If it is less than 1ms, it will be rounded and displayed as 0ms. -* `time` The total CPU time of thread. - -**Note:** The thread stack is acquired at the end of the second sampling, which does not indicate that the thread is -processing the same task during the sampling interval. It is recommended that the interval time should not be too long. -The larger the interval time, the more inaccurate. - -You can try to specify different intervals according to the specific situation and observe the output results. - - -#### List first page threads' info when no options provided - -By default, they are arranged in descending order of CPU increment time, and only the first page of data is displayed. - -`thread`{{execute T2}} - -```bash -$ thread -Threads Total: 33, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 4, TERMINATED: 0, Internal threads: 17 -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPT DAEMON --1 C2 CompilerThread0 - -1 - 5.06 0.010 0:0.973 false true --1 C1 CompilerThread0 - -1 - 0.95 0.001 0:0.603 false true -23 arthas-command-execute system 5 RUNNABLE 0.17 0.000 0:0.226 false true --1 VM Periodic Task Thread - -1 - 0.05 0.000 0:0.094 false true --1 Sweeper thread - -1 - 0.04 0.000 0:0.011 false true --1 G1 Young RemSet Sampling - -1 - 0.02 0.000 0:0.025 false true -12 Attach Listener system 9 RUNNABLE 0.0 0.000 0:0.022 false true -11 Common-Cleaner InnocuousThrea 8 TIMED_WAI 0.0 0.000 0:0.000 false true -3 Finalizer system 8 WAITING 0.0 0.000 0:0.000 false true -2 Reference Handler system 10 RUNNABLE 0.0 0.000 0:0.000 false true -4 Signal Dispatcher system 9 RUNNABLE 0.0 0.000 0:0.000 false true -15 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.029 false true -22 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.196 false true -24 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.0 0.000 0:0.038 false true -16 arthas-NettyWebsocketTtyBootst system 5 RUNNABLE 0.0 0.000 0:0.001 false true -17 arthas-NettyWebsocketTtyBootst system 5 RUNNABLE 0.0 0.000 0:0.001 false true -``` - -### thread id, show the running stack for the target thread - -View the stack of thread ID 16: - -`thread 16`{{execute T2}} - -```bash -$ thread 1 -"main" Id=1 WAITING on java.util.concurrent.CountDownLatch$Sync@29fafb28 - at sun.misc.Unsafe.park(Native Method) - - waiting on java.util.concurrent.CountDownLatch$Sync@29fafb28 - at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997) - at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304) - at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231) -``` - -### thread -b, locate the thread bocking the others - -In some occasions, we experience the whole application is stuck because there’s one particular thread hold one lock that other threads are relying on. To diagnose such an issue, Arthas provides thread -b to find the problematic thread in one single command. - -`thread -b`{{execute T2}} - -```bash -$ thread -b -"http-bio-8080-exec-4" Id=27 TIMED_WAITING - at java.lang.Thread.sleep(Native Method) - at test.arthas.TestThreadBlocking.doGet(TestThreadBlocking.java:22) - - locked java.lang.Object@725be470 <---- but blocks 4 other threads! - at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) - at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at test.filter.TestDurexFilter.doFilter(TestDurexFilter.java:46) - at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) - at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) - at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) - at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) - at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) - at com.taobao.tomcat.valves.ContextLoadFilterValve$FilterChainAdapter.doFilter(ContextLoadFilterValve.java:191) - at com.taobao.eagleeye.EagleEyeFilter.doFilter(EagleEyeFilter.java:81) - at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:150) - at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) - at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) - at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) - at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429) - at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) - at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) - at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) - - locked org.apache.tomcat.util.net.SocketWrapper@7127ee12 - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) - at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) - at java.lang.Thread.run(Thread.java:745) - - Number of locked synchronizers = 1 - - java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e -``` - -**Note**: By now Arthas only supports to locate the thread blocked by synchronzied, while `java.util.concurrent.Lock` is not supported yet. - -### thread -i, specify the sampling interval - -* `thread -i 1000`: Count the thread cpu time of the last 1000ms. - -`thread -i 1000`{{execute T2}} - -* `thread -n 3 -i 1000`: List the 3 busiest thread stacks in 1000ms. - -`thread -n 3 -i 1000`{{execute T2}} - -```bash -$ thread -n 3 -i 1000 -"as-command-execute-daemon" Id=4759 cpuUsage=23% RUNNABLE - at sun.management.ThreadImpl.dumpThreads0(Native Method) - at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:133) - at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:79) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:96) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:27) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:125) - at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:122) - at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:332) - at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) - at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) - at java.lang.Thread.run(Thread.java:756) - - Number of locked synchronizers = 1 - - java.util.concurrent.ThreadPoolExecutor$Worker@546aeec1 -... -``` - -### thread –state , view the special state theads - -`thread --state WAITING`{{execute T2}} - -```bash -[arthas@28114]$ thread --state WAITING -Threads Total: 16, NEW: 0, RUNNABLE: 9, BLOCKED: 0, WAITING: 3, TIMED_WAITING: 4, TERMINATED: 0 -ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTE DAEMON -3 Finalizer system 8 WAITING 0.0 0.000 0:0.000 false true -20 arthas-UserStat system 9 WAITING 0.0 0.000 0:0.001 false true -14 arthas-timer system 9 WAITING 0.0 0.000 0:0.000 false true -``` \ No newline at end of file diff --git a/tutorials/katacoda/command-thread-en/thread.md b/tutorials/katacoda/command-thread-en/thread.md deleted file mode 100644 index 84ddf52289e..00000000000 --- a/tutorials/katacoda/command-thread-en/thread.md +++ /dev/null @@ -1,15 +0,0 @@ - - -## thread - -Check the basic info and stack trace of the target thread. - -### Parameters - -| Name | Specification | -| ---- | ---- | -| id | thread id in JVM | -| [n:] | the top n busiest threads with stack traces printed | -| [b] | locate the thread blocking the others | -| [i ] | specify the interval to collect data to compute CPU ratios (ms) | -|[--all]|Show all matching threads| diff --git a/tutorials/katacoda/command-trace-cn/arthas-boot.md b/tutorials/katacoda/command-trace-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-trace-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-trace-cn/arthas-demo.md b/tutorials/katacoda/command-trace-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-trace-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-trace-cn/finish.md b/tutorials/katacoda/command-trace-cn/finish.md deleted file mode 100644 index 81a438169f8..00000000000 --- a/tutorials/katacoda/command-trace-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“trace”中,我们演示了了Arthas的trace命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-trace-cn/index.json b/tutorials/katacoda/command-trace-cn/index.json deleted file mode 100644 index c73032f8dc4..00000000000 --- a/tutorials/katacoda/command-trace-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas trace命令", - "description": "Arthas trace命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "trace命令", - "text": "trace.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-trace-cn/intro.md b/tutorials/katacoda/command-trace-cn/intro.md deleted file mode 100644 index cb2f9c4b0f7..00000000000 --- a/tutorials/katacoda/command-trace-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示trace命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-trace-cn/trace.md b/tutorials/katacoda/command-trace-cn/trace.md deleted file mode 100644 index 0f1f0d789c9..00000000000 --- a/tutorials/katacoda/command-trace-cn/trace.md +++ /dev/null @@ -1,210 +0,0 @@ - -> 方法内部调用路径,并输出方法路径上的每个节点上耗时 - -`trace` 命令能主动搜索 `class-pattern`/`method-pattern` 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。 - -### 参数说明 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|*condition-express*|条件表达式| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|`[n:]`|命令执行次数| -|`#cost`|方法执行耗时| - -这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。 - -观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。 - - -请参考[表达式核心变量](advice-class.md)中关于该节点的描述。 - -* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) -* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如`trace *StringUtils isBlank '#cost>100'`表示当执行时间超过100ms的时候,才会输出trace的结果。 - -> watch/stack/trace这个三个命令都支持`#cost` - -### 注意事项 - -`trace` 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,但其每次只能跟踪一级方法的调用链路。 - -参考:[Trace命令的实现原理](https://github.com/alibaba/arthas/issues/597) - -3.3.0 版本后,可以使用动态Trace功能,不断增加新的匹配类,参考下面的示例。 - - -### 使用参考 - -#### trace函数 - -`trace demo.MathGame run`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ trace demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 28 ms. -`---ts=2019-12-04 00:45:08;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.617465ms] demo.MathGame:run() - `---[0.078946ms] demo.MathGame:primeFactors() #24 [throws Exception] - -`---ts=2019-12-04 00:45:09;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.276874ms] demo.MathGame:run() - `---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception] -``` - -#### trace次数限制 - -如果方法调用的次数很多,那么可以用`-n`参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用就退出命令。 - -`trace demo.MathGame run -n 1`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ trace demo.MathGame run -n 1 -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 20 ms. -`---ts=2019-12-04 00:45:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.549379ms] demo.MathGame:run() - +---[0.059839ms] demo.MathGame:primeFactors() #24 - `---[0.232887ms] demo.MathGame:print() #25 - -Command execution times exceed limit: 1, so command will exit. You can set it with -n option. -``` - - -#### 包含jdk的函数 - -* `--skipJDKMethod ` skip jdk method trace, default value true. - -`trace --skipJDKMethod false demo.MathGame run`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置`--skipJDKMethod false`。 - -```bash -$ trace --skipJDKMethod false demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 60 ms. -`---ts=2019-12-04 00:44:41;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.357742ms] demo.MathGame:run() - +---[0.028624ms] java.util.Random:nextInt() #23 - +---[0.045534ms] demo.MathGame:primeFactors() #24 [throws Exception] - +---[0.005372ms] java.lang.StringBuilder:() #28 - +---[0.012257ms] java.lang.Integer:valueOf() #28 - +---[0.234537ms] java.lang.String:format() #28 - +---[min=0.004539ms,max=0.005778ms,total=0.010317ms,count=2] java.lang.StringBuilder:append() #28 - +---[0.013777ms] java.lang.Exception:getMessage() #28 - +---[0.004935ms] java.lang.StringBuilder:toString() #28 - `---[0.06941ms] java.io.PrintStream:println() #28 - -`---ts=2019-12-04 00:44:42;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[3.030432ms] demo.MathGame:run() - +---[0.010473ms] java.util.Random:nextInt() #23 - +---[0.023715ms] demo.MathGame:primeFactors() #24 [throws Exception] - +---[0.005198ms] java.lang.StringBuilder:() #28 - +---[0.006405ms] java.lang.Integer:valueOf() #28 - +---[0.178583ms] java.lang.String:format() #28 - +---[min=0.011636ms,max=0.838077ms,total=0.849713ms,count=2] java.lang.StringBuilder:append() #28 - +---[0.008747ms] java.lang.Exception:getMessage() #28 - +---[0.019768ms] java.lang.StringBuilder:toString() #28 - `---[0.076457ms] java.io.PrintStream:println() #28 -``` - -#### 据调用耗时过滤 - -`trace demo.MathGame run '#cost > 10'`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ trace demo.MathGame run '#cost > 10' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 41 ms. -`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[12.033735ms] demo.MathGame:run() - +---[0.006783ms] java.util.Random:nextInt() - +---[11.852594ms] demo.MathGame:primeFactors() - `---[0.05447ms] demo.MathGame:print() -``` - -> 只会展示耗时大于10ms的调用路径,有助于在排查问题的时候,只关注异常情况 - -- 是不是很眼熟,没错,在 JProfiler 等收费软件中你曾经见识类似的功能,这里你将可以通过命令就能打印出指定调用路径。 友情提醒下,`trace` 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准,渲染路径上调用的类、方法越多,性能偏差越大。但还是能让你看清一些事情的。 -- [12.033735ms] 的含义,`12.033735` 的含义是:当前节点在当前步骤的耗时,单位为毫秒 -- [0,0,0ms,11]xxx:yyy() [throws Exception],对该方法中相同的方法调用进行了合并,`0,0,0ms,11` 表示方法调用耗时,`min,max,total,count`;`throws Exception` 表明该方法调用中存在异常返回 -- 这里存在一个统计不准确的问题,就是所有方法耗时加起来可能会小于该监测方法的总耗时,这个是由于 Arthas 本身的逻辑会有一定的耗时 - -#### trace多个类或者多个函数 - -trace命令只会trace匹配到的函数里的子调用,并不会向下trace多层。因为trace是代价比较贵的,多层trace可能会导致最终要trace的类和函数非常多。 - -可以用正则表匹配路径上的多个类和函数,一定程度上达到多层trace的效果。 - -```bash -trace -E com.test.ClassA|org.test.ClassB method1|method2|method3 -``` - -### 动态trace - -3.3.0 版本后支持。 - - -打开终端1,trace `run`函数,可以看到打印出 `listenerId: 1`: - -`trace demo.MathGame run`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -[arthas@59161]$ trace demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 112 ms, listenerId: 1 -`---ts=2020-07-09 16:48:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.389634ms] demo.MathGame:run() - `---[0.123934ms] demo.MathGame:primeFactors() #24 [throws Exception] - -`---ts=2020-07-09 16:48:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[3.716391ms] demo.MathGame:run() - +---[3.182813ms] demo.MathGame:primeFactors() #24 - `---[0.167786ms] demo.MathGame:print() #25 -``` - -现在想要深入子函数`primeFactors`,可以打开一个新终端2,使用`telnet localhost 3658`连接上arthas,再trace `primeFactors`时,指定`listenerId`。 - -`trace demo.MathGame primeFactors --listenerId 1`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -[arthas@59161]$ trace demo.MathGame primeFactors --listenerId 1 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 34 ms, listenerId: 1 -``` - -这时终端2打印的结果,说明已经增强了一个函数:`Affect(class count: 1 , method count: 1)`,但不再打印更多的结果。 - -再查看终端1,可以发现trace的结果增加了一层,打印了`primeFactors`函数里的内容: - -```bash -`---ts=2020-07-09 16:49:29;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.492551ms] demo.MathGame:run() - `---[0.113929ms] demo.MathGame:primeFactors() #24 [throws Exception] - `---[0.061462ms] demo.MathGame:primeFactors() - `---[0.001018ms] throw:java.lang.IllegalArgumentException() #46 - -`---ts=2020-07-09 16:49:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.409446ms] demo.MathGame:run() - +---[0.232606ms] demo.MathGame:primeFactors() #24 - | `---[0.1294ms] demo.MathGame:primeFactors() - `---[0.084025ms] demo.MathGame:print() #25 -``` - -通过指定`listenerId`的方式动态trace,可以不断深入。另外 `watch`/`tt`/`monitor`等命令也支持类似的功能。 diff --git a/tutorials/katacoda/command-trace-en/arthas-boot.md b/tutorials/katacoda/command-trace-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-trace-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-trace-en/arthas-demo.md b/tutorials/katacoda/command-trace-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-trace-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-trace-en/finish.md b/tutorials/katacoda/command-trace-en/finish.md deleted file mode 100644 index e51b723e39c..00000000000 --- a/tutorials/katacoda/command-trace-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `trace Tutorial` demonstrates the usage of trace. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-trace-en/index.json b/tutorials/katacoda/command-trace-en/index.json deleted file mode 100644 index b4b933c7501..00000000000 --- a/tutorials/katacoda/command-trace-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas trace Command", - "description": "Arthas trace Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "trace Command", - "text": "trace.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-trace-en/intro.md b/tutorials/katacoda/command-trace-en/intro.md deleted file mode 100644 index 376ed5dbb99..00000000000 --- a/tutorials/katacoda/command-trace-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of trace. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-trace-en/trace.md b/tutorials/katacoda/command-trace-en/trace.md deleted file mode 100644 index b61217674a0..00000000000 --- a/tutorials/katacoda/command-trace-en/trace.md +++ /dev/null @@ -1,206 +0,0 @@ - -> Trace method calling path, and output the time cost for each node in the path. - -`trace` can track the calling path specified by `class-pattern` / `method-pattern`, and calculate the time cost on the whole path. - -### Parameters - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|*method-pattern*|pattern for the method name| -|*condition-express*|condition expression| -|`[E]`|enable regex match, the default behavior is wildcards match| -|`[n:]`|execution times| -|#cost|time cost| - -There's one thing worthy noting here is observation expression. The observation expression supports OGNL grammar, for example, you can come up a expression like this `"{params,returnObj}"`. All OGNL expressions are supported as long as they are legal to the grammar. - -Thanks for `advice`'s data structure, it is possible to observe from varieties of different angles. Inside `advice` parameter, all necessary information for notification can be found. - -Pls. refer to [core parameters in expression](advice-class.md) for more details. -* Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage -* OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: `trace *StringUtils isBlank '#cost>100'` means trace result will only be output when the executing time exceeds 100ms. - - -> `watch`/`stack`/`trace`, these three commands all support `#cost`. - -### Notice - -`trace` is handy to help discovering and locating the performance flaws in your system, but pls. note Arthas can only trace the first level method call each time. - - -After version 3.3.0, you can use the Dynamic Trace feature to add new matching classes/methods, see the following example. - -### Usage - -#### Trace method - -`trace demo.MathGame run`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ trace demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 28 ms. -`---ts=2019-12-04 00:45:08;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.617465ms] demo.MathGame:run() - `---[0.078946ms] demo.MathGame:primeFactors() #24 [throws Exception] - -`---ts=2019-12-04 00:45:09;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.276874ms] demo.MathGame:run() - `---[0.03752ms] demo.MathGame:primeFactors() #24 [throws Exception] -``` - - -#### Trace times limit - -If the method invoked many times, use `-n` options to specify trace times. For example, the command will exit when received a trace result. - -`trace demo.MathGame run -n 1`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ trace demo.MathGame run -n 1 -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 20 ms. -`---ts=2019-12-04 00:45:53;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.549379ms] demo.MathGame:run() - +---[0.059839ms] demo.MathGame:primeFactors() #24 - `---[0.232887ms] demo.MathGame:print() #25 - -Command execution times exceed limit: 1, so command will exit. You can set it with -n option. -``` - -#### Include jdk method - -* `--skipJDKMethod ` skip jdk method trace, default value true. - -`trace --skipJDKMethod false demo.MathGame run`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ trace --skipJDKMethod false demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 60 ms. -`---ts=2019-12-04 00:44:41;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.357742ms] demo.MathGame:run() - +---[0.028624ms] java.util.Random:nextInt() #23 - +---[0.045534ms] demo.MathGame:primeFactors() #24 [throws Exception] - +---[0.005372ms] java.lang.StringBuilder:() #28 - +---[0.012257ms] java.lang.Integer:valueOf() #28 - +---[0.234537ms] java.lang.String:format() #28 - +---[min=0.004539ms,max=0.005778ms,total=0.010317ms,count=2] java.lang.StringBuilder:append() #28 - +---[0.013777ms] java.lang.Exception:getMessage() #28 - +---[0.004935ms] java.lang.StringBuilder:toString() #28 - `---[0.06941ms] java.io.PrintStream:println() #28 - -`---ts=2019-12-04 00:44:42;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[3.030432ms] demo.MathGame:run() - +---[0.010473ms] java.util.Random:nextInt() #23 - +---[0.023715ms] demo.MathGame:primeFactors() #24 [throws Exception] - +---[0.005198ms] java.lang.StringBuilder:() #28 - +---[0.006405ms] java.lang.Integer:valueOf() #28 - +---[0.178583ms] java.lang.String:format() #28 - +---[min=0.011636ms,max=0.838077ms,total=0.849713ms,count=2] java.lang.StringBuilder:append() #28 - +---[0.008747ms] java.lang.Exception:getMessage() #28 - +---[0.019768ms] java.lang.StringBuilder:toString() #28 - `---[0.076457ms] java.io.PrintStream:println() #28 -``` - -#### Filtering by cost - -`trace demo.MathGame run '#cost > 10'`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ trace demo.MathGame run '#cost > 10' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 41 ms. -`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[12.033735ms] demo.MathGame:run() - +---[0.006783ms] java.util.Random:nextInt() - +---[11.852594ms] demo.MathGame:primeFactors() - `---[0.05447ms] demo.MathGame:print() -``` - -> Only the call path which's time cost is higher than `10ms` will be shown. This feature is handy to focus on what's needed to focus when troubleshoot. - -* Here Arthas provides the similar functionality JProfile and other commercial software provide. Compared to these professional softwares, Arthas doesn't deduce the time cost `trace` itself takes, therefore it is not as accurate as these softwares offer. More classes and methods on the calling path, more inaccurate `trace` output is, but it is still helpful for diagnostics where the bottleneck is. -* "[12.033735ms]" means the method on the node takes `12.033735` ms. -* "[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] demo:call()" means aggregating all same method calls into one single line. The minimum time cost is `0.005428` ms, the maximum time cost is `0.094064` ms, and the total time cost for all method calls (`3` times in total) to "demo:call()" is `0.105228ms`. If "throws Exception" appears in this line, it means some exceptions have been thrown from this method calls. -* The total time cost may not equal to the sum of the time costs each sub method call takes, this is because Arthas instrumented code takes time too. - - -#### Trace multiple classes or multiple methods - -The trace command will only trace the subcalls in the method to the trace, and will not trace down multiple layers. Because traces are expensive, multi-layer traces can lead to a lot of classes and methods that ultimately have to be traced. - -You can use the regular expression to match multiple classes and methods on the path to achieve a multi-layer trace effect to some extent. - -```bash -Trace -E com.test.ClassA|org.test.ClassB method1|method2|method3 -``` - - -#### Dynamic trace - -> Supported since version 3.3.0. - -Open terminal 1, trace the `run` method, and you can see the printout `listenerId: 1` . - -`trace demo.MathGame run`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -[arthas@59161]$ trace demo.MathGame run -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 112 ms, listenerId: 1 -`---ts=2020-07-09 16:48:11;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[1.389634ms] demo.MathGame:run() - `---[0.123934ms] demo.MathGame:primeFactors() #24 [throws Exception] - -`---ts=2020-07-09 16:48:12;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[3.716391ms] demo.MathGame:run() - +---[3.182813ms] demo.MathGame:primeFactors() #24 - `---[0.167786ms] demo.MathGame:print() #25 -``` - -Now to drill down into the sub method `primeFactors`, you can open a new terminal 2 and use the `telnet localhost 3658` connects to the arthas, then trace `primeFactors` with the specify `listenerId`. - -`trace demo.MathGame primeFactors --listenerId 1`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -[arthas@59161]$ trace demo.MathGame primeFactors --listenerId 1 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 34 ms, listenerId: 1 -``` - -At Terminal 2 prints the results, indicating that a method has been enhanced: `Affect(class count: 1 , method count: 1)`, but no more results are printed. - -At terminal 1, you can see that the trace result has increased by one layer: - -```bash -`---ts=2020-07-09 16:49:29;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.492551ms] demo.MathGame:run() - `---[0.113929ms] demo.MathGame:primeFactors() #24 [throws Exception] - `---[0.061462ms] demo.MathGame:primeFactors() - `---[0.001018ms] throw:java.lang.IllegalArgumentException() #46 - -`---ts=2020-07-09 16:49:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69 - `---[0.409446ms] demo.MathGame:run() - +---[0.232606ms] demo.MathGame:primeFactors() #24 - | `---[0.1294ms] demo.MathGame:primeFactors() - `---[0.084025ms] demo.MathGame:print() #25 -``` - -Dynamic trace by specifying `listenerId`, you can go deeper and deeper. In addition, commands such as `watch`/`tt`/`monitor` also support similar functionality. \ No newline at end of file diff --git a/tutorials/katacoda/command-tt-cn/arthas-boot.md b/tutorials/katacoda/command-tt-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-tt-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-tt-cn/arthas-demo.md b/tutorials/katacoda/command-tt-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-tt-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-tt-cn/finish.md b/tutorials/katacoda/command-tt-cn/finish.md deleted file mode 100644 index 14f205b8d54..00000000000 --- a/tutorials/katacoda/command-tt-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“tt”中,我们演示了了Arthas的tt命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-tt-cn/index.json b/tutorials/katacoda/command-tt-cn/index.json deleted file mode 100644 index 9a819544f08..00000000000 --- a/tutorials/katacoda/command-tt-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas tt命令", - "description": "Arthas tt命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "tt命令", - "text": "tt.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-tt-cn/intro.md b/tutorials/katacoda/command-tt-cn/intro.md deleted file mode 100644 index d21975fc7f7..00000000000 --- a/tutorials/katacoda/command-tt-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示tt命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-tt-cn/tt.md b/tutorials/katacoda/command-tt-cn/tt.md deleted file mode 100644 index c0c5730ef08..00000000000 --- a/tutorials/katacoda/command-tt-cn/tt.md +++ /dev/null @@ -1,191 +0,0 @@ - -> 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测 - -`watch` 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。 - -这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。 - -于是乎,TimeTunnel 命令就诞生了。 - -### 使用参考 - -#### 记录调用 - -对于一个最基本的使用来说,就是记录下当前方法的每次调用环境现场。 - -`tt -t demo.MathGame primeFactors`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ tt -t demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 66 ms. - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors -``` - -- 命令参数解析 - - - `-t` - - tt 命令有很多个主参数,`-t` 就是其中之一。这个参数的表明希望记录下类 `*Test` 的 `print` 方法的每次执行情况。 - - - `-n 3` - - 当你执行一个调用量不高的方法时可能你还能有足够的时间用 `CTRL+C` 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。 - - 此时你可以通过 `-n` 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。 - -- 表格字段说明 - -|表格字段|字段解释| -|---|---| -|INDEX|时间片段记录编号,每一个编号代表着一次调用,后续tt还有很多命令都是基于此编号指定记录操作,非常重要。| -|TIMESTAMP|方法执行的本机时间,记录了这个时间片段所发生的本机时间| -|COST(ms)|方法执行的耗时| -|IS-RET|方法是否以正常返回的形式结束| -|IS-EXP|方法是否以抛异常的形式结束| -|OBJECT|执行对象的`hashCode()`,注意,曾经有人误认为是对象在JVM中的内存地址,但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体| -|CLASS|执行的类名| -|METHOD|执行的方法名| - -- 条件表达式 - - 不知道大家是否有在使用过程中遇到以下困惑 - * Arthas 似乎很难区分出重载的方法 - * 我只需要观察特定参数,但是 tt 却全部都给我记录了下来 - - 条件表达式也是用 `OGNL` 来编写,核心的判断对象依然是 `Advice` 对象。除了 `tt` 命令之外,`watch`、`trace`、`stack` 命令也都支持条件表达式。 - -- 解决方法重载 - - `tt -t *Test print params.length==1` - - 通过制定参数个数的形式解决不同的方法签名,如果参数个数一样,你还可以这样写 - - `tt -t *Test print 'params[1] instanceof Integer'` - -- 解决指定参数 - - `tt -t *Test print params[0].mobile=="13989838402"` - -- 构成条件表达式的 `Advice` 对象 - - 前边看到了很多条件表达式中,都使用了 `params[0]`,有关这个变量的介绍,请参考[表达式核心变量](https://arthas.aliyun.com/doc/advice-class.html) - -#### 检索调用记录 - -当你用 `tt` 记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。 - -假设我们有这些记录 - -`tt -l`{{execute T2}} - -```bash -$ tt -l - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors - 9 - 1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors -Affect(row-cnt:6) cost in 4 ms. -``` - -我需要筛选出 `primeFactors` 方法的调用信息 - -`tt -s 'method.name=="primeFactors"'`{{execute T2}} - -```bash -$ tt -s 'method.name=="primeFactors"' - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors - 9 - 1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors -Affect(row-cnt:6) cost in 607 ms. -``` - -你需要一个 `-s` 参数。同样的,搜索表达式的核心对象依旧是 `Advice` 对象。 - -#### 查看调用信息 - -对于具体一个时间片的信息而言,你可以通过 `-i` 参数后边跟着对应的 `INDEX` 编号查看到他的详细信息。 - -`tt -i 1003`{{execute T2}} - -```bash -$ tt -i 1003 - INDEX 1003 - GMT-CREATE 2018-12-04 11:15:41 - COST(ms) 0.186073 - OBJECT 0x4b67cf4d - CLASS demo.MathGame - METHOD primeFactors - IS-RETURN false - IS-EXCEPTION true - PARAMETERS[0] @Integer[-564322413] - THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need >= 2 - at demo.MathGame.primeFactors(MathGame.java:46) - at demo.MathGame.run(MathGame.java:24) - at demo.MathGame.main(MathGame.java:16) - -Affect(row-cnt:1) cost in 11 ms. -``` - -#### 重做一次调用 - -当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。 - -`tt` 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 `INDEX` 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 `-p` 参数。通过 `--replay-times` 指定 -调用次数,通过 `--replay-interval` 指定多次调用间隔(单位ms, 默认1000ms) - -`tt -i 1004 -p`{{execute T2}} - -```bash -$ tt -i 1004 -p - RE-INDEX 1004 - GMT-REPLAY 2018-12-04 11:26:00 - OBJECT 0x4b67cf4d - CLASS demo.MathGame - METHOD primeFactors - PARAMETERS[0] @Integer[946738738] - IS-RETURN true - IS-EXCEPTION false - COST(ms) 0.186073 - RETURN-OBJ @ArrayList[ - @Integer[2], - @Integer[11], - @Integer[17], - @Integer[2531387], - ] -Time fragment[1004] successfully replayed. -Affect(row-cnt:1) cost in 14 ms. -``` - -你会发现结果虽然一样,但调用的路径发生了变化,有原来的程序发起变成了 Arthas 自己的内部线程发起的调用了。 - -- 需要强调的点 - - 1. **ThreadLocal 信息丢失** - - 很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。 - - 一些常见的 CASE 比如:鹰眼的 TraceId 等。 - - 2. **引用的对象** - - 需要强调的是,`tt` 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 `tt` 查看的时候将无法看到当时最准确的值。这也是为什么 `watch` 命令存在的意义。 diff --git a/tutorials/katacoda/command-tt-en/arthas-boot.md b/tutorials/katacoda/command-tt-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-tt-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-tt-en/arthas-demo.md b/tutorials/katacoda/command-tt-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-tt-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-tt-en/finish.md b/tutorials/katacoda/command-tt-en/finish.md deleted file mode 100644 index 7a7689c5319..00000000000 --- a/tutorials/katacoda/command-tt-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `tt Tutorial` demonstrates the usage of tt. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-tt-en/index.json b/tutorials/katacoda/command-tt-en/index.json deleted file mode 100644 index 899ca5efca0..00000000000 --- a/tutorials/katacoda/command-tt-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas tt Command", - "description": "Arthas tt Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "tt Command", - "text": "tt.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-tt-en/intro.md b/tutorials/katacoda/command-tt-en/intro.md deleted file mode 100644 index 14f527ba049..00000000000 --- a/tutorials/katacoda/command-tt-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of tt. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-tt-en/tt.md b/tutorials/katacoda/command-tt-en/tt.md deleted file mode 100644 index 5b3551cb5cb..00000000000 --- a/tutorials/katacoda/command-tt-en/tt.md +++ /dev/null @@ -1,165 +0,0 @@ - -Check the `parameters`, `return values` and `exceptions` of the methods at different times. - -`watch` is a powerful command but due to its feasibility and complexity, it's quite hard to locate the issue effectively. - -In such difficulties, `tt` comes into play. - -With the help of `tt` (*TimeTunnel*), you can check the contexts of the methods at different times in execution history. - -### Usage - -#### Record method calls - -`tt -t demo.MathGame primeFactors`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ tt -t demo.MathGame primeFactors -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 66 ms. - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors -``` - -* `-t` - - record the calling context of the method `demo.MathGame primeFactors` - -* `-n 3` - - limit the number of the records (avoid overflow for too many records; with `-n` option, Arthas can automatically stop recording once the records reach the specified limit) - -* Property - -|Name|Specification| -|---|---| -|INDEX|the index for each call based on time| -|TIMESTAMP|time to invoke the method| -|COST(ms)|time cost of the method call| -|IS-RET|whether method exits with normal return| -|IS-EXP|whether method failed with exceptions| -|OBJECT|`hashCode()` of the object invoking the method| -|CLASS|class name of the object invoking the method| -|METHOD|method being invoked| - -* Condition expression - -Tips: -1. `tt -t *Test print params.length==1` with different amounts of parameters; -2. `tt -t *Test print 'params[1] instanceof Integer'` with different types of parameters; -3. `tt -t *Test print params[0].mobile=="13989838402"` with specified parameter. - -Advanced: -* [Critical fields in expression](https://arthas.aliyun.com/doc/en/advice-class.html) -* [Special usage](https://github.com/alibaba/arthas/issues/71) -* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -#### List all records - -`tt -l`{{execute T2}} - -```bash -$ tt -l - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors - 9 - 1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors -Affect(row-cnt:6) cost in 4 ms. -``` - - -#### Searching for records - -`tt -s 'method.name=="primeFactors"'`{{execute T2}} - -```bash -$ tt -s 'method.name=="primeFactors"' - INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD -------------------------------------------------------------------------------------------------------------------------------------- - 1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors - 1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors - 1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors - 1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors - 1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors - 9 - 1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors -Affect(row-cnt:6) cost in 607 ms. -``` - -Advanced: -* [Critical fields in expression](advice-class.md) - -#### Check context of the call - -`tt -i 1003`{{execute T2}} - -Using `tt -i ` to check a specific calling details. - -```bash -$ tt -i 1003 - INDEX 1003 - GMT-CREATE 2018-12-04 11:15:41 - COST(ms) 0.186073 - OBJECT 0x4b67cf4d - CLASS demo.MathGame - METHOD primeFactors - IS-RETURN false - IS-EXCEPTION true - PARAMETERS[0] @Integer[-564322413] - THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need >= 2 - at demo.MathGame.primeFactors(MathGame.java:46) - at demo.MathGame.run(MathGame.java:24) - at demo.MathGame.main(MathGame.java:16) - -Affect(row-cnt:1) cost in 11 ms. -``` - -### Replay record - -Since Arthas stores the context of the call, you can even *replay* the method calling afterwards with extra option `-p` to replay the issue for advanced troubleshooting, option `--replay-times` -define the replay execution times, option `--replay-interval` define the interval(unit in ms,with default value 1000) of replays - -`tt -i 1004 -p`{{execute T2}} - -```bash -$ tt -i 1004 -p - RE-INDEX 1004 - GMT-REPLAY 2018-12-04 11:26:00 - OBJECT 0x4b67cf4d - CLASS demo.MathGame - METHOD primeFactors - PARAMETERS[0] @Integer[946738738] - IS-RETURN true - IS-EXCEPTION false - RETURN-OBJ @ArrayList[ - @Integer[2], - @Integer[11], - @Integer[17], - @Integer[2531387], - ] -Time fragment[1004] successfully replayed. -Affect(row-cnt:1) cost in 14 ms. -``` - -F.Y.I - -1. **Loss** of the `ThreadLocal` - - Arthas save params into an array, then invoke the method with the params again. The method execute in another thread, so the `ThreadLocal` **lost**. - -1. params may be modified - - Arthas save params into an array, they are object references. The Objects may be modified by other code. - diff --git a/tutorials/katacoda/command-version-cn/arthas-boot.md b/tutorials/katacoda/command-version-cn/arthas-boot.md deleted file mode 100644 index 57308c4d247..00000000000 --- a/tutorials/katacoda/command-version-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-version-cn/arthas-demo.md b/tutorials/katacoda/command-version-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-version-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-version-cn/finish.md b/tutorials/katacoda/command-version-cn/finish.md deleted file mode 100644 index 84edf6d30bb..00000000000 --- a/tutorials/katacoda/command-version-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas cls的用法。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-version-cn/index.json b/tutorials/katacoda/command-version-cn/index.json deleted file mode 100644 index f18e6853a93..00000000000 --- a/tutorials/katacoda/command-version-cn/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas version命令教程", - "description": "Arthas version命令教程", - "details": { - "steps": [ - { - "title": "启动math-game", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "version 命令", - "text": "version.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-version-cn/intro.md b/tutorials/katacoda/command-version-cn/intro.md deleted file mode 100644 index 028fec0c800..00000000000 --- a/tutorials/katacoda/command-version-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示version命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-version-cn/version.md b/tutorials/katacoda/command-version-cn/version.md deleted file mode 100644 index d70261cbd57..00000000000 --- a/tutorials/katacoda/command-version-cn/version.md +++ /dev/null @@ -1,4 +0,0 @@ - -通过`version`命令可以输出当前目标 Java 进程所加载的 Arthas 版本号。 - -`version`{{execute T2}} diff --git a/tutorials/katacoda/command-version-en/arthas-boot.md b/tutorials/katacoda/command-version-en/arthas-boot.md deleted file mode 100644 index d3a3f893b6e..00000000000 --- a/tutorials/katacoda/command-version-en/arthas-boot.md +++ /dev/null @@ -1,15 +0,0 @@ - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-version-en/arthas-demo.md b/tutorials/katacoda/command-version-en/arthas-demo.md deleted file mode 100644 index 6f39d51cdb3..00000000000 --- a/tutorials/katacoda/command-version-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. \ No newline at end of file diff --git a/tutorials/katacoda/command-version-en/finish.md b/tutorials/katacoda/command-version-en/finish.md deleted file mode 100644 index bfc0635a398..00000000000 --- a/tutorials/katacoda/command-version-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -Through this tutorial, now you know how to use Arthas `version`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-version-en/index.json b/tutorials/katacoda/command-version-en/index.json deleted file mode 100644 index 4e5df4ef6da..00000000000 --- a/tutorials/katacoda/command-version-en/index.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Arthas version", - "description": "Arthas version", - "details": { - "steps": [ - { - "title": "Start arthas-demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "version command", - "text": "version.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-version-en/intro.md b/tutorials/katacoda/command-version-en/intro.md deleted file mode 100644 index 1932a10510d..00000000000 --- a/tutorials/katacoda/command-version-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of version. - -* Github: https://github.com/alibaba/arthas -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-version-en/version.md b/tutorials/katacoda/command-version-en/version.md deleted file mode 100644 index b52353aec1c..00000000000 --- a/tutorials/katacoda/command-version-en/version.md +++ /dev/null @@ -1,4 +0,0 @@ - -Use `version` to print out Arthas’s version - -`version`{{execute T2}} diff --git a/tutorials/katacoda/command-vmoption-cn/arthas-boot.md b/tutorials/katacoda/command-vmoption-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-vmoption-cn/arthas-demo.md b/tutorials/katacoda/command-vmoption-cn/arthas-demo.md deleted file mode 100644 index a5ca0cec6d5..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/arthas-demo.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 - -为了和使用vmoption后的效果作对比,此时使用`Ctrl+c`{{execute interrupt}},程序很自然地退出。 - -再次启动`math-game`: - -`java -jar math-game.jar`{{execute T1}} diff --git a/tutorials/katacoda/command-vmoption-cn/finish.md b/tutorials/katacoda/command-vmoption-cn/finish.md deleted file mode 100644 index 117d21e872b..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“vmoption”中,我们演示了了Arthas的vmoption命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-vmoption-cn/index.json b/tutorials/katacoda/command-vmoption-cn/index.json deleted file mode 100644 index ed5d83dafa8..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas vmoption命令", - "description": "Arthas vmoption命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "vmoption命令", - "text": "vmoption.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-vmoption-cn/intro.md b/tutorials/katacoda/command-vmoption-cn/intro.md deleted file mode 100644 index f107bc04d77..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示vmoption命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-vmoption-cn/vmoption.md b/tutorials/katacoda/command-vmoption-cn/vmoption.md deleted file mode 100644 index 872ddf9102f..00000000000 --- a/tutorials/katacoda/command-vmoption-cn/vmoption.md +++ /dev/null @@ -1,113 +0,0 @@ - -查看,更新VM诊断相关的参数 - -`vmoption -h`{{execute T2}} - -```bash -[arthas@48]$ vmoption -h - USAGE: - vmoption [-h] [name] [value] - - SUMMARY: - Display, and update the vm diagnostic options. - - Examples: - vmoption - vmoption PrintGC - vmoption PrintGC true - - WIKI: - https://arthas.aliyun.com/doc/vmoption - - OPTIONS: - -h, --help this help - VMOption name - VMOption value - ``` - -## 使用参考 - -### 查看所有的option: - -`vmoption`{{execute T2}} - -```bash -[arthas@56963]$ vmoption - KEY VALUE ORIGIN WRITEABLE ---------------------------------------------------------------------------------------------- - HeapDumpBeforeFullGC false DEFAULT true - HeapDumpAfterFullGC false DEFAULT true - HeapDumpOnOutOfMemory false DEFAULT true - Error - HeapDumpPath DEFAULT true - CMSAbortablePrecleanW 100 DEFAULT true - aitMillis - CMSWaitDuration 2000 DEFAULT true - CMSTriggerInterval -1 DEFAULT true - PrintGC false DEFAULT true - PrintGCDetails true MANAGEMENT true - PrintGCDateStamps false DEFAULT true - PrintGCTimeStamps false DEFAULT true - PrintGCID false DEFAULT true - PrintClassHistogramBe false DEFAULT true - foreFullGC - PrintClassHistogramAf false DEFAULT true - terFullGC - PrintClassHistogram false DEFAULT true - MinHeapFreeRatio 0 DEFAULT true - MaxHeapFreeRatio 100 DEFAULT true - PrintConcurrentLocks false DEFAULT true -``` - -### 查看指定的option - -`vmoption PrintGC`{{execute T2}} - -```bash -$ vmoption PrintGC - KEY VALUE ORIGIN WRITEABLE ---------------------------------------------------------------------------------- - PrintGC false MANAGEMENT true -``` - -### 更新指定的option - -`vmoption PrintGC true`{{execute T2}} - -```bash -$ vmoption PrintGC true -Successfully updated the vm option. - NAME BEFORE-VALUE AFTER-VALUE ------------------------------------- - PrintGC false true -``` - -再使用`vmtool`命令执行强制GC,则可以在`Terminal 1`看到打印出GC日志: - -`vmtool --action forceGc`{{execute T2}} - -``` -[GC (JvmtiEnv ForceGarbageCollection) 33752K->19564K(251392K), 0.0082960 secs] -[Full GC (JvmtiEnv ForceGarbageCollection) 19564K->17091K(166912K), 0.0271085 secs] -``` - -### 配置打印GC详情 - -`vmoption PrintGCDetails true`{{execute T2}} - -```bash -$ vmoption PrintGCDetails true -Successfully updated the vm option. - NAME BEFORE-VALUE AFTER-VALUE -------------------------------------------- - PrintGCDetails false true -``` - -再使用`vmtool`命令执行强制GC,则可以在`Terminal 1`看到打印出GC详情: - -`vmtool --action forceGc`{{execute T2}} - -``` -[GC (JvmtiEnv ForceGarbageCollection) [PSYoungGen: 4395K->352K(76288K)] 21487K->17443K(166912K), 0.0013122 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] -[Full GC (JvmtiEnv ForceGarbageCollection) [PSYoungGen: 352K->0K(76288K)] [ParOldGen: 17091K->16076K(88064K)] 17443K->16076K(164352K), [Metaspace: 20651K->20651K(1069056K)], 0.0251548 secs] [Times: user=0.15 sys=0.01, real=0.02 secs] -``` \ No newline at end of file diff --git a/tutorials/katacoda/command-vmoption-en/arthas-boot.md b/tutorials/katacoda/command-vmoption-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-vmoption-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-vmoption-en/arthas-demo.md b/tutorials/katacoda/command-vmoption-en/arthas-demo.md deleted file mode 100644 index e7e10c21bcc..00000000000 --- a/tutorials/katacoda/command-vmoption-en/arthas-demo.md +++ /dev/null @@ -1,17 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. - -To make a contrast with using vmoption afterwards, now we use `Ctrl+c`{{execute interrupt}} and the program exit without printing any additional infomation. - -Then we start `math-game` again: - -`java -jar math-game.jar`{{execute T1}} diff --git a/tutorials/katacoda/command-vmoption-en/finish.md b/tutorials/katacoda/command-vmoption-en/finish.md deleted file mode 100644 index 27b512bb84b..00000000000 --- a/tutorials/katacoda/command-vmoption-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `vmoption Tutorial` demonstrates the usage of vmoption. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-vmoption-en/index.json b/tutorials/katacoda/command-vmoption-en/index.json deleted file mode 100644 index 324ff3fc426..00000000000 --- a/tutorials/katacoda/command-vmoption-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas vmoption Command", - "description": "Arthas vmoption Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "vmoption Command", - "text": "vmoption.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-vmoption-en/intro.md b/tutorials/katacoda/command-vmoption-en/intro.md deleted file mode 100644 index 58487e88503..00000000000 --- a/tutorials/katacoda/command-vmoption-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the vmoptions, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running vmoptions. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, vmoption states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of vmoption. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-vmoption-en/vmoption.md b/tutorials/katacoda/command-vmoption-en/vmoption.md deleted file mode 100644 index 10400c89711..00000000000 --- a/tutorials/katacoda/command-vmoption-en/vmoption.md +++ /dev/null @@ -1,112 +0,0 @@ - -Display, and update the vm diagnostic options. - -`vmoption -h`{{execute T2}} - -```bash -[arthas@48]$ vmoption -h - USAGE: - vmoption [-h] [name] [value] - - SUMMARY: - Display, and update the vm diagnostic options. - - Examples: - vmoption - vmoption PrintGC - vmoption PrintGC true - - WIKI: - https://arthas.aliyun.com/doc/vmoption - - OPTIONS: - -h, --help this help - VMOption name - VMOption value - ``` - -## Usage - -### View all options - -`vmoption`{{execute T2}} - -```bash -[arthas@56963]$ vmoption - KEY VALUE ORIGIN WRITEABLE ---------------------------------------------------------------------------------------------- - HeapDumpBeforeFullGC false DEFAULT true - HeapDumpAfterFullGC false DEFAULT true - HeapDumpOnOutOfMemory false DEFAULT true - Error - HeapDumpPath DEFAULT true - CMSAbortablePrecleanW 100 DEFAULT true - aitMillis - CMSWaitDuration 2000 DEFAULT true - CMSTriggerInterval -1 DEFAULT true - PrintGC false DEFAULT true - PrintGCDetails true MANAGEMENT true - PrintGCDateStamps false DEFAULT true - PrintGCTimeStamps false DEFAULT true - PrintGCID false DEFAULT true - PrintClassHistogramBe false DEFAULT true - foreFullGC - PrintClassHistogramAf false DEFAULT true - terFullGC - PrintClassHistogram false DEFAULT true - MinHeapFreeRatio 0 DEFAULT true - MaxHeapFreeRatio 100 DEFAULT true - PrintConcurrentLocks false DEFAULT true -``` - -### View individual option - -`vmoption PrintGCDetails`{{execute T2}} - -```bash -[arthas@56963]$ vmoption PrintGCDetails - KEY VALUE ORIGIN WRITEABLE ---------------------------------------------------------------------------------------------- - PrintGCDetails false MANAGEMENT true -``` - -### Update individual option -`vmoption PrintGC true`{{execute T2}} - -```bash -$ vmoption PrintGC true -Successfully updated the vm option. - NAME BEFORE-VALUE AFTER-VALUE ------------------------------------- - PrintGC false true -``` - -Then use the `vmtool` command to force GC, you can see the GC log printed in `Terminal 1`: - -`vmtool --action forceGc`{{execute T2}} - -``` -[GC (JvmtiEnv ForceGarbageCollection) 33752K->19564K(251392K), 0.0082960 secs] -[Full GC (JvmtiEnv ForceGarbageCollection) 19564K->17091K(166912K), 0.0271085 secs] -``` - -### Configure print GC details - -`vmoption PrintGCDetails true`{{execute T2}} - -```bash -$ vmoption PrintGCDetails true -Successfully updated the vm option. - NAME BEFORE-VALUE AFTER-VALUE -------------------------------------------- - PrintGCDetails false true -``` - -Then use the `vmtool` command to force GC, you can see the GC details printed in `Terminal 1`: - -`vmtool --action forceGc`{{execute T2}} - -``` -[GC (JvmtiEnv ForceGarbageCollection) [PSYoungGen: 4395K->352K(76288K)] 21487K->17443K(166912K), 0.0013122 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] -[Full GC (JvmtiEnv ForceGarbageCollection) [PSYoungGen: 352K->0K(76288K)] [ParOldGen: 17091K->16076K(88064K)] 17443K->16076K(164352K), [Metaspace: 20651K->20651K(1069056K)], 0.0251548 secs] [Times: user=0.15 sys=0.01, real=0.02 secs] -``` \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-cn/arthas-boot.md b/tutorials/katacoda/command-vmtool-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-vmtool-cn/finish.md b/tutorials/katacoda/command-vmtool-cn/finish.md deleted file mode 100644 index 14f8e9d36e1..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -通过本教程基本掌握了Arthas vmtool 命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-vmtool-cn/index.json b/tutorials/katacoda/command-vmtool-cn/index.json deleted file mode 100644 index fa7fa03cac8..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas vmtool 命令", - "description": "Arthas vmtool 命令", - "difficulty": "精通者", - "time": "10分钟", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Arthas vmtool 命令", - "text": "vmtool.md" - }, - { - "title": "Arthas vmtool 命令", - "text": "vmtool-spring.md" - }, - { - "title": "Arthas vmtool 命令", - "text": "vmtool-classloader.md" - }, - { - "title": "Arthas vmtool 命令", - "text": "vmtool-gc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-cn/intro.md b/tutorials/katacoda/command-vmtool-cn/intro.md deleted file mode 100644 index d632440c1b3..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/intro.md +++ /dev/null @@ -1,12 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - - -本教程会以一个普通的Spring Boot应用为例,演示使用`vmtool`命令从JVM内部查找对象。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-vmtool-cn/start-demo.md b/tutorials/katacoda/command-vmtool-cn/start-demo.md deleted file mode 100644 index 59be66ea68f..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -下载`demo-arthas-spring-boot.jar`,再用`java -jar`命令启动: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot`是一个很简单的spring boot应用,源代码:[查看](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -启动之后,可以访问80端口: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-cn/vmtool-classloader.md b/tutorials/katacoda/command-vmtool-cn/vmtool-classloader.md deleted file mode 100644 index 5304af1f0f8..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/vmtool-classloader.md +++ /dev/null @@ -1,31 +0,0 @@ - - - -### 指定 classloader name - - -`vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext`{{execute T2}} - - -### 指定 classloader hash - -可以通过`sc`命令查找到加载class的 classloader。 - -```bash -$ sc -d org.springframework.context.ApplicationContext - class-info org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - code-source file:/private/tmp/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-1.5.13.RELEASE.jar!/ - name org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext -... - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@19469ea2 - +-sun.misc.Launcher$AppClassLoader@75b84c92 - +-sun.misc.Launcher$ExtClassLoader@4f023edb - classLoaderHash 19469ea2 -``` - -然后用`-c`/`--classloader` 参数指定: - -```bash -vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext -``` - diff --git a/tutorials/katacoda/command-vmtool-cn/vmtool-gc.md b/tutorials/katacoda/command-vmtool-cn/vmtool-gc.md deleted file mode 100644 index 1b60289aba0..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/vmtool-gc.md +++ /dev/null @@ -1,7 +0,0 @@ - -### 强制GC - - -`vmtool --action forceGc`{{execute T2}} - - diff --git a/tutorials/katacoda/command-vmtool-cn/vmtool-spring.md b/tutorials/katacoda/command-vmtool-cn/vmtool-spring.md deleted file mode 100644 index 9d7d6d8580a..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/vmtool-spring.md +++ /dev/null @@ -1,61 +0,0 @@ -下面使用`vmtool`命令查找spring里的对象。 - -### 查找spring context - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext `{{execute T2}} - -```bash -$ vmtool --action getInstances --className org.springframework.context.ApplicationContext -@ApplicationContext[][ - @AnnotationConfigEmbeddedWebApplicationContext[org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@12028586: startup date [Thu May 13 16:08:38 UTC 2021]; root of context hierarchy], -] -``` - -### 指定返回结果展开层数 - -> `getInstances` action返回结果绑定到`instances`变量上,它是数组。 - -> 通过 `-x`/`--expand` 参数可以指定结果的展开层次,默认值是1。 - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext -x 2`{{execute T2}} - -### 执行表达式 - -> `getInstances` action返回结果绑定到`instances`变量上,它是数组。可以通过`--express`参数执行指定的表达式。 - -查找所有的spring beans名字: - - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext --express 'instances[0].getBeanDefinitionNames()'`{{execute T2}} - - -调用`userController.findUserById(1)`函数: - - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext --express 'instances[0].getBean("userController").findUserById(1)'`{{execute T2}} - -``` -$ vmtool --action getInstances --className org.springframework.context.ApplicationContext --express 'instances[0].getBean("userController").findUserById(1)' -@User[ - id=@Integer[1], - name=@String[name1], -] -``` - -### 查找所有的spring mapping对象 - - -`vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping`{{execute T2}} - -```bash -$ vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping -@HandlerMapping[][ - @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@5d3819c8], - @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@11d509ba], - @RequestMappingHandlerMapping[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@56a5f2e3], - @WelcomePageHandlerMapping[org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WelcomePageHandlerMapping@4c0a4ed3], - @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@51e1f8c3], - @BeanNameUrlHandlerMapping[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@68c0a39c], - @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@110b768d], -] -``` diff --git a/tutorials/katacoda/command-vmtool-cn/vmtool.md b/tutorials/katacoda/command-vmtool-cn/vmtool.md deleted file mode 100644 index 8a3e7bb3f5f..00000000000 --- a/tutorials/katacoda/command-vmtool-cn/vmtool.md +++ /dev/null @@ -1,37 +0,0 @@ - - -下面使用`vmtool`命令查找jvm对象。 - - -### 查找jvm里的字符串对象 - -`vmtool --action getInstances --className java.lang.String`{{execute T2}} - -```bash -$ vmtool --action getInstances --className java.lang.String -@String[][ - @String[Sorry, deque too big], - @String[head=%d tail=%d capacity=%d%n], - @String[elements=%s%n], - @String[sun/nio/ch/IOVecWrapper], - @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791], - @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791], - @String[sun/nio/ch/AllocatedNativeObject], - @String[sun/nio/ch/NativeObject], - @String[sun/nio/ch/IOVecWrapper$Deallocator], - @String[Java_sun_nio_ch_FileDispatcherImpl_writev0], -] -``` - -### limit参数 - -> 通过 `--limit`参数,可以限制返回值数量,避免获取超大数据时对JVM造成压力。默认值是10。 - -所以上面的命令实际上等值于: - -```bash -vmtool --action getInstances --className java.lang.String --limit 10 -``` - -如果设置`--limit`为负数,则遍历所有对象。 - diff --git a/tutorials/katacoda/command-vmtool-en/arthas-boot.md b/tutorials/katacoda/command-vmtool-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-vmtool-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-vmtool-en/finish.md b/tutorials/katacoda/command-vmtool-en/finish.md deleted file mode 100644 index e95ec3febb2..00000000000 --- a/tutorials/katacoda/command-vmtool-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `vmtool Tutorial` demonstrates the usage of `vmtool`. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-vmtool-en/index.json b/tutorials/katacoda/command-vmtool-en/index.json deleted file mode 100644 index e314aafebc7..00000000000 --- a/tutorials/katacoda/command-vmtool-en/index.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "title": "Arthas vmtool command", - "description": "Arthas vmtool command", - "difficulty": "master", - "time": "10 minutes", - "details": { - "steps": [ - { - "title": "Start demo", - "text": "start-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "Arthas vmtool command", - "text": "vmtool.md" - }, - { - "title": "Arthas vmtool command", - "text": "vmtool-spring.md" - }, - { - "title": "Arthas vmtool command", - "text": "vmtool-classloader.md" - }, - { - "title": "Arthas vmtool command", - "text": "vmtool-gc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - }, - "assets": { - "host01": [] - } - }, - "environment": { - "uilayout": "terminal", - "showdashboard": true, - "dashboards": [ - { - "name": "Web Port 80", - "port": 80 - } - ] - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-en/intro.md b/tutorials/katacoda/command-vmtool-en/intro.md deleted file mode 100644 index 1b54d431c8d..00000000000 --- a/tutorials/katacoda/command-vmtool-en/intro.md +++ /dev/null @@ -1,12 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - - -This tutorial takes a simple application as an example to demonstrate the the usage of `vmtool`. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-vmtool-en/start-demo.md b/tutorials/katacoda/command-vmtool-en/start-demo.md deleted file mode 100644 index 4915b847a33..00000000000 --- a/tutorials/katacoda/command-vmtool-en/start-demo.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Download `demo-arthas-spring-boot.jar`, and start with `java -jar` command: - -`wget https://github.com/hengyunabc/spring-boot-inside/raw/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar -java -jar demo-arthas-spring-boot.jar`{{execute T1}} - -`demo-arthas-spring-boot` is a simple Spring Boot demo, the source code here: [View](https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-arthas-spring-boot) - -After booting, access port 80: https://[[HOST_SUBDOMAIN]]-80-[[KATACODA_HOST]].environments.katacoda.com - -![Demo Web](/arthas/scenarios/common-resources/assets/demo-web.png) \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-en/vmtool-classloader.md b/tutorials/katacoda/command-vmtool-en/vmtool-classloader.md deleted file mode 100644 index 5ae959c79ed..00000000000 --- a/tutorials/katacoda/command-vmtool-en/vmtool-classloader.md +++ /dev/null @@ -1,25 +0,0 @@ -### Specify classloader name - -`vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className org.springframework.context.ApplicationContext`{{execute T2}} - -### Specify classloader hash - -The classloader that loads the class can be found through the `sc` command. - -```bash -$ sc -d org.springframework.context.ApplicationContext - class-info org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - code-source file:/private/tmp/demo-arthas-spring-boot.jar!/BOOT-INF/lib/spring-boot-1.5.13.RELEASE.jar!/ - name org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext -... - class-loader +-org.springframework.boot.loader.LaunchedURLClassLoader@19469ea2 - +-sun.misc.Launcher$AppClassLoader@75b84c92 - +-sun.misc.Launcher$ExtClassLoader@4f023edb - classLoaderHash 19469ea2 -``` - -Then use the `-c`/`--classloader` parameter to specify: - -```bash -vmtool --action getInstances -c 19469ea2 --className org.springframework.context.ApplicationContext -``` \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-en/vmtool-gc.md b/tutorials/katacoda/command-vmtool-en/vmtool-gc.md deleted file mode 100644 index cd82543b5ef..00000000000 --- a/tutorials/katacoda/command-vmtool-en/vmtool-gc.md +++ /dev/null @@ -1,4 +0,0 @@ - -### forceGc - -`vmtool --action forceGc`{{execute T2}} \ No newline at end of file diff --git a/tutorials/katacoda/command-vmtool-en/vmtool-spring.md b/tutorials/katacoda/command-vmtool-en/vmtool-spring.md deleted file mode 100644 index da461384c51..00000000000 --- a/tutorials/katacoda/command-vmtool-en/vmtool-spring.md +++ /dev/null @@ -1,57 +0,0 @@ -Next, use the `vmtool` command to find objects in spring. - -### Find spring context - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext `{{execute T2}} - -```bash -$ vmtool --action getInstances --className org.springframework.context.ApplicationContext -@ApplicationContext[][ - @AnnotationConfigEmbeddedWebApplicationContext[org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@12028586: startup date [Thu May 13 16:08:38 UTC 2021]; root of context hierarchy], -] -``` - -### Specify the number of expanded layers of returned results - -> The return result of the `getInstances` action is bound to the `instances` variable, which is an array. - -> The expansion level of the result can be specified by the `-x`/`--expand` parameter, the default value is 1. - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext -x 2`{{execute T2}} - -### Execute expression - -> The return result of the `getInstances` action is bound to the `instances` variable, which is an array. The specified expression can be executed through the `--express` parameter. - -Find the names of all spring beans: - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext --express 'instances[0].getBeanDefinitionNames()'`{{execute T2}} - -Call the `userController.findUserById(1)` method: - -`vmtool --action getInstances --className org.springframework.context.ApplicationContext --express 'instances[0].getBean("userController").findUserById(1)'`{{execute T2}} - -``` -$ vmtool --action getInstances --className org.springframework.context.ApplicationContext --express'instances[0].getBean("userController").findUserById(1)' -@User[ - id=@Integer[1], - name=@String[name1], -] -``` - -### Find all spring mapping objects - -`vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping`{{execute T2}} - -```bash -$ vmtool --action getInstances --className org.springframework.web.servlet.HandlerMapping -@HandlerMapping[][ - @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@5d3819c8], - @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@11d509ba], - @RequestMappingHandlerMapping[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@56a5f2e3], - @WelcomePageHandlerMapping[org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WelcomePageHandlerMapping@4c0a4ed3], - @EmptyHandlerMapping[org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@51e1f8c3], - @BeanNameUrlHandlerMapping[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@68c0a39c], - @SimpleUrlHandlerMapping[org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@110b768d], -] -``` diff --git a/tutorials/katacoda/command-vmtool-en/vmtool.md b/tutorials/katacoda/command-vmtool-en/vmtool.md deleted file mode 100644 index b5bd74b29fb..00000000000 --- a/tutorials/katacoda/command-vmtool-en/vmtool.md +++ /dev/null @@ -1,37 +0,0 @@ - - - -Use the `vmtool` command to find the jvm object. - - -### Find string objects in jvm - -`vmtool --action getInstances --className java.lang.String`{{execute T2}} - -```bash -$ vmtool --action getInstances --className java.lang.String -@String[][ - @String[Sorry, deque too big], - @String[head=%d tail=%d capacity=%d%n], - @String[elements=%s%n], - @String[sun/nio/ch/IOVecWrapper], - @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791], - @String[40252e37-8a73-4960-807e-3495addd5b08:1620922383791], - @String[sun/nio/ch/AllocatedNativeObject], - @String[sun/nio/ch/NativeObject], - @String[sun/nio/ch/IOVecWrapper$Deallocator], - @String[Java_sun_nio_ch_FileDispatcherImpl_writev0], -] -``` - -### limit parameter - -> Through the `--limit` parameter, you can limit the number of return values to avoid pressure on the JVM when obtaining large data. The default value is 10. - -So the above command is actually equivalent to: - -```bash -vmtool --action getInstances --className java.lang.String --limit 10 -``` - -If you set `--limit` to a negative number, all objects are traversed. diff --git a/tutorials/katacoda/command-watch-cn/arthas-boot.md b/tutorials/katacoda/command-watch-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-watch-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-watch-cn/arthas-demo.md b/tutorials/katacoda/command-watch-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-watch-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-watch-cn/finish.md b/tutorials/katacoda/command-watch-cn/finish.md deleted file mode 100644 index 2f3487d1c4e..00000000000 --- a/tutorials/katacoda/command-watch-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“watch”中,我们演示了了Arthas的watch命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-watch-cn/index.json b/tutorials/katacoda/command-watch-cn/index.json deleted file mode 100644 index 2c7cfd9c5a9..00000000000 --- a/tutorials/katacoda/command-watch-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas watch命令", - "description": "Arthas watch命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "watch命令", - "text": "watch.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-watch-cn/intro.md b/tutorials/katacoda/command-watch-cn/intro.md deleted file mode 100644 index 6146a029fb5..00000000000 --- a/tutorials/katacoda/command-watch-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示watch命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-watch-cn/watch.md b/tutorials/katacoda/command-watch-cn/watch.md deleted file mode 100644 index 93917877db6..00000000000 --- a/tutorials/katacoda/command-watch-cn/watch.md +++ /dev/null @@ -1,309 +0,0 @@ - -> 方法执行数据观测 - -让你能方便的观察到指定方法的调用情况。能观察到的范围为:`返回值`、`抛出异常`、`入参`,通过编写 OGNL 表达式进行对应变量的查看。 - -### 参数说明 - -watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象 - -|参数名称|参数说明| -|---:|:---| -|*class-pattern*|类名表达式匹配| -|*method-pattern*|方法名表达式匹配| -|*express*|观察表达式,默认值:`{params, target, returnObj}`| -|*condition-express*|条件表达式| -|[b]|在**方法调用之前**观察| -|[e]|在**方法异常之后**观察| -|[s]|在**方法返回之后**观察| -|[f]|在**方法结束之后**(正常返回和异常返回)观察| -|[E]|开启正则表达式匹配,默认为通配符匹配| -|[x:]|指定输出结果的属性遍历深度,默认为 1| - -这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写`"{params,returnObj}"`,只要是一个合法的 ognl 表达式,都能被正常支持。 - -观察的维度也比较多,主要体现在参数 `advice` 的数据结构上。`Advice` 参数最主要是封装了通知节点的所有信息。请参考[表达式核心变量](advice-class.md)中关于该节点的描述。 - -* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) -* OGNL表达式官网:[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -**特别说明**: - -* watch 命令定义了4个观察事件点,即 `-b` 方法调用前,`-e` 方法异常后,`-s` 方法返回后,`-f` 方法结束后 -* 4个观察事件点 `-b`、`-e`、`-s` 默认关闭,`-f` 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 -* 这里要注意`方法入参`和`方法出参`的区别,有可能在中间被修改导致前后不一致,除了 `-b` 事件点 `params` 代表方法入参外,其余事件都代表方法出参 -* 当使用 `-b` 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在 - -### 使用参考 - -#### 观察方法出参、this对象和返回值 - -> 观察表达式,默认值是`{params, target, returnObj}`。 - -`watch demo.MathGame primeFactors -x 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors -x 2 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 32 ms, listenerId: 5 -method=demo.MathGame.primeFactors location=AtExceptionExit -ts=2021-08-31 15:22:57; [cost=0.220625ms] result=@ArrayList[ - @Object[][ - @Integer[-179173], - ], - @MathGame[ - random=@Random[java.util.Random@31cefde0], - illegalArgumentCount=@Integer[44], - ], - null, -] -method=demo.MathGame.primeFactors location=AtExit -ts=2021-08-31 15:22:58; [cost=1.020982ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@31cefde0], - illegalArgumentCount=@Integer[44], - ], - @ArrayList[ - @Integer[2], - @Integer[2], - @Integer[26947], - ], -] -``` - -* 上面的结果里,说明函数被执行了两次,第一次结果是`location=AtExceptionExit`,说明函数抛出异常了,因此`returnObj`是null -* 在第二次结果里是`location=AtExit`,说明函数正常返回,因此可以看到`returnObj`结果是一个ArrayList - -#### 观察方法入参 - -`watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 50 ms. -ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[ - @Object[][ - @Integer[-1077465243], - ], - null, -] -``` - -* 对比前一个例子,返回值为空(事件点为方法执行前,因此获取不到返回值) - - -#### 同时观察方法调用前和方法返回后 - -`watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 46 ms. -ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13038], - ], - null, -] -ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13038], - ], - @ArrayList[ - @Integer[2], - @Integer[2], - @Integer[2], - @Integer[5], - @Integer[5], - @Integer[73], - @Integer[241], - @Integer[439], - ], -] -``` - -* 参数里`-n 2`,表示只执行两次 - -* 这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果 - -* 结果的输出顺序和事件发生的先后顺序一致,和命令中 `-s -b` 的顺序无关 - -#### 调整`-x`的值,观察具体的方法参数值 - -`watch demo.MathGame primeFactors "{params,target}" -x 3`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors "{params,target}" -x 3 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 58 ms. -ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[ - serialVersionUID=@Long[3905348978240129619], - seed=@AtomicLong[3133719055989], - multiplier=@Long[25214903917], - addend=@Long[11], - mask=@Long[281474976710655], - DOUBLE_UNIT=@Double[1.1102230246251565E-16], - BadBound=@String[bound must be positive], - BadRange=@String[bound must be greater than origin], - BadSize=@String[size must be non-negative], - seedUniquifier=@AtomicLong[-3282039941672302964], - nextNextGaussian=@Double[0.0], - haveNextNextGaussian=@Boolean[false], - serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3], - unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027], - seedOffset=@Long[24], - ], - illegalArgumentCount=@Integer[13159], - ], -] -``` - -* `-x`表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是1。 - - -#### 条件表达式的例子 - -`watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 68 ms. -ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[ - @Integer[-18178089], - @MathGame[demo.MathGame@41cf53f9], -] -``` - -* 只有满足条件的调用,才会有响应。 - -* `watch-express` 单个值可以不加'{}',多个值需要加'{a,b,c}'。 - -* `condition-express` 不能加'{}',可以使用逗号分隔子表达式,取表达式最后一个值来判断。 - -如果watch的方法存在同名的其它重载方法,可以通过下面的办法进行过滤: - - * 根据参数类型进行过滤 - - `watch demo.MathGame primeFactors '{params, params[0].class.name}' 'params[0].class.name == "java.lang.Integer"'`{{execute T2}} - - 按`Q`{{execute T2}}或者`Ctrl+c`退出 - - * 根据参数个数进行过滤 - - `watch demo.MathGame primeFactors '{params, params.length}' 'params.length==1'`{{execute T2}} - - 按`Q`{{execute T2}}或者`Ctrl+c`退出 - -#### 观察异常信息的例子 - -`watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 62 ms. -ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[ - @Integer[-1120397038], - java.lang.IllegalArgumentException: number is: -1120397038, need >= 2 - at demo.MathGame.primeFactors(MathGame.java:46) - at demo.MathGame.run(MathGame.java:24) - at demo.MathGame.main(MathGame.java:16) -, -] -``` - -* `-e`表示抛出异常时才触发 -* express中,表示异常信息的变量是`throwExp` - -根据异常类型或者message进行过滤: - -`watch demo.MathGame primeFactors '{params, throwExp}' '#msg=throwExp.toString(), #msg.contains("IllegalArgumentException")' -e -x 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -#### 按照耗时进行过滤 - -`watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 66 ms. -ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @ArrayList[ - @Integer[5], - @Integer[428379493], - ], -] -``` - -* `#cost>200`(单位是`ms`)表示只有当耗时大于200ms时才会输出,过滤掉执行时间小于200ms的调用 - - -#### 观察当前对象中的属性 - -`watch demo.MathGame primeFactors 'target'`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -如果想查看方法运行前后,当前对象中的属性,可以使用`target`关键字,代表当前对象 - -```bash -$ watch demo.MathGame primeFactors 'target' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 52 ms. -ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13355], -] -``` - -然后使用`target.field_name`访问当前对象的某个属性 - -`watch demo.MathGame primeFactors 'target.illegalArgumentCount'`{{execute T2}} - -按`Q`{{execute T2}}或者`Ctrl+c`退出 - -```bash -$ watch demo.MathGame primeFactors 'target.illegalArgumentCount' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 67 ms. -ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8] -ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8] -``` diff --git a/tutorials/katacoda/command-watch-en/arthas-boot.md b/tutorials/katacoda/command-watch-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-watch-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-watch-en/arthas-demo.md b/tutorials/katacoda/command-watch-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-watch-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-watch-en/finish.md b/tutorials/katacoda/command-watch-en/finish.md deleted file mode 100644 index 43864d1bed8..00000000000 --- a/tutorials/katacoda/command-watch-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `watch Tutorial` demonstrates the usage of watch. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-watch-en/index.json b/tutorials/katacoda/command-watch-en/index.json deleted file mode 100644 index 734b577e43f..00000000000 --- a/tutorials/katacoda/command-watch-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas watch Command", - "description": "Arthas watch Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "watch Command", - "text": "watch.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-watch-en/intro.md b/tutorials/katacoda/command-watch-en/intro.md deleted file mode 100644 index 204515e5e5b..00000000000 --- a/tutorials/katacoda/command-watch-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of watch. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-watch-en/watch.md b/tutorials/katacoda/command-watch-en/watch.md deleted file mode 100644 index 8716f268565..00000000000 --- a/tutorials/katacoda/command-watch-en/watch.md +++ /dev/null @@ -1,304 +0,0 @@ - -Monitor methods in data aspect including `return values`, `exceptions` and `parameters`. - -With the help of [OGNL](https://commons.apache.org/proper/commons-ognl/index.html), you can easily check the details of variables when methods being invoked. - -### Parameters & Options - -There are four different scenarios for `watch` command, which makes it rather complicated. - -|Name|Specification| -|---:|:---| -|*class-pattern*|pattern for the class name| -|*method-pattern*|pattern for the method name| -|*expression*|expression to watch, default value `{params, target, returnObj}`| -|*condition-expression*|condition expression to filter| -|[b]|before method being invoked| -|[e]|when method encountering exceptions| -|[s]|when method exits normally| -|[f]|when method exits (either succeed or fail with exceptions)| -|[E]|turn on regex matching while the default is wildcard matching| -|[x:]|the depth to print the specified property with default value: 1| - -F.Y.I -1. any valid OGNL expression as `"{params,returnObj}"` supported -2. there are four *watching* points: `-b`, `-e`, `-s` and `-f` (the first three are off in default while `-f` on); -3. at the *watching* point, Arthas will use the *expression* to evaluate the variables and print them out; -4. `in parameters` and `out parameters` are different since they can be modified within the invoked methods; `params` stands for `in parameters` in `-b`while `out parameters` in other *watching* points; -5. there are no `return values` and `exceptions` when using `-b`. -6. In the result of the watch command, the `location` information will be printed. There are three possible values for `location`: `AtEnter`, `AtExit`, and `AtExceptionExit`. Corresponding to the method entry, the method returns normally, and the method throws an exception. - -Advanced: -* [Special usages](https://github.com/alibaba/arthas/issues/71) -* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html) - -### Usage - -#### Check the `out parameters`, `this` and `return value` - -> The expression to watch, default value `{params, target, returnObj}` - -```bash -$ watch demo.MathGame primeFactors -x 2 -Press Q or Ctrl+C to abort. -Affect(class count: 1 , method count: 1) cost in 32 ms, listenerId: 5 -method=demo.MathGame.primeFactors location=AtExceptionExit -ts=2021-08-31 15:22:57; [cost=0.220625ms] result=@ArrayList[ - @Object[][ - @Integer[-179173], - ], - @MathGame[ - random=@Random[java.util.Random@31cefde0], - illegalArgumentCount=@Integer[44], - ], - null, -] -method=demo.MathGame.primeFactors location=AtExit -ts=2021-08-31 15:22:58; [cost=1.020982ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@31cefde0], - illegalArgumentCount=@Integer[44], - ], - @ArrayList[ - @Integer[2], - @Integer[2], - @Integer[26947], - ], -] -``` - -* In the above result, the method is executed twice, the first result is `location=AtExceptionExit`, indicating that the method throws an exception, so `returnObj` is null -* In the second result is `location=AtExit`, indicating that the method returns normally, so you can see that the result of `returnObj` is an ArrayList - -#### Check `in parameters` - -`watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 50 ms. -ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[ - @Object[][ - @Integer[-1077465243], - ], - null, -] -``` - -Compared to the previous *check*: - -* `return value` is `null` since it's `-b`. - - -#### Check *before* and *after* at the same time - -`watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 46 ms. -ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13038], - ], - null, -] -ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13038], - ], - @ArrayList[ - @Integer[2], - @Integer[2], - @Integer[2], - @Integer[5], - @Integer[5], - @Integer[73], - @Integer[241], - @Integer[439], - ], -] -``` - -F.Y.I - -* `-n 2`: threshold of execution times is 2. -* the first block of output is the *before watching* point; -* *the order of the output determined by the *watching* order itself (nothing to do with the order of the options `-b -s`). - -#### Use `-x` to check more details - -`watch demo.MathGame primeFactors "{params,target}" -x 3`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors "{params,target}" -x 3 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 58 ms. -ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @MathGame[ - random=@Random[ - serialVersionUID=@Long[3905348978240129619], - seed=@AtomicLong[3133719055989], - multiplier=@Long[25214903917], - addend=@Long[11], - mask=@Long[281474976710655], - DOUBLE_UNIT=@Double[1.1102230246251565E-16], - BadBound=@String[bound must be positive], - BadRange=@String[bound must be greater than origin], - BadSize=@String[size must be non-negative], - seedUniquifier=@AtomicLong[-3282039941672302964], - nextNextGaussian=@Double[0.0], - haveNextNextGaussian=@Boolean[false], - serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3], - unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027], - seedOffset=@Long[24], - ], - illegalArgumentCount=@Integer[13159], - ], -] -``` - -* `-x`: Expand level of object (1 by default) - -#### Use condition expressions to locate specific call - -`watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0" -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 68 ms. -ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[ - @Integer[-18178089], - @MathGame[demo.MathGame@41cf53f9], -] -``` - -* Only calls that meet the conditions will respond. - -* `Watch Express` single value can not be added '{}', and multiple values need to be added '{a, B, C}'. - -* `condition Express` cannot add '{}', you can use commas to separate subexpressions and take the last value of the expression to judge. - -If there are other overloaded methods with the same name in the watch method, you can filter them by the following methods: - - * Filter according to parameter type - - `watch demo.MathGame primeFactors '{params, params[0].class.name}' 'params[0].class.name == "java.lang.Integer"'`{{execute T2}} - - Press `Q`{{execute T2}} or `Ctrl+C` to abort - - * Filter according to the number of parameters - - `watch demo.MathGame primeFactors '{params, params.length}' 'params.length==1'`{{execute T2}} - - Press `Q`{{execute T2}} or `Ctrl+C` to abort - -#### Check `exceptions` - -`watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 62 ms. -ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[ - @Integer[-1120397038], - java.lang.IllegalArgumentException: number is: -1120397038, need >= 2 - at demo.MathGame.primeFactors(MathGame.java:46) - at demo.MathGame.run(MathGame.java:24) - at demo.MathGame.main(MathGame.java:16) -, -] -``` - -* `-e`: Trigger when an exception is thrown -* `throwExp`: the exception object - -Filter according to exception type or message: - -`watch demo.MathGame primeFactors '{params, throwExp}' '#msg=throwExp.toString(), #msg.contains("IllegalArgumentException")' -e -x 2`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -#### Filter by time cost - -`watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2 -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 66 ms. -ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[ - @Object[][ - @Integer[1], - ], - @ArrayList[ - @Integer[5], - @Integer[428379493], - ], -] -``` - -* `#cost>200` (`ms`) filter out all invokings that take less than `200ms`. - - -#### Check the field of the target object - -* `target` is the `this` object in java. - -`watch demo.MathGame primeFactors 'target'`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors 'target' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 52 ms. -ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[ - random=@Random[java.util.Random@522b408a], - illegalArgumentCount=@Integer[13355], -] -``` - -* `target.field_name`: the field of the current object. - -`watch demo.MathGame primeFactors 'target.illegalArgumentCount'`{{execute T2}} - -Press `Q`{{execute T2}} or `Ctrl+C` to abort - -```bash -$ watch demo.MathGame primeFactors 'target.illegalArgumentCount' -Press Ctrl+C to abort. -Affect(class-cnt:1 , method-cnt:1) cost in 67 ms. -ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8] -ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8] -``` diff --git a/tutorials/katacoda/command-wc-cn/arthas-boot.md b/tutorials/katacoda/command-wc-cn/arthas-boot.md deleted file mode 100644 index da13e133e1e..00000000000 --- a/tutorials/katacoda/command-wc-cn/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -在新的`Terminal 2`里,下载`arthas-boot.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot`是`Arthas`的启动程序,它启动后,会列出所有的Java进程,用户可以选择需要诊断的目标进程。 - -选择第一个进程,输入 `1`{{execute T2}} ,再`Enter/回车`: - -Attach成功之后,会打印Arthas LOGO。输入 `help`{{execute T2}} 可以获取到更多的帮助信息。 - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-wc-cn/arthas-demo.md b/tutorials/katacoda/command-wc-cn/arthas-demo.md deleted file mode 100644 index d55f2662215..00000000000 --- a/tutorials/katacoda/command-wc-cn/arthas-demo.md +++ /dev/null @@ -1,10 +0,0 @@ - - - - -下载`math-game.jar`,再用`java -jar`命令启动: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game`是一个很简单的程序,它随机生成整数,再执行因式分解,把结果打印出来。如果生成的随机数是负数,则会打印提示信息。 diff --git a/tutorials/katacoda/command-wc-cn/finish.md b/tutorials/katacoda/command-wc-cn/finish.md deleted file mode 100644 index 6d5c8fa2f41..00000000000 --- a/tutorials/katacoda/command-wc-cn/finish.md +++ /dev/null @@ -1,11 +0,0 @@ - -在“wc”中,我们演示了了Arthas的wc命令。如果有更多的技巧或者使用疑问,欢迎在Issue里提出。 - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc - -如果您在使用Arthas,请让我们知道。您的使用对我们非常重要:[查看](https://github.com/alibaba/arthas/issues/111) - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](/arthas/scenarios/common-resources/assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/command-wc-cn/index.json b/tutorials/katacoda/command-wc-cn/index.json deleted file mode 100644 index a8072fae280..00000000000 --- a/tutorials/katacoda/command-wc-cn/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas wc命令", - "description": "Arthas wc命令", - "difficulty": "精通者", - "time": "10-20 分钟", - "details": { - "steps": [ - { - "title": "启动arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "启动arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "wc命令", - "text": "wc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-wc-cn/intro.md b/tutorials/katacoda/command-wc-cn/intro.md deleted file mode 100644 index 8c7c2a7a77f..00000000000 --- a/tutorials/katacoda/command-wc-cn/intro.md +++ /dev/null @@ -1,23 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。 - -`Arthas` 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 - -当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: - -- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? -- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? -- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? -- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! -- 是否有一个全局视角来查看系统的运行状况? -- 有什么办法可以监控到JVM的实时运行状态? -- 怎么快速定位应用的热点,生成火焰图? - -本教程会以一个简单的应用为例,演示wc命令。 - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ diff --git a/tutorials/katacoda/command-wc-cn/wc.md b/tutorials/katacoda/command-wc-cn/wc.md deleted file mode 100644 index efba917ba9a..00000000000 --- a/tutorials/katacoda/command-wc-cn/wc.md +++ /dev/null @@ -1,32 +0,0 @@ - -按行统计输出结果 - -`jad demo.MathGame main`{{execute T2}} - -```bash -$ jad demo.MathGame main - -ClassLoader: -+-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@7a616cb1 - -Location: -/home/scrapbook/tutorial/math-game.jar - -public static void main(String[] args) throws InterruptedException { - MathGame game = new MathGame(); - while (true) { - game.run(); - TimeUnit.SECONDS.sleep(1L); - } -} - -Affect(row-cnt:1) cost in 138 ms. -``` - -`jad demo.MathGame main | wc -l`{{execute T2}} - -```bash -$ jad demo.MathGame main | wc -l -13 -``` diff --git a/tutorials/katacoda/command-wc-en/arthas-boot.md b/tutorials/katacoda/command-wc-en/arthas-boot.md deleted file mode 100644 index 0f2cd22acfd..00000000000 --- a/tutorials/katacoda/command-wc-en/arthas-boot.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -In the new `Terminal 2`, download `arthas-boot.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/arthas-boot.jar -java -jar arthas-boot.jar`{{execute T2}} - -`arthas-boot` is the launcher for `Arthas`. It lists all the Java processes, and the user can select the target process to be diagnosed. - -Select the first process, type `1`{{execute T2}} ,then type `Enter`: - -After the Attach is successful, Arthas LOGO is printed. Enter `help`{{execute T2}} for more help. - -![Arthas Boot](/arthas/scenarios/common-resources/assets/arthas-boot.png) diff --git a/tutorials/katacoda/command-wc-en/arthas-demo.md b/tutorials/katacoda/command-wc-en/arthas-demo.md deleted file mode 100644 index dcc6454ad69..00000000000 --- a/tutorials/katacoda/command-wc-en/arthas-demo.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Download `math-game.jar` and start with the `java -jar` command: - -`wget https://arthas.aliyun.com/math-game.jar -java -jar math-game.jar`{{execute T1}} - -`math-game` is a very simple program that randomly generates integers, performs factorization, and prints the results. -If the generated random number is negative, a error message will be printed. diff --git a/tutorials/katacoda/command-wc-en/finish.md b/tutorials/katacoda/command-wc-en/finish.md deleted file mode 100644 index ca1743f3534..00000000000 --- a/tutorials/katacoda/command-wc-en/finish.md +++ /dev/null @@ -1,7 +0,0 @@ - -The `wc Tutorial` demonstrates the usage of wc. If you have more tips or questions, please feel free to tell or ask in Issue. - -* Issues: https://github.com/alibaba/arthas/issues -* Documentation: https://arthas.aliyun.com/doc/en - -If you are using Arthas, please let us know that. Your use is very important to us: [View](https://github.com/alibaba/arthas/issues/111) diff --git a/tutorials/katacoda/command-wc-en/index.json b/tutorials/katacoda/command-wc-en/index.json deleted file mode 100644 index 647b0edeb80..00000000000 --- a/tutorials/katacoda/command-wc-en/index.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Arthas wc Command", - "description": "Arthas wc Command", - "difficulty": "master", - "time": "10-20 minutes", - "details": { - "steps": [ - { - "title": "Arthas demo", - "text": "arthas-demo.md" - }, - { - "title": "Start arthas-boot", - "text": "arthas-boot.md" - }, - { - "title": "wc Command", - "text": "wc.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} diff --git a/tutorials/katacoda/command-wc-en/intro.md b/tutorials/katacoda/command-wc-en/intro.md deleted file mode 100644 index 5d270c2ff12..00000000000 --- a/tutorials/katacoda/command-wc-en/intro.md +++ /dev/null @@ -1,39 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -`Arthas` is a Java diagnostic tool open-sourced by Alibaba middleware team. Arthas helps developers in trouble-shooting issues in production environment for Java based applications without modifying code or restarting servers. - -`Arthas` supports JDK 6+, supports Linux/Mac/Windows. - -## Background - -Oftentimes the production system network is inaccessible from local development environment. If issues are encountered in production systems, it is impossible to use IDE to debug the application remotely. What’s even worse, debugging in production environment is unacceptable, as it will suspend all the threads, leading to services downtime. - -Developers could always try to reproduce the same issue on the test/staging environment. However, this is tricky as some issues cannot be reproduced easily in a different environment, or even disappear once restarted. - -And if you’re thinking of adding some logs to your code to help trouble-shoot the issue, you will have to go through the following lifecycle: test, staging, and then to production. Time is money! This approach is inefficient! Worse still, the issue may not be fixed since it might be irreproducible once the JVM is restarted, as described above. - -Arthas is built to solve these issues. A developer can troubleshoot production issues on the fly. No JVM restart, no additional code changes. Arthas works as an observer, that is, it will never suspend your running threads. - -## Key features - -- Check whether a class is loaded? Or where the class is loaded from? (Useful for trouble-shooting jar file conflicts) -- Decompile a class to ensure the code is running as expected. -- Check classloader statistics, e.g. the number of classloaders, the number of classes loaded per classloader, the classloader hierarchy, possible classloader leaks, etc. -- Check the method invocation details, e.g. method parameter, returned values, exceptions and etc. -- Check the stack trace of specified method invocation. This is useful when a developer wants to know the caller of the method. -- Trace the method invocation to find slow sub-invocations. -- Monitor method invocation statistics, e.g. QPS (Query Per Second), RT (Return Time), success rate and etc. -- Monitor system metrics, thread states and CPU usage, GC statistics and etc. -- Supports command line interactive mode, with auto-complete feature enabled. -- Supports telnet and WebSocket, which enables both local and remote diagnostics with command line and browsers. -- Supports profiler/Flame Graph -- Supports JDK 6+ -- Supports Linux/Mac/Windows - -This tutorial takes a simple application as an example to demonstrate the the usage of wc. - -* Github: https://github.com/alibaba/arthas -* Docs: https://arthas.aliyun.com/doc/en diff --git a/tutorials/katacoda/command-wc-en/wc.md b/tutorials/katacoda/command-wc-en/wc.md deleted file mode 100644 index 10d5790971c..00000000000 --- a/tutorials/katacoda/command-wc-en/wc.md +++ /dev/null @@ -1,32 +0,0 @@ - -Count lines. - -`jad demo.MathGame main`{{execute T2}} - -```bash -$ jad demo.MathGame main - -ClassLoader: -+-sun.misc.Launcher$AppClassLoader@70dea4e - +-sun.misc.Launcher$ExtClassLoader@7a616cb1 - -Location: -/home/scrapbook/tutorial/math-game.jar - -public static void main(String[] args) throws InterruptedException { - MathGame game = new MathGame(); - while (true) { - game.run(); - TimeUnit.SECONDS.sleep(1L); - } -} - -Affect(row-cnt:1) cost in 138 ms. -``` - -`jad demo.MathGame main | wc -l`{{execute T2}} - -```bash -$ jad demo.MathGame main | wc -l -13 -``` diff --git a/tutorials/katacoda/common-resources/assets/arthas-boot.png b/tutorials/katacoda/common-resources/assets/arthas-boot.png deleted file mode 100644 index 4871f8341df9f5b6ee7b86efa7735394edf1ee0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38843 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 diff --git a/tutorials/katacoda/common-resources/assets/qrcode_gongzhonghao.jpg b/tutorials/katacoda/common-resources/assets/qrcode_gongzhonghao.jpg deleted file mode 100644 index 9d0e54ab866740cfed3dc31cd6f0866570b3d4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40069 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 K|L^PB+CKrHIhvCI diff --git a/tutorials/katacoda/common-resources/assets/web-console.png b/tutorials/katacoda/common-resources/assets/web-console.png deleted file mode 100644 index 56f44e4f2d697cff034b70c940fdf5324ad88fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50070 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 CP_MNB diff --git a/tutorials/katacoda/common-resources/finish.md b/tutorials/katacoda/common-resources/finish.md deleted file mode 100644 index 7555f78ecb1..00000000000 --- a/tutorials/katacoda/common-resources/finish.md +++ /dev/null @@ -1,9 +0,0 @@ - -* Issues: https://github.com/alibaba/arthas/issues -* 文档: https://arthas.aliyun.com/doc -* Documentation: https://arthas.aliyun.com/doc/en - - -欢迎关注公众号,获取Arthas项目的信息、源码分析、案例实践。 - -![Arthas公众号](./assets/qrcode_gongzhonghao.jpg) diff --git a/tutorials/katacoda/common-resources/hello.md b/tutorials/katacoda/common-resources/hello.md deleted file mode 100644 index 9735371d558..00000000000 --- a/tutorials/katacoda/common-resources/hello.md +++ /dev/null @@ -1,3 +0,0 @@ -本scenario主要用于存放公共资源。 - -This scenario is used to store public resources. diff --git a/tutorials/katacoda/common-resources/index.json b/tutorials/katacoda/common-resources/index.json deleted file mode 100644 index 49c3e21c2a4..00000000000 --- a/tutorials/katacoda/common-resources/index.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "title": "common resources", - "description": "common resources", - "details": { - "steps": [ - { - "title": "hello", - "text": "hello.md" - } - ], - "intro": { - "text": "intro.md" - }, - "finish": { - "text": "finish.md" - } - }, - "environment": { - "uilayout": "terminal" - }, - "backend": { - "imageid": "openjdk:15", - "environmentsprotocol": "http" - } -} \ No newline at end of file diff --git a/tutorials/katacoda/common-resources/intro.md b/tutorials/katacoda/common-resources/intro.md deleted file mode 100644 index a585b72232f..00000000000 --- a/tutorials/katacoda/common-resources/intro.md +++ /dev/null @@ -1,8 +0,0 @@ - - - -![Arthas](https://arthas.aliyun.com/doc/_images/arthas.png) - -* Github: https://github.com/alibaba/arthas -* 文档: https://arthas.aliyun.com/doc/ -* Documentation: https://arthas.aliyun.com/doc/en diff --git a/web-ui/arthasWebConsole/all/share/component/Console.vue b/web-ui/arthasWebConsole/all/share/component/Console.vue index a04ddcdb046..aa4e68ad735 100644 --- a/web-ui/arthasWebConsole/all/share/component/Console.vue +++ b/web-ui/arthasWebConsole/all/share/component/Console.vue @@ -211,13 +211,13 @@ function requestFullScreen(element: HTMLElement) {