Jaeger-integraatio kevään käynnistyssovelluksella

(Himank Batra) (9. syyskuuta , 2020)

Jaeger-integraatio kevään käynnistyssovelluksella

Ymmärretään ensin mikä on Jaeger

Jaeger on avoimen lähdekoodin ohjelmisto tapahtumien jäljittämiseen hajautettujen palvelujen välillä.

Sitä käytetään monimutkaisten mikropalveluympäristöjen seurantaan ja vianetsintään.

Ratsastusyritys Uber kehitti Jaegerin avoimen lähdekoodin projektina vuonna 2015. Se hyväksyttiin pilveksi. Native Computing Foundation (CNCF) -hautomoprojekti vuonna 2017 ja ylennettiin valmistuneeksi vuonna 2019.

Mitä hajautettu jäljitys on?

Hajautettu jäljitys on tapa nähdä ja ymmärtää Koko tapahtumaketju monimutkaisessa vuorovaikutuksessa mikropalvelujen välillä.

Moderni, pilvipohjainen ohjelmistokehitys perustuu mikropalveluihin: itsenäisiin palveluihin, joista jokaisella on erilainen ydintoiminto. Kun käyttäjä tekee pyynnön sovelluksessa, monet yksittäiset palvelut reagoivat tuottamaan tuloksen.

Yksi sovelluksen puhelu voi kutsua kymmeniä erilaisia ​​palveluita, jotka ovat vuorovaikutuksessa toistensa kanssa. Kuinka kehittäjät ja insinöörit voivat eristää ongelman, kun jokin menee pieleen tai pyyntö on hidas? Tarvitsemme tapaa seurata kaikkia yhteyksiä.

Siellä tapahtuu hajautettu jäljitys. Se suoritetaan usein osana palveluverkkoa, mikä on tapa hallita ja tarkkailla mikropalveluja.

Jaeger käyttää hajautettua jäljitystä seuraamaan pyynnön polkua eri mikropalvelujen kautta. Arvaamisen sijasta voimme nähdä visuaalisen esityksen puheluvirroista.

Järjestellyt tiedot tapahtumista ovat hyödyllisiä virheenkorjauksessa ja optimoinnissa. Jaeger sisältää työkaluja hajautettujen tapahtumien seuraamiseen, suorituskyvyn ja viiveen optimointiin sekä perussyyanalyysin (RCA), ongelmanratkaisumenetelmän, käyttämiseen.

Jaeger-terminologia ja komponentit

Jaeger esittää suorituspyynnöt jälkiä . Jälki näyttää tietojen / suorituspolun järjestelmän läpi.

Jälki koostuu yhdestä tai useammasta alueesta . Span on looginen työyksikkö Jaegerissa. Jokainen alue sisältää operaation nimen, aloitusajan ja keston. Alat voivat olla sisäkkäisiä ja järjestettyjä.

Jaeger sisältää useita komponentteja, jotka yhdessä keräävät, tallentavat ja visualisoivat alueita ja jälkiä.

Jaeger Client sisältää kielen – OpenTracing-sovellusliittymän erityiset toteutukset hajautettua jäljitystä varten. Näitä voidaan käyttää manuaalisesti tai useiden avoimen lähdekoodin kehysten kanssa.

Jaeger Agent on verkkodemon, joka kuuntelee User Datagram Protocol -protokollan kautta lähetettyjä alueita. Agentti on tarkoitettu sijoitettavaksi samalle isännälle instrumentoidun sovelluksen kanssa. Tämä toteutetaan yleensä sivuvaunun kautta konttiympäristöissä, kuten Kubernetes.

Jaeger Collector vastaanottaa alueet ja sijoittaa ne jonoon käsittelyä varten.

Keräilijät vaativat pysyvä tallennustilan taustajärjestelmä, joten Jaegerillä on myös laajennettava mekanismi span storage.

Kysely on palvelu, joka noutaa jäljet ​​varastosta.

Jaeger Console on käyttöliittymä, jonka avulla voit visualisoida hajautetut jäljitystiedot.

Miksi Jaeger?

