Tracing Service, OpenTracing û Jaeger

Tracing Service, OpenTracing û Jaeger

Em di projeyên xwe de mîmariya microservice bikar tînin. Dema ku tengahiyên performansê çêdibin, gelek dem li çavdêrîkirin û parvekirina têketin têne xerc kirin. Dema ku demjimêrên operasyonên kesane li pelek têketinê tê tomar kirin, bi gelemperî dijwar e ku meriv fêm bike ka çi bûye sedema gazîkirina van operasyonan, şopandina rêza çalakiyan an guheztina demê ya operasyonek li gorî ya din di karûbarên cûda de.

Ji bo kêmkirina keda destan, me biryar da ku em yek ji amûrên şopandinê bikar bînin. Li ser ka hûn çawa û çima hûn dikarin şopandinê bikar bînin û me ew çawa kir, û dê di vê gotarê de were nîqaş kirin.

Çi pirsgirêk dikarin bi şopandinê çareser bibin

  1. Hem di nav karûbarek yekane de û hem jî di tevahiya dara darvekirinê de di navbera hemî karûbarên beşdar de tengahiyên performansê bibînin. Bo nimûne:
    • Gelek bangên paşîn ên kurt ên di navbera karûbaran de, ji bo nimûne, ji bo geocoding an databasek.
    • Li benda I/O ya dirêj, wek veguheztina torê an xwendina dîskê.
    • Parskirina daneya dirêj.
    • Operasyonên dirêj ên ku cpu hewce dike.
    • Beşên kodê yên ku ji bo bidestxistina encama dawî ne hewce ne û dikarin werin rakirin an dereng kirin.
  2. Eşkere fêm bikin ku bi kîjan rêzê tê gotin û dema ku emeliyat tê kirin çi diqewime.
    Tracing Service, OpenTracing û Jaeger
    Wusa tê dîtin ku, mînakî, Daxwaz ji karûbarê WS re hat -> karûbarê WS daneyan bi karûbarê R temam kir -> dûv re daxwazek ji karûbarê V re şand -> karûbarê V gelek dane ji karûbarê V bar kir. Xizmeta R -> çû servîsa P -> karûbarê P dîsa çû servîsa R -> karûbarê V encamê guh neda û çû servîsa J -> û tenê dûv re bersiv vegerand karûbarê WS, di heman demê de domandina hesabkirina tiştek din di nav de. paşperdeya.
    Bêyî şopek wusa an belgeyek hûrgulî ji bo tevahiya pêvajoyê, pir dijwar e ku meriv fêm bike ka çi diqewime dema ku cara yekem li kodê mêze dike, û kod li ser karûbarên cihêreng belav dibe û li pişt komek çîp û navgînan tê veşartin.
  3. Berhevkirina agahdariya di derbarê dara darvekirinê de ji bo analîzên paşdemayî yên paşîn. Di her qonaxa darvekirinê de, hûn dikarin agahdariya li şopa ku di vê qonaxê de berdest in lê zêde bikin û dûv re fêr bibin ka kîjan daneya têketinê rê li ber senaryoyek wekhev vekiriye. Bo nimûne:
    • ID bikarhêner
    • Mafê
    • Cureyê rêbaza hilbijartî
    • Têketin an xeletiya darvekirinê
  4. Veguherandina şopan di binkomek metrîkan de û analîzên din ên berê di forma metrikan de.

Çi şop dikare têketinê. Span

Di şopandinê de têgeha span heye, ev analoga yek têketinê ye, ji konsolê re. Spa heye:

  • Nav, bi gelemperî navê rêbaza ku hatî darve kirin
  • Navê karûbarê ku tê de span hate çêkirin
  • Xwedî nasnameya yekane
  • Hin cûre agahdariya meta di forma mifteyek / nirxek ku tê de hatî tomar kirin. Mînakî, pîvanên rêbazê an jî rêbaz bi xeletiyek qediya an na
  • Demên destpêk û dawîyê ji bo vê paşîn
  • Dê û bav span ID

Her span ji berhevkarê span re tê şandin da ku di databasê de were hilanîn ji bo paşerojê gava ku ew pêkanîna xwe qedand. Di pêşerojê de, hûn dikarin bi girêdana bi nasnameya dêûbav re darek ji hemî deran ava bikin. Dema ku hûn analîz dikin, hûn dikarin, mînakî, hemî pêlên di hin karûbaran de ku ji hindek dem zêdetir girtiye bibînin. Zêdetir, bi çûna bervekek taybetî, tevahiya darê li jor û jêrê vê span bibînin.

Tracing Service, OpenTracing û Jaeger

Opentrace, Jagger û me çawa ew ji bo projeyên xwe bicîh kir

Standardek hevpar heye opentrace, ku rave dike ka çawa û çi divê were berhev kirin, bêyî ku bi şopandina pêkanîna taybetî ya bi zimanekî ve were girêdan. Mînakî, di Java de, hemî xebata bi şopan re bi navgîniya Opentrace API-ya hevpar ve tête kirin, û di binê wê de, mînakî, Jaeger an pêkanîna xwerû ya vala ku tiştek nake nikare were veşartin.
Em bi kar tînin Neçirvan wekî pêkanîna Opentrace. Ew ji çend beşan pêk tê:

Tracing Service, OpenTracing û Jaeger

  • Jaeger-agent karmendek herêmî ye ku bi gelemperî li ser her makîneyê tê saz kirin û karûbar li ser porta xwerû ya herêmî tê têketî kirin. Ger nûnerek tune be, wê hingê şopên hemî karûbarên li ser vê makîneyê bi gelemperî têne asteng kirin
  • Jaeger-collector - hemî ajan şopên berhevkirî jê re dişînin, û ew wan di databasa hilbijartî de dixe
  • Database kasa bijareya wan e, lê em elasticsearch bikar tînin, ji bo çend databasên din pêkanîn hene û pêkanînek di bîranînê de ku tiştek ji dîskê xilas nake.
  • Jaeger-query karûbarek e ku diçe databasê û şopên jixwe berhevkirî ji bo analîzê vedigerîne
  • Jaeger-ui ji bo lêgerîn û dîtina şopan navgînek malperê ye, ew diçe jaeger-query

Tracing Service, OpenTracing û Jaeger

Parçeyek cihêreng dikare were binav kirin pêkanîna opentrace jaeger ji bo zimanên taybetî, bi navgîniya ku spans ji jaeger-agent re têne şandin.
Girêdana Jagger di Java de ber bi pêkanîna pêwendiya io.opentracing.Tracer ve tê, piştî ku hemî şopên bi navgîniya wê ve dê berbi nûnerê rastîn ve bifirin.

Tracing Service, OpenTracing û Jaeger

Di heman demê de ji bo pêkhateya biharê, hûn dikarin bi hev ve girêbidin opentracing-spring-cloud-starter û pêkanîna ji Jaeger opentracing-spring-jaeger-cloud-starter ku dê bixweber şopandina her tiştê ku di van pêkhateyan re derbas dibe mîheng bike, mînakî daxwazên http ji kontrolkeran re, daxwazên ji databasê bi jdbc, hwd.

Şopên têketina Java

Li cîhek di asta jorîn de, divê Span yekem were afirandin, ev dikare bixweber were kirin, mînakî, ji hêla kontrolkerê biharê ve dema ku daxwazek tê wergirtin, an bi destan heke tune be. Dûv re ew bi navgîniya Qada jêrîn ve tê şandin. Ger yek ji rêbazên jêrîn bixwaze Spanek lê zêde bike, ew ActiveSpan-a heyî ji Scope digire, Spanek nû diafirîne û dibêje dêûbavê wê ActiveSpan-a encam e, û Span-a nû çalak dike. Dema ku gazî karûbarên derveyî dikin, heyama aktîf a heyî ji wan re tê derbas kirin, û ew karûbar bi referansa vê paşîn ve qonaxên nû diafirînin.
Hemî kar bi mînaka Tracer re derbas dibe, heke mekanîzmaya DI nexebite hûn dikarin wê bi mekanîzmaya DI, an GlobalTracer.get () wekî guhêrbarek gerdûnî bistînin. Bi xwerû, heke şopkar nehatibe destpêkirin, NoopTracer dê vegere ku tiştek nake.
Zêdetir, qada heyî bi riya ScopeManager ji şopgerê tê wergirtin, ji ya heyî ve bi girêdana paşîn a nû ve çarçoveyek nû tê afirandin, û dûv re Qada ku hatî afirandin tê girtin, ku qada çêkirî digre û Qada berê vedigerîne. dewleta çalak. Qadan bi mijarekê ve girêdayî ye, ji ber vê yekê dema ku bernamesaziya pir-tevlihevî çêdike, divê hûn ji bîr nekin ku veguheztina deverek çalak veguhezînin mijarek din, ji bo aktîvkirina din a Qada mijarek din bi referansa vê paşîn.

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)) {
                ...
            }
        });
    }
}

Ji bo bernamesaziya pir-mijarî, di heman demê de TracedExecutorService û pêlavên mîna wan jî hene ku dema ku peywirên asynkron têne destpêkirin bixweber dirêjahiya heyî ber bi mijarê ve dişînin:

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

Ji bo daxwazên http yên derveyî hene TracingHttpClient

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

