Servizz Traċċar, OpenTracing u Jaeger

Servizz Traċċar, OpenTracing u Jaeger

Fil-proġetti tagħna nużaw l-arkitettura tal-mikroservizz. Meta jseħħu konġestjonijiet fil-prestazzjoni, jintefaq ħafna ħin fuq il-monitoraġġ u l-parsing taz-zkuk. Meta tilloggja l-ħinijiet ta 'operazzjonijiet individwali f'fajl ta' log, ġeneralment huwa diffiċli li wieħed jifhem x'wassal għas-sejħa ta 'dawn l-operazzjonijiet, biex issegwi s-sekwenza ta' azzjonijiet jew il-bidla fil-ħin ta 'operazzjoni waħda relattiva għal oħra f'servizzi differenti.

Biex innaqqsu x-xogħol manwali, iddeċidejna li nużaw waħda mill-għodod tat-traċċar. Kif u għal xiex tista 'tuża t-traċċar u kif għamilna se jiġu diskussi f'dan l-artikolu.

Liema problemi jistgħu jiġu solvuti bl-użu tat-traċċar?

  1. Sib ostakoli fil-prestazzjoni kemm f'servizz wieħed kif ukoll fis-siġra kollha tal-eżekuzzjoni bejn is-servizzi parteċipanti kollha. Pereżempju:
    • Ħafna sejħiet sekwenzjali qosra bejn is-servizzi, pereżempju, għal geocoding jew għal database.
    • Tistenna twila I/O, bħat-trasferiment tad-dejta fuq netwerk jew il-qari minn disk.
    • Parsing twil tad-data.
    • Operazzjonijiet twal li jeħtieġu CPU.
    • Sezzjonijiet tal-kodiċi li mhumiex meħtieġa biex jinkiseb ir-riżultat finali u jistgħu jitneħħew jew jitmexxew differiti.
  2. Jifhem b'mod ċar f'liema ordni dak li jissejjaħ u x'jiġri meta ssir l-operazzjoni.
    Servizz Traċċar, OpenTracing u Jaeger
    Wieħed jista’ jara li, pereżempju, it-Talba waslet lis-servizz WS -> is-servizz WS issupplimenta d-dejta permezz tas-servizz R -> imbagħad bagħat it-talba lis-servizz V -> is-servizz V niżżel ħafna dejta mis-servizz. R servizz -> marru għas-servizz P -> is-servizz P reġa mar għas-servizz R -> is-servizz V injora r-riżultat u mar għand is-servizz J -> u mbagħad biss irritorna t-tweġiba lis-servizz WS, filwaqt li kompla jikkalkula xi ħaġa oħra f' l-isfond.
    Mingħajr tali traċċa jew dokumentazzjoni dettaljata għall-proċess kollu, huwa diffiċli ħafna li wieħed jifhem x'inhu jiġri wara li tħares lejn il-kodiċi għall-ewwel darba, u l-kodiċi huwa mifrux fuq servizzi differenti u moħbi wara mazz ta 'fażola u interfaces.
  3. Ġbir ta 'informazzjoni dwar is-siġra ta' eżekuzzjoni għal analiżi differita sussegwenti. F'kull stadju ta 'eżekuzzjoni, tista' żżid l-informazzjoni li hija disponibbli f'dan l-istadju mat-traċċa u mbagħad tara liema data ta 'input wasslet għal xenarju bħal dan. Pereżempju:
    • ID tal-Utent
    • Drittijiet
    • Tip ta' metodu magħżul
    • Żball ta' log jew ta' eżekuzzjoni
  4. Tibdil ta 'traċċi f'sottosett ta' metriċi u analiżi ulterjuri fil-forma ta 'metriċi.

X'intraċċar jista' jilloggja. Span

Fit-traċċar hemm il-kunċett ta 'span, dan huwa analogu ta' log wieħed għall-console. Span għandu:

  • Isem, normalment l-isem tal-metodu li ġie esegwit
  • Isem tas-servizz fejn ġie ġġenerat il-medda
  • ID unika proprja
  • Xi meta informazzjoni fil-forma ta 'ċavetta/valur li kienet inkluża fiha. Per eżempju, parametri tal-metodu jew jekk il-metodu spiċċax bi żball jew le
  • Il-ħinijiet tal-bidu u tat-tmiem ta 'din l-eżekuzzjoni tal-medda
  • ID tal-firxa tal-ġenitur

Kull medda tintbagħat lill-kollettur tal-firxa biex tiġi ffrankata fid-database għall-wiri aktar tard hekk kif tkun lesta l-eżekuzzjoni tagħha. Fil-futur, tista 'tibni siġra tal-firxiet kollha billi tgħaqqadhom bl-id tal-ġenitur. Meta tanalizza, tista 'ssib, pereżempju, il-firxiet kollha f'xi servizz li ħa aktar minn xi żmien. Imbagħad, tmur għal medda speċifika, ara s-siġra kollha 'l fuq u taħt din il-medda.

Servizz Traċċar, OpenTracing u Jaeger

Opentrace, Jagger u kif implimentajnah għall-proġetti tagħna

Hemm standard komuni Opentrace, li jiddeskrivi kif u x'għandu jinġabar, mingħajr ma jkun marbut bi traċċa ma' implimentazzjoni speċifika fi kwalunkwe lingwa. Pereżempju, f'Java, ix-xogħol kollu bit-traċċi jitwettaq permezz tal-API Opentrace komuni, u taħtu jista 'jinħeba, pereżempju, Jaeger jew implimentazzjoni default vojta li ma tagħmel xejn.
Aħna nużaw Jaeger bħala implimentazzjoni ta' Opentrace. Tikkonsisti f'diversi komponenti:

Servizz Traċċar, OpenTracing u Jaeger

  • Jaeger-agent huwa aġent lokali li normalment ikun installat fuq kull magna u s-servizzi huma illoggjati fiha fuq il-port default lokali. Jekk ma jkun hemm l-ebda aġent, allura t-traċċi tas-servizzi kollha fuq din il-magna huma ġeneralment mitfija
  • Jaeger-kollettur - l-aġenti kollha jibagħtu traċċi miġbura lilha, u tpoġġihom fid-database magħżula
  • Database - waħda preferuta tagħhom hija cassandra, iżda nużaw elasticsearch, hemm implimentazzjonijiet għal koppja ta 'databases oħra u implimentazzjoni fil-memorja li ma tiffranka xejn fuq disk
  • Jaeger-query huwa servizz li jidħol fid-database u jipprovdi traċċi diġà miġbura għall-analiżi
  • Jaeger-ui hija interface tal-web għat-tiftix u l-wiri tat-traċċi, taħdem f'jaeger-query

Servizz Traċċar, OpenTracing u Jaeger

Komponent separat jista 'jissejjaħ implimentazzjoni ta' opentrace jaeger għal lingwi speċifiċi, li permezz tiegħu jintbagħtu spans lil jaeger-agent.
Konnessjoni ta' Jagger f'Java jaqa 'għall-implimentazzjoni tal-interface io.opentracing.Tracer, wara li t-traċċi kollha minnu se jtiru lejn l-aġent reali.

Servizz Traċċar, OpenTracing u Jaeger

Tista 'wkoll tikkonnettja komponenti tar-rebbiegħa opentracing-rebbiegħa-sħaba-starter u l-implimentazzjoni minn Jaeger opentracing-rebbiegħa-jaeger-sħaba-starter li awtomatikament tikkonfigura t-traċċar għal dak kollu li jgħaddi minn dawn il-komponenti, pereżempju talbiet http lill-kontrolluri, talbiet għad-database permezz ta’ jdbc, eċċ.

Logging traċċi f'Java

X'imkien fl-ogħla livell irid jinħoloq l-ewwel Span, dan jista 'jsir awtomatikament, pereżempju mill-kontrollur tar-rebbiegħa meta jirċievi talba, jew manwalment jekk ma jkunx hemm. Imbagħad tiġi trażmessa permezz ta' Skop hawn taħt. Jekk xi metodu hawn taħt irid iżżid Span, jieħu l-activeSpan attwali minn Scope, joħloq Span ġdid u jgħid li l-ġenitur tiegħu rċieva activeSpan, u jagħmel il-Span il-ġdid attiv. Meta s-servizzi esterni jissejħu, il-medda attiva attwali tiġi mgħoddija lilhom, u dawk is-servizzi joħolqu medda ġdida marbuta ma' din il-medda.
Ix-xogħol kollu jgħaddi mill-istanza Tracer; tista 'tikseb permezz tal-mekkaniżmu DI, jew GlobalTracer.get() bħala varjabbli globali jekk il-mekkaniżmu DI ma jaħdimx. B'mod awtomatiku, jekk it-tracer ma ġiex inizjalizzat, NoopTracer se jiġi rritornat li ma jagħmel xejn.
Sussegwentement, l-ambitu attwali jinkiseb mit-tracer permezz ta 'ScopeManager, jinħoloq ambitu ġdid minn dak attwali b'firxa ġdida mehmuża, u mbagħad jingħalaq l-ambitu maħluq, li jagħlaq il-medda maħluqa u jirritorna l-ambitu preċedenti għall-istat attiv. . L-ambitu huwa marbut ma 'ħajt, għalhekk meta l-ipprogrammar b'ħafna kamini, trid tiftakar li tittrasferixxi l-medda attiva għal ħajt ieħor, għal aktar attivazzjoni tal-ambitu ta' ħajt ieħor marbut ma 'din il-medda.

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

Għall-ipprogrammar b'ħafna kamini, hemm ukoll TracedExecutorService u tgeżwir simili li awtomatikament jgħaddu l-medda attwali lill-ħajta meta jmexxu ħidmiet asinkroniċi:

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

Għal talbiet esterni http hemm TracingHttpClient

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

Problemi li ffaċċjajna

  • Il-fażola u d-DI mhux dejjem jaħdmu jekk it-tracer ma jintużax f'servizz jew komponent, allura Autowired Tracer jista' ma jaħdimx u jkollok tuża GlobalTracer.get().
  • L-annotazzjonijiet ma jaħdmux jekk ma jkunx komponent jew servizz, jew jekk is-sejħa tal-metodu tiġi minn metodu ġar tal-istess klassi. Trid toqgħod attent, iċċekkja x'jaħdem, u tuża l-ħolqien manwali tat-traċċa jekk @Traced ma taħdimx. Tista 'wkoll tehmeż kompilatur addizzjonali għall-annotazzjonijiet java, allura għandu jaħdem kullimkien.
  • F'boot tar-rebbiegħa u tar-rebbiegħa qodma, il-konfigurazzjoni awtomatika tas-sħab tar-rebbiegħa opentraing ma taħdimx minħabba bugs fid-DI, allura jekk trid li traċċi fil-komponenti tar-rebbiegħa jaħdmu awtomatikament, tista 'tagħmel dan b'analoġija ma' 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
  • Ipprova bir-riżorsi ma taħdimx fil-groovy; trid tuża fl-aħħarnett ipprova.
  • Kull servizz għandu jkollu spring.application.name tiegħu li taħtu se jiġu illoggjati traċċi. Kif dwar isem separat għall-bejgħ u l-ittestjar, sabiex ma jitħalltux flimkien.
  • Jekk tuża GlobalTracer u tomcat, allura s-servizzi kollha li jaħdmu f'dan it-tomcat għandhom GlobalTracer wieħed, għalhekk kollha se jkollhom l-istess isem tas-servizz.
  • Meta żżid traċċi għal metodu, trid tkun ċert li ma tissejjaħx f'linja ħafna drabi. Ikollok bżonn iżżid traċċa waħda komuni għas-sejħiet kollha, li tirreġistra l-ħin operattiv totali. Inkella, tinħoloq tagħbija żejda.
  • Ladarba f'jaeger-ui għamlu talbiet kbar wisq għal numru kbir ta' traċċi u, peress li ma stennewx tweġiba, reġgħu għamluha. Bħala riżultat, jaeger-query beda jiekol ħafna memorja u jrattab elastika. Mgħejun billi jerġa' jibda jaeger-query

Teħid ta' kampjuni, ħażna u jara ta' traċċi

Hemm tliet tipi kampjunar ta' traċċi:

  1. Const li jibgħat u jsalva t-traċċi kollha.
  2. Probabilistic li jiffiltra traċċi b'ċerta probabbiltà.
  3. Ratemiting li jillimita n-numru ta 'traċċi kull sekonda. Tista 'tikkonfigura dawn is-settings fuq il-klijent, jew fuq jaeger-agent jew fuq il-kollettur. Issa nużaw const 1 fil-munzell tal-valuator peress li m'hemmx ħafna talbiet, iżda jieħdu żmien twil. Fil-futur, jekk dan ipoġġi tagħbija bla bżonn fuq is-sistema, tista 'tillimitaha.

Jekk tuża cassandra, awtomatikament taħżen traċċi għal jumejn biss. Aħna nużaw elasticsearch u traċċi huma maħżuna għall-ħin kollu u ma jitħassrux. Jinħoloq indiċi separat għal kull jum, pereżempju jaeger-service-2019-03-04. Fil-futur, għandek bżonn tikkonfigura tindif awtomatiku ta 'traċċi qodma.

Biex tara t-traċċi għandek bżonn:

  • Agħżel is-servizz li bih trid tiffiltra traċċi, pereżempju tomcat7-default għal servizz li qed jaħdem f'Tomcat u li ma jistax ikollu ismu stess.
  • Sussegwentement, agħżel l-operazzjoni, il-perjodu ta 'żmien u l-ħin minimu ta' tħaddim, pereżempju minn 10 sekondi, biex tieħu biss eżekuzzjonijiet twal.
    Servizz Traċċar, OpenTracing u Jaeger
  • Mur fuq waħda mit-traċċi u ara x'kien qed jonqos hemm.
    Servizz Traċċar, OpenTracing u Jaeger

Ukoll, jekk xi talba id hija magħrufa, allura inti tista 'ssib traċċa minn din id permezz ta' tfittxija tag, jekk din id-id hija illoggjata fil-medda tat-traċċa.

Dokumentazzjoni

Artikoli

Video

Sors: www.habr.com

Żid kumment