Arthas — alijavin open-source alat za dijagnostiku Jave
Arthas je alijavin open-source alat za dijagnostiku Jave na produkciji; kroz globalni pregled može da prikaže podatke o stanju memorije, GC-a, niti itd. aplikacije, a omogućava i dijagnostiku poslovnih problema bez izmene koda, uključujući pregled argumenata pri pozivu metoda, vremena izvršenja, steka izuzetaka i sl., što znatno povećava efikasnost pronalaženja problema u produkcionom okruženju.
Zvanični sajt Arthasa jeste https://arthas.aliyun.com/doc/, a trenutno najnovija verzija jeste 3.7.2.
Mnogo je moćniji od komandnolinijskih alata i vizuelnih alata koje smo ranije predstavili; ukoliko ponovo naiđete na sledeće probleme, biće vam lako da ih rešite.
- Klijent prijavi problem na produkciji — kako ga ponovo izazvati? Da li da tražite od klijenta da još jednom klikne?
- Izuzetak je progutan i ne znate šta da radite — a kada pogledate ko je napisao taj kod, to ste zapravo vi sami!
- Pronalazite tuđi produkcioni bug, kod još niste ni razumeli, a nema ni jednog reda loga — znoj na dlanu!
- Na preliminarnom okruženju debugujete, pa kad malo potraje, u grupi se digla vika!
- Dodate log i ponovo rasporedite — pola sata ode, problem još nije nađen, a svetiljka iznad glave već odavno osvetljava ceo sprat......
- Na produkcionoj mašini ne možete da debugujete niti da otvorite debug port; da li će ponovno raspoređivanje narušiti trenutno stanje?
- Sumnjate na problem sa ulaznim argumentima, sumnjate na problem sa spajanjem koda, sumnjate da raspoređivanje nije uspelo — sve su upitnici......
- Ceo dan tražite jedan problem, pa vas grde da ste spori......
Čitaoci su neprestano tražili Arthas tutorijal, pa ćemo u ovom tekstu detaljno da ga obradimo.
Instalacija Arthasa
Instalacija na macOS
Isprobajmo ga najpre lokalno. Pošto je moj lokalni računar macOS, uzimaću macOS kao primer; korisnici Windowsa mogu pogledati zvaničnu dokumentaciju — veoma je jednostavno.
Na mom lokalnom računaru već je pokrenut projekat tehnička frakcija (paicoding), pa ćemo kao primer uzeti taj projekat i pogledati upotrebu Arthasa.

Zvanično preporučen način instalacije jeste putem arthas-boot-a, pa ćemo se držati njega:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jarNakon izvršenja gore navedenih komandi, Arthas će izlistati Java procese koje je moguće praćiti — na primer, drugi proces u donjem izlazu [2]: 79209 com.github.paicoding.forum.web.QuickForumApplication jeste proces projekta tehnička frakcija; jednostavno unesite 2 i pritisnite Enter. Arthas će se povezati na taj proces, ispisati log sa Arthas oznakom i ući u interaktivno okruženje Arthas komandi.
$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.7.2
[INFO] Found existing java process, please choose one and input the serial
number of the process, eg : 1. Then hit ENTER.
* [1]: 79001 org.jetbrains.jps.cmdline.Launcher
[2]: 79209 com.github.paicoding.forum.web.QuickForumApplication
2
[arthas@79209]$Instalacija na Linuxu
Kada lokalno prođe, isprobajmo projekat na serveru; tehnička frakcija raspoređena je na Hong Kong server u Tencent Cloudu. Prvo se ulogujemo na server, a zatim izvršimo sledeću komadu da bismo preuzeli arthas-boot.jar:
curl -O https://arthas.aliyun.com/arthas-boot.jarZatim izvršimo java -jar arthas-boot.jar; Arthas će izlistati Java procese koje je moguće praćiti. Unesemo 1, pritisnemo Enter i Arthas će se povezati na proces tehničke frakcije, ispisati log sa Arthas oznakom i ući u interaktivno okruženje Arthas komandi — isti postupak kao na macOS-u.
OK, veoma je jednostavno, verujem da svako može da savlada.
IDEA Arthas dodatak
Arthas pruža i IDEA dodatak koji omogućava neposredno korišćenje Arthasa u IDEA-i (instalira se iz prodavnice dodataka, pretraga „Arthas Idea Plugin”), što je veoma zgodno; desni klik na metodu nudi gotove Arthas komande (watch, trace, monitor...) sa popunjenim imenom klase i metode.
Zvanična dokumentacija:
Često korišćene komande Arthasa
Arthas pruža veoma mnogo komandi, na primer one vezane za JVM:
dashboard: prikaz podataka JVM-a u realnom vremenu, uključujući CPU, memoriju, GC, niti itd.jvm: prikaz podataka o JVM-u, uključujući JVM parametre, class loadere, podatke o klasama, podatke o nitima itd.sysprop: pregled i izmena sistemskih osobina JVM-a.vmoption: pregled i izmena parametara pri pokretanju JVM-a.heapdump: generisanje snimka memorije hipa, slično komandi jmap.
Na primer, vezane za učitavanje klasa:
sc: pregled podataka o klasama, uključujući strukturu klase, metode, polja itd.sm: pregled podataka o metodama, uključujući argumente metode, povratne vrednosti, izuzetke itd.
Na primer, vezane za pozive metoda:
tt: statistika broja poziva metoda i utrošenog vremena.trace: praćenje procesa poziva metoda, uključujući argumente metode, povratne vrednosti, izuzetke itd.monitor: praćenje procesa poziva metoda.
Provešću vas kroz neke od češće korišćenih komada; ostale komande možete naći u zvaničnoj dokumentaciji.
Komanda dashboard
Komanda dashboard može prikazati podatke JVM-a u realnom vremenu, uključujući niti, memoriju, runtime parametre itd.
[arthas@79209]$ dashboard
Threads:
ID NAME PRIORI STATE %CPU TIME INTERRUPT DAEMON
62 DestroyJavaVM 5 RUNNABLE 0.0 0:0 false false
...
Memory:
used total max usage
heap 132M 512M 512M 25.78%
g1_eden_space ...
Runtime:
os.name Mac OS X
java.version 17.0.9
...Komanda thread
Komanda thread može prikazati podatke o nitima, uključujući stanja niti, stekove niti itd.
[arthas@79209]$ thread
Threads Total: 220, New: 42, Runnable: 12, Blocked: 0, Waiting: 88, TimedWaiting: 76 ...
ID NAME GROUP PRIORI STATE %CPU TIME
108 AsyncAppender-Worker-Thread-... main 5 WAITING 0.0 0:0
96 lettuce-eventExecutor-3-1 main 5 RUNNABLE 2.1 0:12
...Argumenti komande thread su:
# ispisuje stek tri niti koje su trenutno najzauzetije
thread -n 3
# prikazuje stek niti sa ID-jem 1
thread 1
# pronalazi nit koja trenutno blokira druge niti
thread -b
# prikazuje niti sa zadatim stanjem
thread -state WAITINGKomanda sysprop
Komanda sysprop može prikazati i izmeniti sistemske osobine JVM-a.

