Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Tunatumia usanifu wa huduma ndogo katika miradi yetu. Wakati vikwazo vya utendaji vinapotokea, muda mwingi hutumiwa kufuatilia na kuchanganua kumbukumbu. Wakati wa kuweka muda wa shughuli za kibinafsi kwenye faili ya kumbukumbu, kwa kawaida ni vigumu kuelewa ni nini kilichosababisha ombi la shughuli hizi, kufuatilia mlolongo wa vitendo au mabadiliko ya wakati wa operesheni moja kuhusiana na nyingine katika huduma tofauti.

Ili kupunguza kazi ya mikono, tuliamua kutumia mojawapo ya zana za kufuatilia. Kuhusu jinsi na kwa nini unaweza kutumia ufuatiliaji na jinsi tulivyofanya, na itajadiliwa katika makala hii.

Ni matatizo gani yanaweza kutatuliwa kwa kufuatilia

  1. Pata vikwazo vya utendaji ndani ya huduma moja na katika mti mzima wa utekelezaji kati ya huduma zote zinazoshiriki. Kwa mfano:
    • Simu nyingi fupi mfululizo kati ya huduma, kwa mfano, kwa geocoding au kwa hifadhidata.
    • I/O inasubiri kwa muda mrefu, kama vile uhamishaji wa mtandao au usomaji wa diski.
    • Uchanganuzi wa data ndefu.
    • Operesheni ndefu zinazohitaji CPU.
    • Sehemu za msimbo ambazo hazihitajiki kupata matokeo ya mwisho na zinaweza kuondolewa au kucheleweshwa.
  2. Kuelewa wazi katika mlolongo gani kinachoitwa na kinachotokea wakati operesheni inafanywa.
    Ufuatiliaji wa Huduma, OpenTracing na Jaeger
    Inaweza kuonekana kuwa, kwa mfano, Ombi lilikuja kwa huduma ya WS -> huduma ya WS iliongeza data kupitia huduma ya R -> kisha ikatuma ombi kwa huduma ya V -> huduma ya V ilipakia data nyingi kutoka kwa R. huduma -> ilienda kwa huduma ya P -> huduma ya P ilienda tena kwa huduma R -> huduma V ilipuuza matokeo na kwenda kwa huduma J -> na kisha ikarudisha majibu kwa huduma ya WS, huku ikiendelea kuhesabu kitu kingine kwenye usuli.
    Bila ufuatiliaji kama huo au nyaraka za kina kwa mchakato mzima, ni ngumu sana kuelewa kinachotokea unapotazama msimbo kwa mara ya kwanza, na msimbo hutawanywa katika huduma tofauti na kufichwa nyuma ya rundo la mapipa na miingiliano.
  3. Mkusanyiko wa taarifa kuhusu mti wa utekelezaji kwa uchanganuzi ulioahirishwa baadaye. Katika kila hatua ya utekelezaji, unaweza kuongeza habari kwenye ufuatiliaji unaopatikana katika hatua hii na kisha utambue ni data gani ya uingizaji iliyosababisha hali kama hiyo. Kwa mfano:
    • Kitambulisho cha Mtumiaji
    • Haki
    • Aina ya mbinu iliyochaguliwa
    • Hitilafu ya kumbukumbu au utekelezaji
  4. Kugeuza ufuatiliaji kuwa kitengo kidogo cha vipimo na uchanganuzi zaidi ambao tayari uko katika mfumo wa vipimo.

Ni ufuatiliaji gani unaweza kuingia. Muda

Katika kufuatilia kuna dhana ya span, hii ni analog ya logi moja, kwa console. Spa ina:

  • Jina, kwa kawaida jina la njia ambayo ilitekelezwa
  • Jina la huduma ambayo muda ulitolewa
  • Kitambulisho cha kipekee
  • Aina fulani ya maelezo ya meta katika mfumo wa ufunguo/thamani ambayo imeingia ndani yake. Kwa mfano, vigezo vya njia au njia iliisha na hitilafu au la
  • Nyakati za kuanza na kumaliza kwa kipindi hiki
  • Kitambulisho cha kipindi cha mzazi

Kila kipindi hutumwa kwa mkusanyaji wa span ili kuhifadhiwa katika hifadhidata kwa ukaguzi wa baadaye mara tu inapomaliza utekelezaji wake. Katika siku zijazo, unaweza kuunda mti wa spans zote kwa kuunganisha kwa kitambulisho cha mzazi. Wakati wa kuchambua, unaweza kupata, kwa mfano, spans zote katika huduma fulani ambayo ilichukua zaidi ya muda fulani. Zaidi ya hayo, kwa kwenda kwa muda maalum, ona mti mzima juu na chini ya urefu huu.

Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Opentrace, Jagger na jinsi tulivyoitekeleza kwa miradi yetu

Kuna kiwango cha kawaida wazi, ambayo inaeleza jinsi na nini kinapaswa kukusanywa, bila kufungwa kwa kufuatilia utekelezaji maalum katika lugha yoyote. Kwa mfano, katika Java, kazi zote zilizo na athari zinafanywa kwa njia ya API ya kawaida ya Opentrace, na chini yake, kwa mfano, Jaeger au utekelezaji usio na tupu ambao haufanyi chochote unaweza kujificha.
Tunatumia Jaeger kama utekelezaji wa Opentrace. Inajumuisha vipengele kadhaa:

Ufuatiliaji wa Huduma, OpenTracing na Jaeger

  • Jaeger-agent ni wakala wa ndani ambaye kwa kawaida husakinishwa kwenye kila mashine na huduma huingizwa ndani yake kwenye mlango chaguomsingi wa ndani. Ikiwa hakuna wakala, basi athari za huduma zote kwenye mashine hii kawaida huzimwa
  • Jaeger-mtoza - mawakala wote hutuma athari zilizokusanywa kwake, na inaziweka kwenye hifadhidata iliyochaguliwa
  • Hifadhidata ni cassandra yao wanayopendelea, lakini tunatumia elasticsearch, kuna utekelezaji wa hifadhidata zingine kadhaa na utekelezaji wa kumbukumbu ambao hauhifadhi chochote kwenye diski.
  • Jaeger-query ni huduma inayoenda kwenye hifadhidata na kurejesha alama zilizokusanywa tayari kwa uchambuzi
  • Jaeger-ui ni kiolesura cha wavuti cha kutafuta na kutazama athari, huenda kwa swala la jaeger.

Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Sehemu tofauti inaweza kuitwa utekelezaji wa opentrace jaeger kwa lugha maalum, kwa njia ambayo spans hutumwa kwa wakala wa jaeger.
Kuunganisha Jagger katika Java inakuja ili kutekeleza kiolesura cha io.opentracing.Tracer, baada ya hapo athari zote kupitia humo zitaenda kwa wakala halisi.

Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Pia kwa sehemu ya spring, unaweza kuunganisha opentracing-spring-cloud-starter na utekelezaji kutoka kwa Jaeger opentracing-spring-jaeger-cloud-starter ambayo itasanidi kiotomatiki ufuatiliaji wa kila kitu kinachopitia vipengele hivi, kwa mfano maombi ya http kwa vidhibiti, maombi kwa hifadhidata kupitia jdbc, nk.

Inafuatilia kuingia kwenye Java

Mahali fulani kwa kiwango cha juu, Span ya kwanza inapaswa kuundwa, hii inaweza kufanyika moja kwa moja, kwa mfano, na mtawala wa spring wakati ombi linapokelewa, au kwa manually ikiwa hakuna. Kisha hupitishwa kupitia Upeo hapa chini. Iwapo mbinu yoyote kati ya zilizo hapa chini inataka kuongeza Span, inachukua ActiveSpan ya sasa kutoka kwa Scope, kuunda Span mpya na kusema mzazi wake ndiye anayesababisha Span, na hufanya Span mpya kufanya kazi. Wakati wa kupiga simu kwa huduma za nje, muda amilifu wa sasa hupitishwa kwao, na huduma hizo huunda vipindi vipya kwa kurejelea muda huu.
Kazi zote hupitia mfano wa Tracer, unaweza kuipata kupitia utaratibu wa DI, au GlobalTracer.get () kama kigezo cha kimataifa ikiwa utaratibu wa DI haufanyi kazi. Kwa chaguo-msingi, ikiwa kifuatiliaji hakijaanzishwa, NoopTracer itarudi ambayo haifanyi chochote.
Zaidi ya hayo, upeo wa sasa unapatikana kutoka kwa mfuatiliaji kupitia ScopeManager, wigo mpya huundwa kutoka kwa ule wa sasa na kufungwa kwa span mpya, na kisha Upeo ulioundwa umefungwa, ambao hufunga muda ulioundwa na kurudisha Wigo uliopita. hali hai. Upeo umefungwa kwa uzi, kwa hivyo, wakati wa upangaji wa nyuzi nyingi, lazima ukumbuke kuhamisha nafasi inayotumika kwa uzi mwingine, kwa uanzishaji zaidi wa Upeo wa uzi mwingine kwa kuzingatia span hii.

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

Kwa upangaji wa nyuzi nyingi, pia kuna TracedExecutorService na vifungashio sawa ambavyo husambaza kiotomatiki kipindi cha sasa kwenye uzi wakati kazi zisizolingana zinapozinduliwa:

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

Kwa maombi ya nje ya http kuna UfuatiliajiHttpClient

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

Matatizo tuliyokabiliana nayo

  • Maharage na DI hazifanyi kazi kila wakati ikiwa kifuatiliaji hakitumiki katika huduma au sehemu, basi Ina waya otomatiki Tracer inaweza isifanye kazi na itabidi utumie GlobalTracer.get().
  • Ufafanuzi haufanyi kazi ikiwa sio sehemu au huduma, au ikiwa njia inaitwa kutoka kwa njia ya jirani ya darasa moja. Lazima uwe mwangalifu kuangalia kinachofanya kazi na utumie uundaji wa ufuatiliaji wa mwongozo ikiwa @Traced haifanyi kazi. Unaweza pia kuambatisha mkusanyaji wa ziada kwa maelezo ya java, basi wanapaswa kufanya kazi kila mahali.
  • Katika buti ya zamani ya chemchemi na chemchemi, usanidi wa usanidi wa wingu wa chemchemi haifanyi kazi kwa sababu ya mende katika DI, basi ikiwa unataka athari kwenye vifaa vya chemchemi kufanya kazi kiatomati, unaweza kuifanya kwa mlinganisho na. 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
  • Jaribu na rasilimali haifanyi kazi kwenye groovy, lazima utumie jaribu hatimaye.
  • Kila huduma lazima iwe na spring.application.name yake ambayo alama za ufuatiliaji zitawekwa. Je, jina tofauti kwa ajili ya kuuza na mtihani, ili si kuingilia kati yao pamoja.
  • Ikiwa unatumia GlobalTracer na tomcat, basi huduma zote zinazoendeshwa kwenye tomcat hii zina GlobalTracer moja, kwa hivyo zote zitakuwa na jina moja la huduma.
  • Wakati wa kuongeza athari kwa njia, unahitaji kuwa na uhakika kwamba haiitwa mara nyingi kwenye kitanzi. Ni muhimu kuongeza athari moja ya kawaida kwa simu zote, ambayo inathibitisha muda wa kazi ya jumla. Vinginevyo, mzigo wa ziada utaundwa.
  • Mara moja katika jaeger-ui, maombi makubwa sana yalifanywa kwa idadi kubwa ya athari, na kwa kuwa hawakusubiri jibu, walifanya tena. Matokeo yake, jaeger-query ilianza kula kumbukumbu nyingi na kupunguza kasi ya elastic. Imesaidiwa kwa kuanzisha upya swala la jaeger

Sampuli, uhifadhi na athari za kutazama

Kuna aina tatu athari za sampuli:

  1. Const ambayo hutuma na kuhifadhi athari zote.
  2. Uwezekano ambao huchuja ufuatiliaji kwa uwezekano fulani.
  3. Ukadiriaji ambao unapunguza idadi ya athari kwa sekunde. Unaweza kusanidi mipangilio hii kwa mteja, ama kwa wakala wa jaeger au kwenye mtoza. Sasa tunatumia const 1 kwenye safu ya valuator, kwani hakuna maombi mengi, lakini huchukua muda mrefu. Katika siku zijazo, ikiwa hii itatoa mzigo mwingi kwenye mfumo, unaweza kuipunguza.

Ikiwa unatumia cassandra, basi kwa default huhifadhi tu athari kwa siku mbili. Tunatumia utaftaji wa elastic na athari huhifadhiwa kwa wakati wote na hazijafutwa. Fahirisi tofauti huundwa kwa kila siku, kwa mfano jaeger-service-2019-03-04. Katika siku zijazo, unahitaji kusanidi kusafisha moja kwa moja ya athari za zamani.

Ili kutazama athari unayohitaji:

  • Chagua huduma ambayo ungependa kuchuja athari, kwa mfano, tomcat7-default kwa huduma inayoendeshwa kwenye tomcat na haiwezi kuwa na jina lake.
  • Kisha chagua operesheni, muda wa muda na muda wa chini wa operesheni, kwa mfano kutoka sekunde 10, kuchukua utekelezaji mrefu tu.
    Ufuatiliaji wa Huduma, OpenTracing na Jaeger
  • Nenda kwa moja ya athari na uone ni nini kilikuwa kinapungua hapo.
    Ufuatiliaji wa Huduma, OpenTracing na Jaeger

Pia, ikiwa kitambulisho fulani cha ombi kinajulikana, basi unaweza kupata ufuatiliaji kwa kitambulisho hiki kupitia utaftaji wa lebo, ikiwa kitambulisho hiki kimeingia kwenye kipindi cha ufuatiliaji.

Nyaraka

makala

Video

Chanzo: mapenzi.com

Kuongeza maoni