Service Tracing, OpenTracing ja Jaeger

Service Tracing, OpenTracing ja Jaeger

Kasutame oma projektides mikroteenuste arhitektuuri. Kui ilmnevad jõudluse kitsaskohad, kulub palju aega logide jälgimisele ja sõelumisele. Üksikute toimingute ajastuse logifaili logimisel on tavaliselt raske mõista, mis nende toimingute käivitamiseni viis, jälgida toimingute jada või ühe toimingu ajanihet teise suhtes erinevates teenustes.

Käsitöö minimeerimiseks otsustasime kasutada üht jälitustööriista. Sellest, kuidas ja miks saate jälgimist kasutada ja kuidas me seda tegime, arutatakse selles artiklis.

Milliseid probleeme saab jälgimisega lahendada

  1. Leidke jõudluse kitsaskohad nii ühest teenusest kui ka kõigi osalevate teenuste kogu täitmispuust. Näiteks:
    • Paljud lühikesed järjestikused kõned teenuste vahel, näiteks geokodeerimiseks või andmebaasi.
    • Pikad sisend-/väljundoodused, näiteks võrguedastused või ketta lugemine.
    • Pikk andmete sõelumine.
    • Pikad toimingud, mis nõuavad protsessorit.
    • Koodilõigud, mida pole lõpptulemuse saamiseks vaja ja mida saab eemaldada või edasi lükata.
  2. Saate selgelt aru, millises järjestuses, mida nimetatakse ja mis juhtub, kui operatsioon tehakse.
    Service Tracing, OpenTracing ja Jaeger
    On näha, et näiteks päring tuli WS-teenusele -> WS-teenus täiendas andmeid R-teenuse kaudu -> seejärel saatis päringu V-teenusele -> V-teenus laadis palju andmeid R teenus -> läks P-teenusesse -> P-teenus läks uuesti teenindusse R -> teenus V ignoreeris tulemust ja läks teenindusse J -> ja alles siis tagastas vastuse teenusele WS, jätkates samal ajal millegi muu arvutamist. taust.
    Ilma sellise jälje või kogu protsessi üksikasjaliku dokumentatsioonita on koodi esmakordsel vaatamisel väga raske aru saada, mis toimub ning kood on erinevates teenustes laiali ja peidetud hunniku prügikastide ja liideste taha.
  3. Täitmispuu kohta teabe kogumine hilisemaks edasilükatud analüüsiks. Igas täitmisetapis saate selles etapis saadaolevale jäljele lisada teavet ja seejärel välja selgitada, millised sisendandmed viisid sarnase stsenaariumini. Näiteks:
    • kasutaja ID
    • õigus
    • Valitud meetodi tüüp
    • Logi või täitmisviga
  4. Jälgede muutmine mõõdikute alamhulgaks ja edasine analüüs juba mõõdikute näol.

Mis jälg saab logida. Span

Jälgimisel on vahemiku mõiste, see on ühe palgi analoog konsoolile. Spaas on:

  • Nimi, tavaliselt käivitatud meetodi nimi
  • Selle teenuse nimi, milles vahemik loodi
  • Oma kordumatu ID
  • Mingi metainfo võtme/väärtuse kujul, mis on sinna sisse logitud. Näiteks meetodi parameetrid või meetod lõppes veaga või mitte
  • Selle ajavahemiku algus- ja lõppajad
  • Vanemajavahemiku ID

Iga ulatus saadetakse ulatuse kogujale, et see salvestatakse andmebaasi hilisemaks ülevaatamiseks niipea, kui see on täitmise lõpetanud. Edaspidi saate luua kõigi vahemike puu, ühendades vanema ID-ga. Analüüsides võib leida näiteks mõne teenuse kõik vahemikud, mis võttis rohkem aega. Peale selle, minnes konkreetsesse ulatusse, vaadake kogu puud selle ulatuse kohal ja all.

Service Tracing, OpenTracing ja Jaeger

Opentrace, Jagger ja kuidas me seda oma projektide jaoks rakendasime

On olemas ühine standard avatud jälg, mis kirjeldab, kuidas ja mida tuleks koguda, ilma et see oleks seotud konkreetse teostusega mis tahes keeles. Näiteks Javas toimub kogu töö jälgedega läbi levinud Opentrace API ja selle alla saab peita näiteks Jaegeri või tühja vaikerakenduse, mis ei tee midagi.
Me kasutame Jaeger Opentrace'i rakendusena. See koosneb mitmest komponendist:

Service Tracing, OpenTracing ja Jaeger

  • Jaeger-agent on kohalik agent, mis tavaliselt installitakse igasse masinasse ja teenused logitakse sellesse kohaliku vaikepordi kaudu. Kui agenti pole, on selle masina kõigi teenuste jäljed tavaliselt keelatud
  • Jaeger-kollektor – kõik agendid saadavad kogutud jäljed sellele ja see paneb need valitud andmebaasi
  • Andmebaas on nende eelistatud kassandra, kuid me kasutame elasticsearchi, seal on juurutused paarile teisele andmebaasile ja mälusisene teostus, mis ei salvesta midagi kettale
  • Jaeger-query on teenus, mis läheb andmebaasi ja tagastab analüüsimiseks juba kogutud jäljed
  • Jaeger-ui on veebiliides jälgede otsimiseks ja vaatamiseks, see läheb jaeger-päringusse

Service Tracing, OpenTracing ja Jaeger

Eraldi komponendiks võib nimetada konkreetsete keelte jaoks mõeldud opentrace jaegeri juurutamist, mille kaudu edastatakse vahemikud jaeger-agendile.
Jaggeri ühendamine Javas taandub liidese io.opentracing.Tracer juurutamisele, mille järel kõik selle kaudu olevad jäljed lendavad tegelikule agendile.

Service Tracing, OpenTracing ja Jaeger

Ka vedrukomponendi jaoks saate ühendada opentracing-spring-cloud-starter ja rakendamine Jaegerilt opentracing-kevad-jaeger-pilve-starter mis konfigureerib automaatselt jälgimise kõigele, mis neid komponente läbib, nt http-päringud kontrolleritele, päringud andmebaasile jdbc kaudu jne.

Jälgede logimine Javas

Kuskil tipptasemel tuleb luua esimene Span, seda saab teha automaatselt, näiteks vedrukontrolleri poolt, kui päring saabub, või käsitsi, kui seda pole. Seejärel edastatakse see alloleva ulatuse kaudu. Kui mõni alltoodud meetoditest soovib vahemikku lisada, võtab see ulatuselt praeguse aktiivse ulatuse, loob uue vahemiku ja ütleb, et selle ema on tulemuseks olev ActiveSpan ning muudab uue ulatuse aktiivseks. Väliste teenuste väljakutsumisel edastatakse neile praegune aktiivne vahemik ja need teenused loovad sellele ajavahemikule viidates uued vahemikud.
Kogu töö käib läbi Traceri eksemplari, saate selle hankida DI mehhanismi kaudu või GlobalTracer.get () globaalse muutujana, kui DI mehhanism ei tööta. Vaikimisi naaseb NoopTracer, kui jälgijat pole lähtestatud, mis ei tee midagi.
Lisaks saadakse praegune ulatus jälgijast ScopeManageri kaudu, praegusest luuakse uus ulatus koos uue ulatuse sidumisega ja seejärel suletakse loodud ulatus, mis sulgeb loodud ulatuse ja tagastab eelmise ulatuse. aktiivne olek. Ulatus on seotud lõimega, nii et mitme lõimega programmeerimisel ei tohi unustada aktiivset vahemikku teisele lõimele üle kanda, et selle ulatuse alusel teise lõime ulatust edasi aktiveerida.

io.opentracing.Tracer tracer = ...; // GlobalTracer.get()

void DoSmth () {
   try (Scope scope = tracer.buildSpan("DoSmth").startActive(true)) {
      ...
   }
}
void DoOther () {
    Span span = tracer.buildSpan("someWork").start();
    try (Scope scope = tracer.scopeManager().activate(span, false)) {
        // Do things.
    } catch(Exception ex) {
        Tags.ERROR.set(span, true);
        span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
    } finally {
        span.finish();
    }
}

void DoAsync () {
    try (Scope scope = tracer.buildSpan("ServiceHandlerSpan").startActive(false)) {
        ...
        final Span span = scope.span();
        doAsyncWork(() -> {
            // STEP 2 ABOVE: reactivate the Span in the callback, passing true to
            // startActive() if/when the Span must be finished.
            try (Scope scope = tracer.scopeManager().activate(span, false)) {
                ...
            }
        });
    }
}

