From 1c1713cdfe4ca8960380d97ba1b193b7c5622dbb Mon Sep 17 00:00:00 2001 From: Winson Huang Date: Wed, 27 Sep 2023 11:22:32 +0800 Subject: [PATCH 1/4] profiler command add action collect (#2685) --- .../command/monitor200/ProfilerCommand.java | 49 ++++++++++++++++--- site/docs/doc/profiler.md | 15 +++++- site/docs/en/doc/profiler.md | 17 ++++++- 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java index 2c9cf3cbd0..54657ed302 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/ProfilerCommand.java @@ -219,6 +219,16 @@ public class ProfilerCommand extends AnnotatedCommand { */ private String chunktime; + /** + * run profiler in a loop (continuous profiling) + */ + private String loop; + + /** + * automatically stop profiler at TIME (absolute or relative) + */ + private String timeout; + private static String libPath; private static AsyncProfiler profiler = null; @@ -458,6 +468,25 @@ public void setChunktime(String chunktime) { this.chunktime = chunktime; } + @Option(longName = "loop") + @Description("run profiler in a loop (continuous profiling)") + public void setLoop(String loop) { + this.loop = loop; + if (this.action.equals("collect")) { + this.action = "start"; + } + } + + @Option(longName = "timeout") + @Description("automatically stop profiler at TIME (absolute or relative)") + public void setTimeout(String timeout) { + this.timeout = timeout; + if (this.action.equals("collect")) { + this.action = "start"; + } + } + + private AsyncProfiler profilerInstance() { if (profiler != null) { return profiler; @@ -504,7 +533,7 @@ private AsyncProfiler profilerInstance() { */ public enum ProfilerAction { // start, resume, stop, dump, check, status, meminfo, list, collect, - start, resume, stop, dump, check, status, meminfo, list, + start, resume, stop, dump, check, status, meminfo, list, collect, version, load, @@ -613,6 +642,12 @@ private String executeArgs(ProfilerAction action) { if (this.chunktime!= null) { sb.append("chunktime=").append(this.chunktime).append(COMMA); } + if (this.loop != null) { + sb.append("loop=").append(this.loop).append(COMMA); + } + if (this.timeout != null) { + sb.append("timeout=").append(this.timeout).append(COMMA); + } return sb.toString(); } @@ -646,12 +681,8 @@ public void process(final CommandProcess process) { } String result = execute(asyncProfiler, this.actionArg); appendExecuteResult(process, result); - } else if (ProfilerAction.start.equals(profilerAction)) { - //jfr录制,必须在start的时候就指定文件路径 - if (this.file == null && "jfr".equals(format)) { - this.file = outputFile(); - } - String executeArgs = executeArgs(ProfilerAction.start); + } else if (ProfilerAction.collect.equals(profilerAction)) { + String executeArgs = executeArgs(ProfilerAction.collect); String result = execute(asyncProfiler, executeArgs); ProfilerModel profilerModel = createProfilerModel(result); @@ -677,6 +708,10 @@ public void run() { }, this.duration, TimeUnit.SECONDS); } process.appendResult(profilerModel); + } else if (ProfilerAction.start.equals(profilerAction)) { + String executeArgs = executeArgs(ProfilerAction.start); + String result = execute(asyncProfiler, executeArgs); + appendExecuteResult(process, result); } else if (ProfilerAction.stop.equals(profilerAction)) { ProfilerModel profilerModel = processStop(asyncProfiler, profilerAction); process.appendResult(profilerModel); diff --git a/site/docs/doc/profiler.md b/site/docs/doc/profiler.md index 83a557b48e..190056ec0a 100644 --- a/site/docs/doc/profiler.md +++ b/site/docs/doc/profiler.md @@ -226,10 +226,10 @@ profiler stop --include 'java/*' --include 'com/demo/*' --exclude '*Unsafe.park* ## 指定执行时间 -比如,希望 profiler 执行 300 秒自动结束,可以用 `-d`/`--duration` 参数指定: +比如,希望 profiler 执行 300 秒自动结束,可以用 `-d`/`--duration` 参数为 collect action 指定时间: ```bash -profiler start --duration 300 +profiler collect --duration 300 ``` ## 生成 jfr 格式结果 @@ -338,3 +338,14 @@ profiler --ttsp ```bash profiler start -e cpu --jfrsync profile -f combined.jfr ``` +## 周期性保存结果 + +使用 `--loop TIME` 可以持续运行 profiler 并周期性保存结果。选项格式可以是具体时间 hh:mm:ss 或以秒、分钟、小时或天计算的时间间隔。需要确保指定的输出文件名中包含时间戳,否则每次输出的结果都会覆盖上次保存的结果。以下命令持续执行 profiling 并将每个小时内的记录保存到一个 jfr 文件中。 + +```bash +profiler start --loop 1h -f /var/log/profile-%t.jfr +``` + +## `--timeout` 选项 + +这个选项指定 profiling 自动在多久后停止。该选项和 `--loop` 选项的格式一致,可以是时间点,也可以是一个时间间隔。这两个选项都是用于 `start` action 而不是 `collect` action 的。可参考 [async-profiler Github Discussions](https://github.com/async-profiler/async-profiler/discussions/789) 了解更多信息。 diff --git a/site/docs/en/doc/profiler.md b/site/docs/en/doc/profiler.md index d535b01151..60e4f7732e 100644 --- a/site/docs/en/doc/profiler.md +++ b/site/docs/en/doc/profiler.md @@ -226,10 +226,10 @@ profiler stop --include'java/*' --include 'com/demo/*' --exclude'*Unsafe.park*' ## Specify execution time -For example, if you want the profiler to automatically end after 300 seconds, you can specify it with the `-d`/`--duration` parameter: +For example, if you want the profiler to automatically end after 300 seconds, you can specify it with the `-d`/`--duration` parameter in collect action: ```bash -profiler start --duration 300 +profiler collect --duration 300 ``` ## Generate jfr format result @@ -338,3 +338,16 @@ For example, command below use "profile" config of JFR: ```bash profiler start -e cpu --jfrsync profile -f combined.jfr ``` +## Run profiler in a loop + +Use `--loop TIME` to run profiler in a loop (continuous profiling). The argument is either a clock time (hh:mm:ss) or a loop duration in seconds, minutes, hours, or days. Make sure the filename includes a timestamp pattern, or the output will be overwritten on each iteration. The command below will run profiling endlessly and save records of each hour to a jfr file. + +```bash +profiler start --loop 1h -f /var/log/profile-%t.jfr +``` + +## `--timeout` option + +This option specifies the time when profiling will automatically stop. The format is the same as in loop: it is either a wall clock time (12:34:56) or a relative time interval (2h). + +Both `--loop` and `--timeout` are used for `start` action but not for `collect` action, for further information refer to [async-profiler Github Discussions](https://github.com/async-profiler/async-profiler/discussions/789). From 59292ed9244c974a03b4bdd1f10e43b39d78668a Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Wed, 27 Sep 2023 03:22:54 +0000 Subject: [PATCH 2/4] Prettified Code! --- site/docs/doc/profiler.md | 1 + site/docs/en/doc/profiler.md | 1 + 2 files changed, 2 insertions(+) diff --git a/site/docs/doc/profiler.md b/site/docs/doc/profiler.md index 190056ec0a..0e0f2d2298 100644 --- a/site/docs/doc/profiler.md +++ b/site/docs/doc/profiler.md @@ -338,6 +338,7 @@ profiler --ttsp ```bash profiler start -e cpu --jfrsync profile -f combined.jfr ``` + ## 周期性保存结果 使用 `--loop TIME` 可以持续运行 profiler 并周期性保存结果。选项格式可以是具体时间 hh:mm:ss 或以秒、分钟、小时或天计算的时间间隔。需要确保指定的输出文件名中包含时间戳,否则每次输出的结果都会覆盖上次保存的结果。以下命令持续执行 profiling 并将每个小时内的记录保存到一个 jfr 文件中。 diff --git a/site/docs/en/doc/profiler.md b/site/docs/en/doc/profiler.md index 60e4f7732e..fa7318a276 100644 --- a/site/docs/en/doc/profiler.md +++ b/site/docs/en/doc/profiler.md @@ -338,6 +338,7 @@ For example, command below use "profile" config of JFR: ```bash profiler start -e cpu --jfrsync profile -f combined.jfr ``` + ## Run profiler in a loop Use `--loop TIME` to run profiler in a loop (continuous profiling). The argument is either a clock time (hh:mm:ss) or a loop duration in seconds, minutes, hours, or days. Make sure the filename includes a timestamp pattern, or the output will be overwritten on each iteration. The command below will run profiling endlessly and save records of each hour to a jfr file. From d71828e4870323ed58291a9be742e79f78005a33 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Wed, 27 Sep 2023 18:11:32 +0800 Subject: [PATCH 3/4] add dingding group 4 --- .../.vuepress/public/images/dingding4_qr.png | Bin 0 -> 13986 bytes site/docs/doc/contact-us.md | 10 +++++++--- site/docs/en/doc/contact-us.md | 5 +++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 site/docs/.vuepress/public/images/dingding4_qr.png diff --git a/site/docs/.vuepress/public/images/dingding4_qr.png b/site/docs/.vuepress/public/images/dingding4_qr.png new file mode 100644 index 0000000000000000000000000000000000000000..13dc678a2cf4bfdd9cb9845ab9b128e715be70ec GIT binary patch literal 13986 zcmaKTRZtvE)Ftk&3BlbZL4w=h4ugAu;O_43?k+O}L4#|82X}XOcbon8ZU3#Uedycw z+2Fh!C=)40b$)z}xVK*nGVDQLJdEN42`jouVF#;m#Lsk(E8%r&4si#Y(f)2dai|uG z^IK*7z-;J6Rs1<*9xTp5ZN|m<8@98vEU$d64)g6_TL2xn;b{DuwZfJ@*I^{JbHjEZY7S94w+d(vC~1T)QaMlsWaU2@t^~&OV{C)V`d>!Wg+|q29Y!L72?VzpDL+WW>@(0fOgg9{`o3`h(@5o42KQxRfiwUp_}(SEDnH(t6j3VFvkNzJx*k!7G4SOTh@2*;gV9QG_}=&(%u0vVU|oDH_+ zs`zpt3bT>t1tyS&kEX|L5s!$-#WJ!6ht7Qhj8aS+q$Y;>&7Jl3negf(Q(r}x`phD_Y-}AVK0uf;-;?!$9XV5f7 zW6u=E+W#k^{x6Er^uMR^p)HP2@ehq_&tvKJ(gz4n%JaC({ z?q9@RL~PY`S?EaQlT?ZMsC-FzFXcpJUKBoSy0PN&%9Ry_a%cFP4#`lcWr#>%3ckbb z?*;PRnE-CFe{}CI1-v0V%3uL^*UG{09W7W#9|gqQGBxbIQY!K5u-+E+dxL&aim^nEOJaJNGa^ zzs~bLOS_@93T2kN&X^aMgrqBoTTc?D(tNf?bqb9jAG={5$;SSp=yC}h*Ic>W^mJb# z3qyl!j-1GFAy(h|7tw(afsJckCzCsg+H~Y^`G#uR1+Ue^B}vHA0u?R@%M5;ga*;-b zv1)R8rdXdD(}A1kEK-Ih%;>3Jado`|WxE@O+0v~e>(|=#ufqecbat&7PX6yxl&gvV z?wXO<4f{NA&q(;d{!I;zA8FG1`;+kLZ}ULgZE_`tj&^!}wS3gZ&ZzAjOa!{9?mvcH zQ&$EX@Xd}}b3B0AKYEDvM<#k-61b&*Hv|&DArX3VGd9tW4=;F<;$7(WQPlD^E;sWI zS+%rbk42@o@hi3`&W33q^DBPlmZ-x-@r*2nD6t#DuR0A}?9^GdODH5_`+w1Q>~m5MTmRo4r}y7=tII7pHorfrI-Ij~hv(ZLQ4Kx|D0 zw76G~)ZO1=1KYJG5%vzu_1dHrRFYpl)RL%1xZeKFo5S^zk$0lsScndZw34yOs1}Jc zn0}$(xq2+c#J}9$tauYqn`UW)pa?n~J>)@bf@0{G{V(v%DppM-)a@=XRcRdD5FG*A zrHbXvDWSyM64ui{OE52-kg4IgTjELR#_Xs*7pAoT?0H~9+?V}m#pP<6?3@IPSu#7Elu&-s-UdLxk_FU(jj%AwA7e(XkP?{TpJSS$W6v-RDa>e$Aaa$v;?h!of~I7Hn!Oc)9Iwmy~3j;dD~j@*6|ik)yfyB;&2r z`ruIvUnrZ)0-JgxcukI~-_KFlqQ(J)Lm_&y9oaDSsrCq|Xf&ajc1XKeKLrI*j&Lw$ z%lgbyCF04>oi6QZ<=@Xi2PQf77R~GVm*g1&HOMG~+gpLE(oLZ+H&Zjt{cajviSZiA z)Q_v^_5{(8o|*4Wm*&eZ{+{$s$aw6uEq-QY|OIm zgxf!--VU@7H>qnkU4#|S+)xXc7-GT=A2gL%UGBQ7nE=X9_(AvH88dtBDOk`_ZBpFI0=Vjj9cFa&e>X^n$(NG+7&e2gq*G0 zU|q40sQoDR=MMR(&TB>HDh@I;OyyRoG+5X7l}-F@?4zGuhR^g&I;gi*lhhVJ>%_@uufGQ?^sA@!#n8P4uSEyzL+7Wr@EC&R z`_ObHID~oKJx6Qa5)&YbEaj2gNNQiCPm@@gkhlfl9_u7!LpTMHYrety(iR_4dG1TV zK2&01lZ6pBBp^-|Mq-6vE2Ua>&ew#pQ+FoO=GouY1ytm(c+cd$I!*46k6bzPcRedE z5MP%iwmW|g3Bc}vJ){ZJC6B^=d5lut^!hBvT7}EXruyo z6XPchHSyK#P~DvsSN%g%uv6LyC~(OM_NO+F z;d&vtCY9p!vMVkxK=;+1L?A{uuD6UnbGA*4>BP$KR)R)ayqErKY7Xrl_2rMi9F_{A z9YtPESq#N66Fr}%aGCmyG38~kFcc>*0bGeViZL1I&Vn6`J(r}^u#JUP)O87J=1j&h z!;HeLaU)w7B{+eNjK*z^vmMegMNr^L8rf_LUB7n6=&Fp6ZYY^FFr{noBfsHyDW#b^ zv7cf}Q0=RhsOFErmVOl!wAk$XAS_Dj)E+#QysDHCD!vA6n~puiIS&yqsK%<;wSJ_Ry%J73z691gr+G_S#g#BkRi=X16FAixN<-fs0tG>qwr#~u;--q+x=-vas z1I30*w7q_WfmO@UM864oUO6OruSYoK)^4!A{vQr6o!^h@TX6LEOkStPcW$~s@2|R< zR=^2shd_(ge$&?X(hwde*-(P$DVOr5rI;8>Ken=`-2*5CiS#|9A+TE9Tj5!&!ty~q zc6x0V@xQrk4E{YGzJ&BE!Wp6nr9_bnnG&LKWUOG}=cfbYR5JUCWV#V90G=BL84707 z>YYTYQ9eAm&tXsib=`dwhu^sbvc!`>W0Q&}cmKJ`ZF zo1hj5Najc z0N8Veo{{C<1%W%4m;<}5X~Pz)T9_v2e+h0lwCOT~10GgXyahHd=z#0K_~BJ?DSyix zU})ryH@^Kb5=yK#D8qx1MkZS|h^<5+?@AK7ct_WVN5C1f4Fu2@O;1&_R~}szN~4Y5 zs92&=>yuxEu0+U()W*KlFc_L7F)uRgA_IowIO&}$7 z%}W+l>)3x&-xv`$OA784==il#tNQP-!>DXkWg0hEw9tP|wOFnG+&7P@6zKWxVESIXTl+(o9gUJr~$pG@x&ERr~zO^x4Fi9LZ) zCVGN!k94%d_8zFIc24*cP6#9p%`kd@4PbVcIiJ%nVbLz&#?2waBU|yOZCyeZCd}Gp zttjyW+zHv%7lzA`y-4+!)!=a-QEpG=Qt_hk9f;$Zw<%>|zMvN($sI)j;{H=KTBB-3 zFDwuNFZH7>d_Ft=t=ir0yQi*lms3Bf!WTRt3I^22)dRiQ{%k9PgN}3LxdMGalU4`j zN9l!P5~)luV@$t#Q4{Mrv_|qGy6O-H*xw)4f$O5d8!|chxZBnE&Np%J65EV0f@?6P zdHVcvkV=L2^xZT~8&fM%TdCQ$kD}DBWx73@3!U-ZUXCpU?uQPTz7Fpvtlrcs3fzw@ z`68?dIWjvLx?b6mky$08RBYes(?5r*WqG+jSQP79S#GxkYLwE;|0*|VQ86@~t$yWi z|5qE2KR$cF^0*oK8UOLaPeA>{#FCt4ysAdeans)Pi`^zUMLv1ea~bZdF=ojhWgCOj zjqe<#cP(BxeQwbN*7^kd#A+_H9INfbu#{5@c*sNjsSEl=B;P+wc%U^5+-2cxy_#at z(4yEiLo_RYC*o7Q#=2*;0Q@g>ro#(t^A^@%vylFk!{4no13!jZo^0Lx36nt!Y zP+ln68mU}7LO0sczsN=-fFs2iC4-ggsb zC>Sq@1KSqiv3VV}vscN}&pp&XHs4Ip85b;`uUb?RTjH3MsD{gofFf`42C}ex-Djs1 z)*YP_{9r%0^rIs9g9i8A-&6sr&TY!{vX2vo_fC8LLrml)bu&Q#0b{tRUZyml7Thzt z--Np*`}1;LqDqCxmAKT5G1;(YsvU@E=GcS@UisuxkKareqIY%uz>IkiT1U~V%YSmy zmI&VCw)FgZxC682@hHx5sTD^v4_z-f=>T$bZna1V2MU_&(*UR~a8`->5^} zU#uQ1?2-S`eX=VyIwi}SqdYUEjE@ez5?PDyk+k0^{66c9hT?l>LevSndJ9N$f8di|BQacOh-Q93)6(s#fqkJT?;fd7pG^WqLX z@n%gt*85&8B1ZbQ-nrF!FY;%4Q-AB48gT)48I?-G^pu#a$GQ1Fkfs6_=ShE-UsE~O zl~%fEIM9DL>$fI|Q-kU&Ot3}RLP)LfHZ9DZ+^E#D9?q-6i8eqajNhGy!QJT8pp$|$ zGFKIReR}MusXkV12?(ie>?P`$6I-4wtSSS%xX$abo~czz)d6EKK~PKZVGd-kaIDmC zs@@kMK?nmULC`vpqn+e$35~AVNqjiBLP(4MU^xZqg{Rzk+73|Yy`{Bdmr<)XCbYG|3Qy!djpLNSG(m`$3Nq`~+a9V_1Rio^h`A>^rIn6ed9850 zHW&Jfq}foET3W;fXiL|8Wa|D}o2&!$H6s{JrY}n5)J#I-^sDu`%ZomC&8v7FU>ghp z&vh>%dGsvC2^NqaLkKwV#U!78i@})%QnWr|llrtMNxy;BEhi}_?cF#XMPfYnLK>7u z@BuW$+%~Em%!YO^_ryRo2>B1BCCb*xl7$ zW1B&Q(jDVvMf$rYYHlnxDl;D4BPnXu+)&RL7>92cvs$E1Sw-82;&QnW8yww(|5U#f zayuX^=;o$jvTk<>X(9oLlTML4!ZhTketd`#gvdNHnQC%r&d6+i7nn2&pY!F^{#JfZ zp==ZLnydJ-OCy|?_{d=lcJVVUy#HYVqv|tysgZS;JMovla{h$%9g#vuyBJ#ry;;QQ ztt=raLw0EM$l=?E()woccrAn`IlaZbndIj{*v@s|v4*vNgF!n3! zpCas+v!6PW4QEqCLaQ^Hd#Q?ozRO3y&p`s@A!ir-tQKAon$1d*6bA?-#KSvH3AdowQxG&$Uw#ou? zeKVa^(v^CS9=ULM2dW8U8(m|&*_0lNQaroKe^H% z=m1`Fq3T|F#NpxaWQ5}QSFy0Q_iaE#9pL!WYeJ*ozuK-d>#zGg%p-fG-2-~R6s*(e zG1{r4r1Iw|-yw@R#D<8weYr<3PB}T4^GSxPE5!*HD!-SD+MdceE!Yj4Juh^S(ig7r z{DJ?ZLvrtWoZU$N)Xmm`u=yc;@uhts1z-_tL*l5?*Wy0{0r>Ic9A8Mlxs_i5f#ZpM9SWu_QeDxBY z2C+d?^V%o&99Px#9~wBQ2pmOt!0Z|cnWv#=TCCu(v8Jjpul_j`-|{cXtj&yAZ-$+R{5WRDvd zkjRTH+A`jLiY(&Qz(t8+3VO2(1#R2dQ`6!YUoi1rSZ~3wN06+Eb6oFM1wGsu3Ml2JMVDzWVv;QZH4-8i@m8}DL*3vs37PLl*r`MeCQ&|6!<+M zq42|n`-#;!)k$z8t7cO@0I>nMidu2hQDpZxvt7KEXcGL&Y#vR0j?vfedh%e#22*@z z*Q;IFaFvOJsw5GQA4!ePex%55g_)}$&YmRdGBir%9I*Z=CN2-E=()|`#Iwr602d*S zE`mbL_uw}9{;=c_)z|h~bL%AT{4BAYFizk|MH3eBl7!nk;2D||W$G%@{iWc%Hk;`M zG5d@t;Ftv`+#ZHYaj>kWk#qigdl1*n2E+L41B2dD9>A}?#3rglWuswN45Jxs{Nhje zh0Ci6Z3I8-N!f>7P6c$PO5BX_9+?2p#z_gzX8LE8oh6 z#a*UYXtcHYVWaH+_e;{yGxQ^RDP&H)GN@+B zf)k$CmEj|<#OxbsHpf?)N4JGLrSay+I{p6n@$)1`3?2IY&5nRjBC}6W^ZL7{j_j}{ zeH4*pp+6aUgKV^N$3VXu&BL3Dz|ijJe~1H5t=(my{%AFq6KC=z>%UZZLIA2+)H%)b zycjji3w9ScIu+Rq$sgBCI{``$_l~1mCJ!Tl8JPqGkr4;g+lx?@i@hM(Bx;mX$?&%x z&*|^&MF!#SyPw8*$_&LYG~#X2Coz-?aBN}dy8O!%o!#IBs_zRUIU6zCkJJzx>>edy zF?jApzSk+&%y!_YVp5;O{7xzyHw~uiac^G(GCV^VTmE}K{<;fT4{zpsrVl`3Cf?3< zz`Ewo_>dn;s-9iI*%A9-OE2~*_BGi`*eX+|bHB_JDcvKV;=yIOQ^A`aY5sDF@~ya( z&GrSJKRQ;~GV&7L$7PvV4kv{arqD#XE|Pi-i?dr*2EyXqq3p1~o;Vzj@^ukm?92{4DCOC1aJ+Rmgg6s`8MlwnY)v9?T#eX^U% z{K7?~GhvQk8()8x!+^^35oxgn8~n|?uvBlX#w^E@I$?~fDC>>8p`p5hpyB?FGede3 z7jBBjpA7a|9uZ}7p7-v7hqO>n%x&&A@Va$RtCwRMdO=2aHMyXg-;?>Y4E5?6HIc1|^b`nD0-u%< zrUS#CM0^zpqb+OI7Pdfuk}L~4^YPG@}H+?n`J*m zRi_k_?&=4#DoNLw*}63Nn*^|2ulVpd27H9k)YkF;4UAH#yQKbGV2L!(NMql!PM%xb zO>^e~8cE%1%d1gt7hsNu4D&5cZ6?Xg`SbPfE*G37RHjVa!?>^%`{wVT(@lV~K}nYx zc-F?Y56riEj+s{!R>vn-zlWDm!v;UwzGHczg@hir0XrYKbu@T@!-h4TRFII4yh1I4 zq!}8Q{y9Qv_0x^bwNZqa8skb_DM|?033yQr8HJ#lu?~-sdNOC5ttM`NK9Tfe?FSr2 zvmvV@kVYBhj4P!bQczqtn294>rII|(fm^XA`M8$LLKE~;&SSr^Sv+6B@(-?PU;@q6v(01K5j#u6jn?l);j;p?vqMKb>FJu6DC@Ug5LPABOlTg@RRyXOoD>Wxixou-Rm_nB|nmI zwnlVCanwxaS=ivvF0t=Ew?%MuaRlz3}$lQ-{f<+p}MXzGJN)K5DxDZskz zlCq4UwyVkq+Pk6Kd@X9vsfn_E2yR0`j>^r6@)F_Lc&T7Qyez(vDhVl(wU39v#eWhapsYuAiih*5L_@+g;c%&Z$cZIH7q_eQIKY_F8l)2aJ8ENEzqTl$I4>rmQa>nl z`!T^_>>GU8PF~OOG-A5eH+2^&f~3zil|!?db`EV@Wx96C(Vu8ts84~A(0`=zARBO% zX~w{4se7OZE<|~K9x`F|R8-sTYXm6?S10_nJDX0UOtG`Z%KOOetfvuafvPdxA$O{( zE2N$I>z%1o;Ql{T-EYU9vv++wO0#ON{tLne4X;9n2Cy^1%zqvQa3D0}Gv1e3;V@)!HYR|T(~z}lR8%t-c|JnBi@4QW9iL+ z!ES?_zMdcyv7jW3m_#Hksw8bH>rBTNYKX0zkovJpiCc3cJx{ORnX_b|z{^GXXH2F} zD`CPGP+W+)RGKTNqh%zHn(<0`TREmVIkB&fG*ZT?91b~LqIge zm<7V!JxOyU_4@)R$#LW!sLDC`v35s^%K>FG31tBZbTVokq6atbs|8fH%n8!aKgj#- z0*?D>>bOY|jtukne)I}Ox|rN}q`JJ8lNaksYD!l@N5tL6j6cju-=giJiz%V>ccAmo z($UC&hO#B93@&azem4|WJNDH#YvCcX*H`nxjg)xSYI>~zCVjMEBWzJU+Ux4X6KaCO z?Q^74O9HH2bZXEGnf`)Syz8AVpL;@5*@+9fsjJgcXTva^BuyM0f4DYbg}$uTC7e_q z>ni-$3ss^JV!p>`$OLEj@G}}dfk$|(l}Jo%TlYp7v)M|^wyOu2J;Fw7<_lm~68%XmbJ_cvg}&#gqwqrU<0Vva>? zAkCSC&)7fAbl6Bx^AH)x(z${;r05jRRZMfj4Wd7}uyA4WR&)ol9|nl}VI5Vf{JleO zwi?Wk56T`mU`HX#D76*pPTjv|Q|zBgBckF(?resX>hQN4QA0@A%M^Recr^2zK7~fM z%qhRs4l()Zv6^-?M-VSmjxda`&XK?P`bT~|$p7Z#p^m_&bw_`5@mupe4L=Oxvjwa@R~X5{Hp8|=!qBJH^8v>S?aEa8nVwM zXGMfC?a#CwFv7$_{YyjQpwj-Qmspr@I+?1fqOgSD9-jLxg} zE$bftzwmC&50&6v&f@P*gk7~i_`P;&6BtN3{NX6N6$OF}D)b0SP#qoI-{^`e%-cne zJ~sp?EC=X5uw+#v`qZlAc0V~m?`se?wc6WJt&3Ps42OTj4ZIXhYl7zmm*h_Z8Tzt+ zK_@ojMkyS}6>hX+duuVNQ_We#ON-yihx45u37%tD+|A;?(1P&#!{Y?m2797V_ zlVWzTtfr5We^sB9s&#|uC?R7=aj<_qP_ki}F3tNSKsZs}S$2_IB9-oiPP9 znWqPJT7)?4Igh!VmzluSQBoR7#!9dO7S^PAw=HGMkA75V0?@?K$Is|6V@A40pv~{O z%-t~>O8zR<%|dV{!^yy}h=bPh^6U*HW;q@;h43JsJ8=NKi)-c7C=gUKg@CL6m|#m6F|)FWQDhqR_mEcm32?*3aj|i} z3PcG?`>k=^B{Y0%J9=pr;kYKb-V=j#qe{vdM{xX+wg1fHGF#rTwzmvfQy)71;Ev|l zL(b6|_7`H<3t@_FH~YuEJcg?AS>+pL{GCv+)5!OmiDcz;ArAMg?<8_~d0JMjai5sS z08KOYQuLM2e-oMNnKjES7NX_dn2DIb9A|?I+Iv84lal=&QS;0J<~BZ*%F(#?84>*i zkZHO%3DnpeS!GFu{suAQfA8TuqG4#1&MD+*(FJ-YE--%Nego-9Ig@w}(tH&T!53Vp z=-uX@yt&`A(}TDwHFQ;LO_Fi_ota8sI2CB@ikx@ED(wt{W6Tvk6^ORIG0*C-Hu8zz)1dkpwLCv7bQ~_)+wew1 zGPA_TtDbhSd3f#+wgZ@*XaW)-bP`BB zPoePbwI3KDE8{A1B9)_}-s6((+tg87jy-N9HGAxAO#aBZKPm=RRLV}`7?~U3rPE)w zKHzUx4BS%9=!IVVJW+9cJ1I=*G+h>R-O<;S3t1bTxsfD=%BvVvQZ=79{`?) zQ!@j)I@llS0O7K(6S^qSaa7TApbeWGe6hjp>y2r>T#Bu{E`IU1L!@L<9!>cX)R3|4 zk^-A>yiQ90zod;4DKt&gqrl92Vg2olt)LQ2b;E3veW|DsPOnN$u)LZagv45(inqNY zEicWDR!AYCr6#x1O75w!6kql<{8pe*VzEf@DT8$Kb&CE_?@7r^0i!!cL>x-U^!J0u zB(|UE#Z6fYu^nHlBMEFo(c}6I9vQ#(CXCnN%@Jo2I0l(KTI%kcN z>Akrl+s-wmws&lZ7oWDl^_b=XpXD*j3r62cYwI`cSbc&8j03q5a|Ah6n%if!MUmOP;R=%*jL*pD;^S2o$LhnCe-7 z2rl9!BH_Y?`Q;@!#cpp>Ghfd!1)5Ut?Z7JnvnpMbiAg>-0ESm{5m4Gs&5G`0xHa(+ z5h|uQ@+XryVbj_vc(hWj@e*rXuac1&{AuT7-wN_#d3gzN4&{@Wrb8{m@JORkH@Gae z=jAa{n*g4&tR5IhBTcDI7c(dy;W<8WuIWQZ~U2bevtdv# zt;(*>3@AG;h@OMD_?Hjsm1{2!dvR)5fWq!QW*yWuLphCP^=I3ov4#~3$8Pb$_xcrN z7rt$8B2&XY3vK%Ft?0&+#P>1;kaa2hLRt5d=$_c*bXy(!M7~&M7IsRk?nrDsMXr_zs;v3s6-_ee*kbXS>1Q3&a^KA^9!%t|B(cm1j209?Ge1v UpyU4cbqq#MN*PciVG{Dc0J`cQE&u=k literal 0 HcmV?d00001 diff --git a/site/docs/doc/contact-us.md b/site/docs/doc/contact-us.md index dbfff42c8b..c9512665b7 100644 --- a/site/docs/doc/contact-us.md +++ b/site/docs/doc/contact-us.md @@ -16,18 +16,22 @@ ### 钉钉群 -- Arthas 开源交流钉钉群: 21965291 ,搜索群号即可加入。(如果满了无法加入,请加 3 群) +- Arthas 开源交流钉钉群: 21965291 ,搜索群号即可加入。(如果满了无法加入,请加 4 群) ![](/images/dingding_qr.jpg) -- Arthas 开源交流钉钉群 2: 30707824 ,搜索群号即可加入。(如果满了无法加入,请加 3 群) +- Arthas 开源交流钉钉群 2: 30707824 ,搜索群号即可加入。(如果满了无法加入,请加 4 群) ![](/images/dingding2_qr.jpg) -- Arthas 开源交流钉钉群 3: 17605006847 ,搜索群号即可加入。 +- Arthas 开源交流钉钉群 3: 17605006847 ,搜索群号即可加入。(如果满了无法加入,请加 4 群) ![](/images/dingding3_qr.jpg) +- Arthas 开源交流钉钉群 4: 41920010710 ,搜索群号即可加入。 + +![](/images/dingding4_qr.png) + ### QQ 群 Arthas 开源交流 QQ 群: 916328269 (如果满了无法加入,请加 3 群) diff --git a/site/docs/en/doc/contact-us.md b/site/docs/en/doc/contact-us.md index ace3e92790..6308d6e106 100644 --- a/site/docs/en/doc/contact-us.md +++ b/site/docs/en/doc/contact-us.md @@ -18,6 +18,11 @@ Questions about how to use Arthas and opinions can be directly raised in issues ![](/images/dingding3_qr.jpg) +- Arthas open source discussion Group 4: 41920010710 , You can join by searching for group number。 + +![](/images/dingding4_qr.png) + + ### Instructions for Installing DingTalk DingTalk can be downloaded from: [https://www.dingtalk.com/en](https://page.dingtalk.com/wow/dingtalk/act/en-download) From 8d9af06592b2a43dbcfb5bc51ecfdb57eb69027c Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Wed, 27 Sep 2023 10:12:16 +0000 Subject: [PATCH 4/4] Prettified Code! --- site/docs/en/doc/contact-us.md | 1 - 1 file changed, 1 deletion(-) diff --git a/site/docs/en/doc/contact-us.md b/site/docs/en/doc/contact-us.md index 6308d6e106..abe3531bf7 100644 --- a/site/docs/en/doc/contact-us.md +++ b/site/docs/en/doc/contact-us.md @@ -22,7 +22,6 @@ Questions about how to use Arthas and opinions can be directly raised in issues ![](/images/dingding4_qr.png) - ### Instructions for Installing DingTalk DingTalk can be downloaded from: [https://www.dingtalk.com/en](https://page.dingtalk.com/wow/dingtalk/act/en-download)