Koska paikan päällä olevat mikropalvelujen harjoittajat ymmärtävät nopeasti, suurin osa operatiivisista ongelmista, jotka syntyvät siirryttäessä hajautettuun arkkitehtuuriin, perustuvat lopulta kahteen alueeseen: verkottuminen ja havaittavuus. Se on yksinkertaisesti suuruusluokkaa suurempi ongelma verkottaa ja virittää joukko toisiinsa kietoutuneita hajautettuja palveluita verrattuna yhteen monoliittiseen sovellukseen.

Jaeger toiminnassa

Integroimme jaegerin kevään käynnistyssovelluksiin.

Ensinnäkin, määritetään ensin kevään käynnistyssovelluksemme.

Ajatuksena on luoda nimiä liittämällä kuuluisat tiedemiehet eläinten nimiin.

Rakennamme siis 3 mikropalvelua käyttämällä kevätkenkää eli animal-name-service , name-generator-service, ja scientist-name-service.

Client Request for a scientist and animal concatenated name from name-generator-service joka kutsuu sisäisesti animal-name-service ja scientist-name-service.

Sama näkyy alla olevassa kaaviossa. / p>

Mikropalveluesimerkki

Rakennetaan nopeasti kolme mikropalvelua käyttämällä jousialustaa r.

Lisäämme riippuvuuden spring-boot-starter-web luodessamme kevään käynnistyssovelluksia.

Nyt meillä on valmiina 3 kevään käynnistyssovellusta. Lisätään nämä 3 mikropalvelua kansioon nimeltä opentracing-microservices-example.

Ja tuo tämä kansio suosikkieditoriisi. Käytän IntelliJ .

Koska meidän on soitettava animal-name-service ja scientist- name-service osoitteesta name-generator-service.

päätämme teeskennellä asiakasta tätä varten. Joten lisätään spring-cloud-starter-openfeign: 2.2.3.RELEASE -riippuvuus name-generator-service.

Tässä on koodi kaikki 3 mikropalvelua.

AnimalNameService :

package com.example.ans;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.core.io.ClassPathResource;import org.springframework.http.HttpHeaders;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.List;import java.util.Random;import java.util.stream.Collectors;@SpringBootApplication
public class AnimalNameService {public static void main(String[] args) {SpringApplication.run(AnimalNameService.class, args);}}@RestController
@RequestMapping("/api/v1/animals")
class AnimalNameResource {private final List animalNames;private Random random;public AnimalNameResource() throws IOException {InputStream inputStream = new ClassPathResource("/animals.txt").getInputStream();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {animalNames = reader.lines().collect(Collectors.toList());}random = new Random();}@GetMapping(path = "/random")
public String name(@RequestHeader HttpHeaders headers) {String name = animalNames.get(random.nextInt(animalNames.size()));return name;}}

application.properties:

server.port=9000

NameGeneratorService:

Tässä käytän com.shekhargulati: strman: 0.4 .0 -kirjasto eläinten ja tutkijoiden nimen muuntamiseksi kebab-tapaukseksi.

package com.example.ngs;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.openfeign.EnableFeignClients;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import static strman.Strman.toKebabCase;@SpringBootApplication
@EnableFeignClients
public class NameGeneratorService {public static void main(String[] args) {SpringApplication.run(NameGeneratorService.class, args);}}@FeignClient(name = "scientist-service-client", url = "${scientist.service.prefix.url}")
interface ScientistServiceClient {@GetMapping("/api/v1/scientists/random")
String randomScientistName();}@FeignClient(name = "animal-service-client", url = "${animal.service.prefix.url}")
interface AnimalServiceClient {@GetMapping("/api/v1/animals/random")
String randomAnimalName();}@RestController
@RequestMapping("/api/v1/names")
class NameResource {@Autowired
private AnimalServiceClient animalServiceClient;@Autowired
private ScientistServiceClient scientistServiceClient;@GetMapping(path = "/random")
public String name() throws Exception {String animal = animalServiceClient.randomAnimalName();String scientist = scientistServiceClient.randomScientistName();String name = toKebabCase(scientist) + "-" + toKebabCase(animal);return name;}}

application.properties:

server.port=8080scientist.service.prefix.url=http://localhost:8090animal.service.prefix.url=http://localhost:9000

ScientistNameService:

package com.example.sns;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.core.io.ClassPathResource;import org.springframework.http.HttpHeaders;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestHeader;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.List;import java.util.Random;import java.util.stream.Collectors;@SpringBootApplication
public class ScientistNameService {public static void main(String[] args) {SpringApplication.run(ScientistNameService.class, args);}}@RestController
@RequestMapping("/api/v1/scientists")
class ScientistNameResource {private final List scientistsNames;private Random random;public ScientistNameResource() throws IOException {InputStream inputStream = new ClassPathResource("/scientists.txt").getInputStream();try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {scientistsNames = reader.lines().collect(Collectors.toList());}random = new Random();}@GetMapping(path = "/random")
public String name(@RequestHeader HttpHeaders headers) {String name = scientistsNames.get(random.nextInt(scientistsNames.size()));return name;}}

application.properties :

server.port=8090

Nyt suoritamme kaikki 3 sovellusta ja siirry kohtaan http: // localhost: 8080 / api / v1 / names / random selaimessa.

Saamme satunnaisen nimen esimerkin: john-cockcroft-snapping-turtle

Joten nyt sovelluksemme asennus on valmis.

Integroidaan nyt jaeger näihin sovelluksiin, jotta voimme jäljittää jokainen pyyntö.

Meidän on vain lisättävä alla oleva riippuvuus kaikkiin kolmeen pom.xml-tiedostoon.


io.opentracing.contrib
opentracing-spring-jaeger-cloud-starter3.1.2

Ja meidän on lisättävä alla olevien ominaisuuksien hakemus application.properties-tiedostoon kaikille kolmelle sovellukselle.

spring.application.name= // example : name-generator-service (this will be displayed in jaeger for respective service)opentracing.jaeger.udp-sender.host=localhost //udp host for sender. By default Jaeger libraries use a UDP sender to report finished spans to the jaeger-agent daemonopentracing.jaeger.udp-sender.port=6831 // udp portopentracing.jaeger.log-spans=true // logs the spans in console

Suorita Jaeger dockerissa alla olevan komennon avulla:

docker run -p 9090:16686 — name jaeger -d jaegertracing/all-in-one:1.17

Käynnistä sovellus uudelleen. Ja siirry selaimella osoitteeseen localhost: 9090. Saamme jaeger-kotisivun.

Mene myös selaimessa osoitteeseen http: // localhost: 8080 / api / v1 / names / random . Samoin saat jonkin satunnaisen nimen.

Mutta nyt voimme jäljittää pyynnön. Valitse jaeger-hallintapaneelista valitse palvelu nimi-generaattoripalvelu.

ja napsauta sitten etsi jälkiä. saamme jäljityksiä name-generator-service : n alla olevan kuvan mukaisesti.

Jaeger-nimien generaattoripalvelu

Voimme selvästi nähdä, että tätä jaksoa on 5, kun tarkastelemme tätä.

name-generator-service (1 span)

name-generator-service-> animal-name-service (2 span)

name-generator-service-> tutkija- nimipalvelu (2 jaksoa)

Tämä näkyy alla olevassa kuvassa.

Jaeger Name Generator -palvelun jäljitys

Täällä kaikki määritetään automaattisesti opentracing-spring-jaeger-cloud-starter kirjasto, jonka luokka nimeltä TracingAspect tekee pohjimmiltaan taikuutta.

@Aspect
class TracingAspect {
TracingAspect() {
}

@Around("execution (* feign.Client.*(..)) && !within(is(FinalType))")
public Object feignClientWasCalled(ProceedingJoinPoint pjp) throws Throwable {
Object bean = pjp.getTarget();
if (!(bean instanceof TracingClient)) {
Object[] args = pjp.getArgs();
return (new TracingClientBuilder((Client)bean, FeignTracingAutoConfiguration.this.tracer)).withFeignSpanDecorators(FeignTracingAutoConfiguration.this.spanDecorators).build().execute((Request)args[0], (Options)args[1]);
} else {
return pjp.proceed();
}
}
}

Olen lisännyt Dockerfile-, docker-compose- ja docker- setup.sh tämän sovelluksen suorittamisen helpottamiseksi. kassakoodi ja suorita docker-setup.sh suoraan.

Löydät koodin Github-arkistostani -linkistä .

Tämä on saanut inspiraationsa Shekhar Gulatin blogista .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *