Tavaszi felhő álom monolit alkalmazásban

1. Áttekintés

Ebben a cikkben bemutatjuk Tavaszi Felhő Sleuth - hatékony eszköz a naplók javításához bármely alkalmazásban, különösen a több szolgáltatásból felépített rendszerben.

Ehhez az íráshoz a Sleuth használatára fogunk összpontosítani monolit alkalmazásban, nem a mikroszolgáltatások között.

Mindannyiunknak volt olyan szerencsétlen tapasztalata, hogy megpróbáltunk diagnosztizálni egy problémát egy ütemezett feladattal, egy több szálból álló művelettel vagy egy összetett webkéréssel. Gyakran, még naplózás esetén is, nehéz megmondani, hogy milyen műveleteket kell egymással összefüggésbe hozni egyetlen kérés létrehozásához.

Ez megteheti egy bonyolult akció diagnosztizálása nagyon nehéz vagy akár lehetetlen. Gyakran olyan megoldásokat eredményeznek, mint egy egyedi azonosító átadása az egyes metódusoknak a naplók azonosítására irányuló kérésben.

Bejön Nyomoz. Ez a könyvtár lehetővé teszi egy adott munkához, szálhoz vagy kérelemhez tartozó naplók azonosítását. A Sleuth könnyedén integrálódik a hasonló naplózási keretek közé Vissza és SLF4J egyedi azonosítók hozzáadása, amelyek naplók segítségével segítik a problémák nyomon követését és diagnosztizálását.

Vessünk egy pillantást a működésére.

2. Beállítás

Kezdjük azzal, hogy létrehozunk egy Tavaszi csizma webes projekt a kedvenc IDE-nkben, és hozzáadjuk ezt a függőséget a mi pom.xml fájl:

 org.springframework.cloud spring-cloud-starter-sleuth 

Az alkalmazás fut Tavaszi csizma és a szülő pom minden verzióhoz verziót biztosít. Ennek a függőségnek a legújabb verziója megtalálható itt: tavasz-felhő-indító-sleuth. A teljes POM megtekintéséhez nézze meg a projektet a Githubon.

Ezenkívül adjunk hozzá egy alkalmazás nevet az utasításhoz Nyomoz az alkalmazás naplóinak azonosításához.

Miénkben alkalmazás.tulajdonságok fájl adja hozzá ezt a sort:

spring.application.name = Baeldung Sleuth oktatóanyag

3. Álomkonfigurációk

Nyomoz sok helyzetben képes a naplók javítására. A 2.0.0 verziótól kezdve a Spring Cloud Sleuth a Brave programot használja nyomkövetési könyvtárként, amely egyedi azonosítókat ad hozzá az alkalmazásunkba belépő minden webkéréshez. Ezenkívül a tavaszi csapat támogatást adott hozzá ezeknek az azonosítóknak a szálhatárok közötti megosztására.

A nyomokat úgy lehet elképzelni, mint egyetlen kérést vagy munkát, amelyet egy alkalmazás vált ki. A kérelem összes különféle lépésének, még az alkalmazás és a szálhatárok között is, ugyanaz lesz a traceId.

A szakaszokat viszont egy munka vagy kérelem szakaszaként lehet felfogni. Egyetlen nyom több szakaszból állhat, amelyek mindegyike összefügg a kérelem egy adott lépésével vagy szakaszával. A Trace és a span azonosítók segítségével pontosan meghatározhatjuk, hogy mikor és hol található az alkalmazásunk, amikor feldolgozza a kérelmet. A naplók olvasásának megkönnyítése.

Példáinkban ezeket a képességeket egyetlen alkalmazásban vizsgáljuk meg.

3.1. Egyszerű webes kérelem

Először hozzunk létre egy vezérlő osztályt, amely belépési pontként szolgál:

@RestController public class SleuthController {@GetMapping ("/") public String helloSleuth () {logger.info ("Hello Sleuth"); visszatér a "siker"; }}

Futtassuk az alkalmazást, és keressük meg a „// localhost: 8080” címet. Nézze meg a naplókban a következő kimenetet:

2017-01-10 22: 36: 38.254 INFO [Baeldung Sleuth bemutatója, 4e30f7340b3fb631,4e30f7340b3fb631, hamis] 12516 --- [nio-8080-exec-1] c.b.spring.session.SleuthController: Hello Sleuth

Ez úgy néz ki, mint egy normál napló, kivéve a zárójelek közötti elején lévő részt. Ez az alapvető információ, amely Tavaszi álom tette hozzá. Ezek az adatok a következők formátumát követik:

[alkalmazás neve, traceId, spanId, export]

  • Alkalmazás neve - Ez az a név, amelyet a tulajdonságfájlban állítottunk be, és felhasználható ugyanazon alkalmazás több példányának naplóinak összesítésére.
  • TraceId - Ez egy azonosító, amelyet egyetlen kéréshez, munkához vagy művelethez rendelnek. Valami hasonló, mint minden egyedi felhasználó által kezdeményezett internetes kérésnek meg lesz a sajátja traceId.
  • SpanId - Egy munkaegységet követ. Gondoljon egy kérésre, amely több lépésből áll. Minden lépésnek meg lehet a maga spanId és egyedileg kell nyomon követni. Alapértelmezés szerint minden alkalmazásfolyamat ugyanazzal a TraceId és SpanId paranccsal indul.
  • Export - Ez a tulajdonság logikai érték, amely jelzi, hogy ezt a naplót exportálták-e egy aggregátorhoz hasonlóan Zipkin. Zipkin meghaladja a cikk kereteit, de fontos szerepet játszik a Nyomoz.

Mostanra már van némi elképzelése a könyvtár erejéről. Nézzünk meg egy másik példát, hogy tovább demonstráljuk, mennyire szerves ez a könyvtár a naplózásban.

3.2. Egyszerű webes kérelem szolgáltatáshozzáféréssel

Kezdjük egy szolgáltatás létrehozásával egyetlen módszerrel:

@Service public class SleuthService {public void doSomeWorkSameSpan () {Thread.sleep (1000L); logger.info ("Néhány munkát végez"); }}

Injektáljuk a szolgáltatásunkat a vezérlőnkbe, és adjunk hozzá egy kérés-hozzárendelési módszert, amely hozzáfér hozzá:

@Autowired private SleuthService sleuthService; @GetMapping ("/ same-span") public String helloSleuthSameSpan () dobja az InterruptedException {logger.info ("Same Span"); sleuthService.doSomeWorkSameSpan (); visszatér a "siker"; }

Végül indítsa újra az alkalmazást, és keresse meg a „// localhost: 8080 / same-span” címet. Figyelje a napló kimenetét, amely így néz ki:

2017-01-10 22: 51: 47.664 INFO [Baeldung Sleuth oktatóanyag, b77a5ea79036d5b9, b77a5ea79036d5b9, hamis] 12516 --- [nio-8080-exec-3] cbspring.session.SleuthController: Same Span 2017-01-10 22 : 51: 48.664 INFO [Baeldung Sleuth oktatóanyag, b77a5ea79036d5b9, b77a5ea79036d5b9, hamis] 12516 --- [nio-8080-exec-3] c.baeldung.spring.session.SleuthService: Néhány munka elvégzése

Vegye figyelembe, hogy a nyomkövetési és a span azonosító azonos a két napló között, annak ellenére, hogy az üzenetek két különböző osztályból származnak. Ez elenyészővé teszi az egyes naplók azonosítását egy kérés során a traceId kérésének.

Ez az alapértelmezett viselkedés, egy kérés egyszeri traceId és spanId. De manuálisan hozzáadhatunk spanokat, ahogy jónak látjuk. Nézzünk meg egy példát, amely ezt a funkciót használja.

3.3. Span kézi hozzáadása

Először adjunk hozzá egy új vezérlőt:

@GetMapping ("/ new-span") public String helloSleuthNewSpan () {logger.info ("Új Span"); sleuthService.doSomeWorkNewSpan (); visszatér a "siker"; }

És most tegyük hozzá az új módszert a szolgáltatásunkon belül:

@Autowired private Tracer nyomjelző; // ... public void doSomeWorkNewSpan () dobja az InterruptedException {logger.info ("Az eredeti tartományban vagyok"); Span newSpan = tracer.nextSpan (). Name ("newSpan"). Start (); próbáld ki (SpanInScope ws = tracer.withSpanInScope (newSpan.start ())) {Thread.sleep (1000L); logger.info ("Az új fesztávon vagyok, és olyan jó munkát végzek, amelynek saját fesztávra van szüksége"); } végül {newSpan.finish (); } logger.info ("Az eredeti sávban vagyok"); }

Vegye figyelembe, hogy új objektumot is felvettünk, Nyomkövető. A nyomjelző példányt hozza létre Tavaszi álom az indítás során, és függőségi injekcióval elérhetővé válik osztályunk számára.

A nyomokat manuálisan kell elindítani és leállítani. Ennek megvalósításához egy kézzel létrehozott kód fut span belsejébe kerül a próbálkozz végre blokk a span a művelet sikerétől függetlenül zárva van. Ezenkívül vegye figyelembe, hogy új tartományt kell a hatókörbe helyezni.

Indítsa újra az alkalmazást, és keresse meg a „// localhost: 8080 / new-span” címet. Figyelje a napló kimenetét, amely a következőképpen néz ki:

2017-01-11 21: 07: 54.924 INFO [Baeldung Sleuth bemutató, 9cdebbffe8bbbade, 9cdebbffe8bbbade, hamis] 12516 --- [nio-8080-exec-6] cbspring.session.SleuthController: New Span 2017-01-11 21 : 07: 54.924 INFO [Baeldung Sleuth bemutató, 9cdebbffe8bbbade, 9cdebbffe8bbbade, hamis] 12516 --- [nio-8080-exec-6] c.baeldung.spring.session.SleuthService: Az eredeti fesztávon vagyok 2017-01- 11 21: 07: 55.924 INFO [Baeldung Sleuth oktatóanyag, 9cdebbffe8bbbade, 1e706f252a0ee9c2, hamis] 12516 --- [nio-8080-exec-6] c.baeldung.spring.session.SleuthService: Az új tartományban vagyok, és csinálok néhányat hűvös munka, aminek meg kell a saját időtartama 2017-01-11 21: 07: 55.924 INFO [Baeldung Sleuth oktatóanyag, 9cdebbffe8bbbade, 9cdebbffe8bbbade, hamis] 12516 --- [nio-8080-exec-6] c.baeldung.spring.session. SleuthService: Az eredeti tartományban vagyok

Láthatjuk, hogy a harmadik napló osztja a traceId a többiekkel, de egyedülálló spanId. Ezzel fel lehet használni a különböző szakaszok felkutatását egyetlen kérelemben a finomabb szemléletű nyomkövetés érdekében.

Most nézzük meg Sleuth's szálak támogatása.

3.4. Futtatható futók

A. Menetes képességeinek bemutatása Nyomoz először adjunk hozzá egy konfigurációs osztályt egy szálkészlet beállításához:

@Configuration public class ThreadConfig {@Autowired private BeanFactory beanFactory; @Bean public Executor végrehajtó () {ThreadPoolTaskExecutor threadPoolTaskExecutor = új ThreadPoolTaskExecutor (); threadPoolTaskExecutor.setCorePoolSize (1); threadPoolTaskExecutor.setMaxPoolSize (1); threadPoolTaskExecutor.initialize (); return new LazyTraceExecutor (beanFactory, threadPoolTaskExecutor); }}

Fontos itt megjegyezni a LazyTraceExecutor. Ez az osztály a Nyomoz könyvtár és egy speciális végrehajtó, amely a mi traceIds új szálakra, és újat hozhat létre spanIds a folyamat során.

Vezetjük be ezt a végrehajtót a vezérlőnkbe, és használjuk egy új kérés-leképezési módszerben:

@ Meghatalmazott magán végrehajtó végrehajtó; @GetMapping ("/ new-thread") public String helloSleuthNewThread () {logger.info ("Új szál"); Futható futható = () -> {próbáld ki a {Thread.sleep (1000L); } catch (InterruptedException e) {e.printStackTrace (); } logger.info ("Belépek az új szálba - új fesztávolsággal"); }; végrehajtó.execute (futtatható); logger.info ("Végeztem - az eredeti fesztávolsággal"); visszatér a "siker"; }

Ha a helyünkön futható, indítsuk újra az alkalmazást, és lépjünk a “// localhost: 8080 / new-thread” oldalra. Figyelje a napló kimenetét, amely a következőképpen néz ki:

2017-01-11 21: 18: 15.949 INFO [Baeldung Sleuth bemutatója, 96076a78343c364d, 96076a78343c364d, hamis] 12516 --- [nio-8080-exec-9] cbspring.session.SleuthController: Új szál 2017-01-11 21 : 18: 15.950 INFO [Baeldung Sleuth oktatóanyag, 96076a78343c364d, 96076a78343c364d, hamis] 12516 --- [nio-8080-exec-9] cbspring.session.SleuthController: Végeztem - az eredeti fesztávval 2017-01-11 21: 18: 16.953 INFO [Baeldung Sleuth oktatóanyag, 96076a78343c364d, e3b6a68013ddfeea, hamis] 12516 --- [lTaskExecutor-1] cbspring.session.SleuthController: Belépek az új szálba - új fesztávval

Az előző példához hasonlóan láthatjuk, hogy az összes napló ugyanaz traceId. De a futható rönknek egyedi fesztávolsága van, amely nyomon követi az ebben a szálban végzett munkát. Ne feledje, hogy ez a LazyTraceExecutor, ha normál végrehajtót használnánk, továbbra is ugyanezt látnánk spanId használt az új szálban.

Most nézzünk utána Sleuth's támogatása @Aszinkron mód.

3.5. @Aszinkron Támogatás

Az aszinkron támogatás hozzáadásához először módosítsuk ThreadConfig osztály a funkció engedélyezéséhez:

@Configuration @EnableAsync public class A ThreadConfig kiterjeszti az AsyncConfigurerSupport {// ... @ nyilvános végrehajtó felülírása getAsyncExecutor () {ThreadPoolTaskExecutor threadPoolTaskExecutor = új ThreadPoolTaskExecutor (); threadPoolTaskExecutor.setCorePoolSize (1); threadPoolTaskExecutor.setMaxPoolSize (1); threadPoolTaskExecutor.initialize (); return new LazyTraceExecutor (beanFactory, threadPoolTaskExecutor); }}

Vegye figyelembe, hogy meghosszabbítjuk AsyncConfigurerSupport async végrehajtónk és használatunk megadásához LazyTraceExecutor a traceIds és spanIds helyes terjesztésének biztosítása érdekében. Mi is hozzáfűztük @EnableAsync osztályunk csúcsára.

Adjunk hozzá aszinkron metódust szolgáltatásunkhoz:

@Async public void asyncMethod () {logger.info ("Async módszer indítása"); Szál.alszik (1000L); logger.info ("Async módszer befejezése"); }

Most hívjuk meg ezt a módszert a vezérlőnkből:

@GetMapping ("/ async") public String helloSleuthAsync () {logger.info ("Az Async metódus hívása előtt"); sleuthService.asyncMethod (); logger.info ("Async Method Call után"); visszatér a "siker"; }

Végül indítsuk újra a szolgáltatásunkat, és keressük meg a “// localhost: 8080 / async” címet. Figyelje a napló kimenetét, amely a következőképpen néz ki:

2017-01-11 21: 30: 40.621 INFO [Baeldung Sleuth oktatóanyag, c187f81915377fff, c187f81915377fff, hamis] 10072 --- [nio-8080-exec-2] cbspring.session.SleuthController: Mielőtt az Async Method Call 2017-01- 11 21: 30: 40.622 INFO [Baeldung Sleuth oktatóanyag, c187f81915377fff, c187f81915377fff, hamis] 10072 --- [nio-8080-exec-2] cbspring.session.SleuthController: Async Method Call után 2017-01-11 21:30 : 40.622 INFO [Baeldung Sleuth oktatóanyag, c187f81915377fff, 8a9f3f097dca6a9e, hamis] 10072 --- [lTaskExecutor-1] c.baeldung.spring.session.SleuthService: Indítsa el az Async módszert 2017-01-11 21: 30: 41.622 INFO [Ba Oktatóanyag, c187f81915377fff, 8a9f3f097dca6a9e, hamis] 10072 --- [lTaskExecutor-1] c.baeldung.spring.session.SleuthService: Async módszer befejezése

Itt láthatjuk a futható példánkhoz hasonlót, Nyomoz terjeszti a traceId az async módszerbe, és hozzáad egy egyedi spanId-t.

Most dolgozzunk ki egy példát, amely az ütemezett feladatok tavaszi támogatását használja.

3.6. @Ütemezett Támogatás

Végül nézzük meg, hogyan Nyomoz dolgozni valakivel @Ütemezett mód. Ehhez frissítsük ThreadConfig osztály az ütemezés engedélyezéséhez:

A @Configuration @EnableAsync @EnableScheduling nyilvános osztály A ThreadConfig kiterjeszti az AsyncConfigurerSupport megvalósítja a SchedulingConfigurer {// ... @OOrride public void configureTasks (ScheduledTaskRegistrar tervezettTaskRegistrar) {schedTulEschultering) } @Bean (destrMethod = "shutdown") nyilvános végrehajtó schedulingExecutor () {return Executors.newScheduledThreadPool (1); }}

Vegye figyelembe, hogy a SchedulingConfigurer felületen felülírta a configureTasks metódust. Mi is hozzáfűztük @EnableScheduling osztályunk élére.

Ezután adjunk hozzá egy szolgáltatást az ütemezett feladatainkhoz:

@Service public class SchedulingService {private Logger logger = LoggerFactory.getLogger (this.getClass ()); @Autowired private SleuthService sleuthService; @Scheduled (fixedDelay = 30000) public void tervezettWork () dobja az InterruptedException {logger.info ("Indítson el néhány munkát az ütemezett feladattól"); sleuthService.asyncMethod (); logger.info ("Munka befejezése ütemezett feladattól"); }}

Ebben az osztályban egyetlen ütemezett feladatot hoztunk létre fix 30 másodperces késéssel.

Indítsuk újra az alkalmazást, és várjuk meg a feladatunk végrehajtását. Figyelje a konzol ilyen kimenetét:

2017-01-11 21: 30: 58.866 INFO [Baeldung Sleuth oktatóanyag, 3605f5deaea28df2,3605f5deaea28df2, hamis] 10072 --- [pool-1-thread-1] cbspring.session.SchedulingService: Indítson el egy munkát az ütemezett feladatból 2017-ben -01-11 21: 30: 58.866 INFO [Baeldung Sleuth oktatóanyag, 3605f5deaea28df2,3605f5deaea28df2, hamis] 10072 --- [pool-1-thread-1] cbspring.session.SchedulingService: Munka befejezése ütemezett feladattól

Láthatjuk itt Nyomoz új nyomkövetési és span azonosítókat hozott létre feladatunkhoz. A feladatok minden példánya alapértelmezés szerint megkapja a saját nyomát és a span-ot.

4. Következtetés

Befejezésül láttuk, hogyan Tavaszi álom különféle helyzetekben használható egyetlen webalkalmazáson belül. Használhatjuk ezt a technológiát a naplók egyszerű korrelálására egyetlen kérésből, még akkor is, ha a kérelem több szálon is átível.

Mostanra láthatjuk, hogyan Tavaszi Felhő Sleuth segíthet nekünk megőrizni józan eszünket, amikor hibakeresünk egy több szálat tartalmazó környezetet. Az egyes műveletek azonosításával a traceId és minden lépés a spanId valóban elkezdhetjük lebontani a naplóinkban szereplő összetett munkák elemzését.

Még akkor is, ha nem megyünk a felhőbe, Tavaszi álom valószínűleg kritikus függőség szinte minden projektben; zökkenőmentesen integrálható és hatalmas értéknövelés.

Innen érdemes megvizsgálni a Nyomoz. Támogatja az elosztott rendszerek nyomon követését a RestTemplateáltal használt üzenetküldési protokollok között RabbitMQ és Redisés egy olyan átjárón keresztül, mint Zuul.

Mint mindig, a forráskódot a Githubon találja.


$config[zx-auto] not found$config[zx-overlay] not found