Pirsgirêkên ku em rû bi rû man

  • Fasûlî û DI her gav naxebitin heke şopger di karûbarek an pêkhateyek de neyê bikar anîn, wê hingê Autowired Dibe ku Tracer nexebite û hûn neçar in ku GlobalTracer.get () bikar bînin.
  • Heke ew ne pêkhateyek an karûbar be, an ger ku rêbaz ji rêbazek cîran a heman polê were gazî kirin, şîrove naxebitin. Pêdivî ye ku hûn baldar bin ku hûn kontrol bikin ka çi dixebite û ger @Traced nexebite çêkirina şopa manual bikar bînin. Her weha hûn dikarin berhevkarek din ji bo şîroveyên java ve girêbidin, wê hingê divê ew li her deverê bixebitin.
  • Di pêlava bihar û biharê ya kevn de, xweseriya ewrê biharê ya opentraing ji ber xeletiyên di DI-yê de nexebite, wê hingê ger hûn dixwazin şopên di hêmanên biharê de bixweber bixebitin, hûn dikarin wê bi analogî bi bikin. 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
  • Bi çavkaniyan biceribînin di groovy de naxebite, divê hûn di dawiyê de biceribînin.
  • Pêdivî ye ku her karûbar xwedan spring.application.name be, ku di bin wê de dê şop bêne tomar kirin. Navekî cuda ji bo firotanê û ceribandinê çi dike, da ku bi hev re destwerdanê nekin.
  • Ger hûn GlobalTracer û tomcat bikar bînin, wê hingê hemî karûbarên ku di vê tomcatê de têne xebitandin yek GlobalTracer heye, ji ber vê yekê ew ê hemî navê karûbarê heman bin.
  • Dema ku şopan li rêbazek zêde bikin, hûn hewce ne ku pê ewle bin ku ew gelek caran di lûkê de nayê gotin. Pêdivî ye ku ji bo hemî bangan şopek hevpar were zêdekirin, ku tevahiya dema xebatê garantî dike. Wekî din, barek zêde dê were afirandin.
  • Carekê li jaeger-ui, daxwazên pir mezin ji bo hejmareke mezin ji şopan hatin kirin, û ji ber ku ew li benda bersivê neman, wan dîsa kir. Wekî encamek, jaeger-query dest pê kir ku gelek bîranîn bixwe û elastîk hêdî bike. Ji nû ve destpêkirina jaeger-query re alîkarî kir

Nimûnekirin, hilanîn û dîtina şopan

Sê celeb hene şopên nimûne:

  1. Const ku hemî şopan dişîne û xilas dike.
  2. Îhtîmala ku şopan bi hin îhtimaleke diyar fîltre dike.
  3. Ratelimiting ku hejmara şopan di çirkeyê de sînordar dike. Hûn dikarin van mîhengan li ser muwekîlê mîheng bikin, an li ser jaeger-agent an jî li berhevkerê. Naha em const 1-ê di stûna nirxkerê de bikar tînin, ji ber ku ne pir daxwaz hene, lê ew demek dirêj digire. Di pêşerojê de, heke ev ê barek zêde li ser pergalê bike, hûn dikarin wê sînordar bikin.

Ger hûn cassandra bikar bînin, wê hingê ew ji hêla xwerû ve tenê du rojan şopan hilîne. Em bikar tînin elasticsearch û şop ji bo her dem têne hilanîn û nayê jêbirin. Ji bo her rojê navnîşek cihêreng tê afirandin, mînakî jaeger-service-2019-03-04. Di pêşerojê de, hûn hewce ne ku paqijkirina otomatîkî ya şopên kevn mîheng bikin.

Ji bo dîtina şopên ku hûn hewce ne:

  • Karûbarê ku hûn dixwazin şopan jê re fîlter bikin hilbijêrin, mînakî, tomcat7-default ji bo karûbarek ku di tomcat de dixebite û nikare navê xwe hebe.
  • Dûv re operasyon, navbera demê û dema xebitandinê ya herî kêm, mînakî ji 10 çirkeyan hilbijêrin, da ku tenê darvekirinên dirêj bigirin.
    Tracing Service, OpenTracing û Jaeger
  • Herin yek ji şopan û bibînin ka çi li wir hêdî dibe.
    Tracing Service, OpenTracing û Jaeger

Di heman demê de, heke hin id-ya daxwaznameyê were zanîn, wê hingê hûn dikarin bi vê id-ê ve şopek bi lêgerîna tagê bibînin, heke ev nasname di dirêjahiya şopê de hatî tomar kirin.

Dokumentasyonê

Zimanî babet

Видео

Source: www.habr.com

Add a comment