Mitme lõimega programmeerimiseks on olemas ka TracedExecutorService ja sarnased ümbrised, mis edastavad asünkroonsete ülesannete käivitamisel automaatselt praeguse ulatuse lõimele:

private ExecutorService executor = new TracedExecutorService(
    Executors.newFixedThreadPool(10), GlobalTracer.get()
);

Väliste http-päringute jaoks on olemas TracingHttpClient

HttpClient httpClient = new TracingHttpClientBuilder().build();

Probleemid, millega silmitsi seisime

  • Oad ja DI ei tööta alati, kui jälgijat teenuses või komponendis ei kasutata Automaatne juhtmestik Tracer ei pruugi töötada ja peate kasutama faili GlobalTracer.get().
  • Annotatsioonid ei tööta, kui tegemist ei ole komponendi või teenusega või kui meetodit kutsutakse sama klassi naabermeetodist. Kui @Traced ei tööta, peate olema ettevaatlik ja kontrollima, mis töötab. Java annotatsioonide jaoks saab lisada ka täiendava kompilaatori, siis peaksid need kõikjal töötama.
  • Vanas vedru- ja vedrukäivituses opentraing kevadpilve automaatseadistus DI-s esinevate vigade tõttu ei tööta, siis kui soovite, et vedrukomponentides olevad jäljed töötaksid automaatselt, saate seda teha analoogselt github.com/opentracing-contrib/java-spring-jaeger/blob/master/opentracing-spring-jaeger-starter/src/main/java/io/opentracing/contrib/java/spring/jaeger/starter/JaegerAutoConfiguration.java
  • Ressurssidega proovimine ei tööta groovy, peate lõpuks proovima.
  • Igal teenusel peab olema oma spring.application.name, mille alla jäljed logitakse. Mida teeb eraldi nimetus müügile ja testile, et neid koos mitte segada.
  • Kui kasutate GlobalTraceri ja tomcati, on kõigil selles tomcatis töötavatel teenustel üks GlobalTracer, seega on neil kõigil sama teenuse nimi.
  • Jälgede lisamisel meetodile peate olema kindel, et seda ei kutsuta mitu korda tsüklina. Kõigi kõnede jaoks on vaja lisada üks ühine jälg, mis tagab kogu tööaja. Vastasel juhul tekib liigne koormus.
  • Kord jaeger-ui's tehti liiga suuri päringuid suure hulga jälgede kohta ja kuna nad ei oodanud vastust, tehti seda uuesti. Selle tulemusena hakkas jaeger-päring sööma palju mälu ja aeglustama elastsust. Aitas jaeger-query taaskäivitamine

Proovide võtmine, salvestamine ja jälgimine

Neid on kolme tüüpi proovivõtu jäljed:

  1. Const, mis saadab ja salvestab kõik jäljed.
  2. Tõenäosuslik, mis filtreerib jälgi teatud tõenäosusega.
  3. Ratelimiting, mis piirab jälgede arvu sekundis. Neid sätteid saate seadistada kliendil, kas jaeger-agendil või kogujal. Nüüd kasutame väärtuste virnas const 1, kuna taotlusi pole väga palju, kuid need võtavad kaua aega. Tulevikus, kui see avaldab süsteemile liigset koormust, saate seda piirata.

Kui kasutate cassandrat, siis vaikimisi salvestab see jälgi ainult kaks päeva. Me kasutame elastneotsing ja jälgi säilitatakse kogu aeg ja neid ei kustutata. Iga päeva kohta luuakse eraldi register, näiteks jaeger-service-2019-03-04. Tulevikus peate konfigureerima vanade jälgede automaatse puhastamise.

Jälgede vaatamiseks vajate:

  • Valige teenus, mille abil soovite jälgi filtreerida, näiteks tomcat7-default teenuse jaoks, mis töötab tomcatis ja millel ei saa olla oma nime.
  • Seejärel valige toiming, ajaintervall ja minimaalne tööaeg, näiteks alates 10 sekundist, et teha ainult pikki täitmisi.
    Service Tracing, OpenTracing ja Jaeger
  • Minge ühele jäljele ja vaadake, mis seal aeglustus.
    Service Tracing, OpenTracing ja Jaeger

Samuti, kui mõni päringu ID on teada, leiate selle ID järgi jälje sildiotsingu kaudu, kui see ID on jälgimisvahemikku logitud.

Документация

Artiklid

video

Allikas: www.habr.com

Lisa kommentaar