Podržava dopunu komande pomoću TAB tastera~
Komanda logger
Komanda logger može prikazati i izmeniti nivo logovanja; ova komanda je veoma korisna.
Na primer, na produkciji se obično ne ispisuju logovi na DEBUG nivou, ali ponekad nam takvi logovi trebaju da bismo pronašli problem; tada možemo pomoću komande logger izmeniti nivo logovanja.
Prvi korak: najpre komandom logger pregledamo podrazumevani nivo logovanja:

Drugi korak: komandom logger --name ROOT --level DEBUG izmenimo nivo logovanja na DEBUG; ponovnim pregledom nivoa logovanja uviđamo da je izmena uspela:

Komanda sc
Komanda sc može prikazati podatke o klasama, uključujući strukturu klase, metode, polja itd.
Primer 1: komandom sc com.github.paicoding.forum.web.front.* pregledamo sve klase u paketu:
[arthas@79209]$ sc com.github.paicoding.forum.web.front.*
com.github.paicoding.forum.web.front.ReadController
com.github.paicoding.forum.web.front.home.IndexController
com.github.paicoding.forum.web.front.home.vo.IndexVo
...
Affect(row-cnt:47) cost in 13 ms.Primer 2: komandom sc -d com.github.paicoding.forum.web.front.home.IndexController pregledamo detaljne podatke o klasi:

Primer 3: komandom sc -d -f com.github.paicoding.forum.web.front.home.vo.IndexVo pregledamo podatke o poljima klase:

Komanda jad
Komanda jad može dekompilirati bytecode klase; ukoliko vam se učini da kod na produkciji ne odgovara očekivanom, možete ga dekompilirati i pregledati.
Primer 1: komandom jad com.github.paicoding.forum.web.front.home.IndexController dekompiliramo bytecode klase:
[arthas@79209]$ jad com.github.paicoding.forum.web.front.home.IndexController
ClassLoader:
+-org.springframework.boot.loader.LaunchedURLClassLoader@5e2de80c
Location:
/app/quick-forum.jar!/BOOT-INF/classes!/
/*
* Decompiled with CFR.
*/
package com.github.paicoding.forum.web.front.home;
@Controller
public class IndexController {
public IndexVo index(...) { ... }
}Komanda monitor
Komanda monitor može praćiti podatke o izvršenju metoda, uključujući utrošeno vreme i sl.
Primer 1: komandom monitor -c 3 com.github.paicoding.forum.web.front.home.IndexController index praćimo podatke o izvršenju metoda; argument -c označava broj praćenja:

Komanda watch
Komanda watch može posmatrati argumente i povratne vrednosti u procesu izvršenja metoda.
Primer 1: komandom watch com.github.paicoding.forum.web.front.home.IndexController index posmatramo argumente i povratne vrednosti u procesu izvršenja metoda:

Kratak pregled
Arthas je izuzetno moćan, a može se koristiti uz mnoge dodatke, kao što je Arthas IDEA dodatak koga smo malopre pomenuli; podržane komande obuhvataju i sledeće grupe:
- Dijagnostika JVM-a:
dashboard,jvm,sysprop,vmoption,heapdump,getstatic,ognl - Klase i metode:
sc,sm,jad,mc(redefine),watch,trace,stack,tt,monitor - Alati:
logger,vmtool,profiler(async-profiler),options,reset - Ostalo:
help,cls,session,version,history,keymap
Dokumentacija je napisana vrlo celovito (spisak svih komandi), pa neću dalje izlagati; ovaj tekst neka posluži samo kao povod za dalje istraživanje.
Kada ubuduće naiđete na produkcioni problem, iskoristićemo Arthas za konkretnu borbu i prošetaćemo vas kroz nju.
Preporučeno čitanje:
