Olrhain Gwasanaeth, OpenTracing a Jaeger

Olrhain Gwasanaeth, OpenTracing a Jaeger

Rydym yn defnyddio pensaernïaeth microwasanaeth yn ein prosiectau. Pan fydd tagfeydd perfformiad yn digwydd, treulir llawer o amser yn monitro a dosrannu boncyffion. Wrth gofnodi amseriadau gweithrediadau unigol i ffeil log, fel arfer mae'n anodd deall beth a arweiniodd at alw'r gweithrediadau hyn, i olrhain dilyniant y gweithredoedd neu newid amser un llawdriniaeth o'i gymharu â'r llall mewn gwahanol wasanaethau.

Er mwyn lleihau llafur llaw, penderfynasom ddefnyddio un o'r offer olrhain. Ynglŷn â sut a pham y gallwch ddefnyddio olrhain a sut y gwnaethom hynny, a bydd yn cael ei drafod yn yr erthygl hon.

Pa broblemau y gellir eu datrys gydag olrhain

  1. Dod o hyd i dagfeydd perfformiad o fewn un gwasanaeth ac yn y goeden weithredu gyfan rhwng yr holl wasanaethau sy'n cymryd rhan. Er enghraifft:
    • Llawer o alwadau dilynol byr rhwng gwasanaethau, er enghraifft, i geogodio neu i gronfa ddata.
    • Arosiadau I/O hir, fel trosglwyddiadau rhwydwaith neu ddarlleniadau disg.
    • Dosrannu data hir.
    • Llawdriniaethau hir sy'n gofyn am cpu.
    • Adrannau o god nad oes eu hangen i gael y canlyniad terfynol ac y gellir eu dileu neu eu gohirio.
  2. Deall yn glir ym mha ddilyniant yr hyn a elwir a beth sy'n digwydd pan gyflawnir y llawdriniaeth.
    Olrhain Gwasanaeth, OpenTracing a Jaeger
    Gellir gweld, er enghraifft, bod y Cais wedi dod i'r gwasanaeth WS -> fe wnaeth y gwasanaeth WS ategu'r data trwy'r gwasanaeth R -> yna anfon cais at y gwasanaeth V -> llwythodd y gwasanaeth V lawer o ddata o'r Gwasanaeth R -> aeth i'r gwasanaeth P -> aeth y gwasanaeth P eto i wasanaeth R -> anwybyddodd gwasanaeth V y canlyniad ac aeth i wasanaeth J -> a dim ond wedyn dychwelodd yr ymateb i wasanaeth WS, wrth barhau i gyfrifo rhywbeth arall yn y cefndir.
    Heb olion o'r fath neu ddogfennaeth fanwl ar gyfer y broses gyfan, mae'n anodd iawn deall beth sy'n digwydd wrth edrych ar y cod am y tro cyntaf, ac mae'r cod wedi'i wasgaru ar draws gwahanol wasanaethau ac wedi'i guddio y tu ôl i griw o finiau a rhyngwynebau.
  3. Casglu gwybodaeth am y goeden ddienyddio ar gyfer dadansoddiad gohiriedig dilynol. Ar bob cam gweithredu, gallwch ychwanegu gwybodaeth at yr olrhain sydd ar gael ar y cam hwn ac yna darganfod pa ddata mewnbwn a arweiniodd at senario tebyg. Er enghraifft:
    • ID Defnyddiwr
    • Hawliau
    • Math o ddull a ddewiswyd
    • Log neu wall gweithredu
  4. Troi olion yn is-set o fetrigau a dadansoddiad pellach sydd eisoes ar ffurf metrigau.

Pa olion all logio. Rhychwant

Wrth olrhain mae cysyniad rhychwant, mae hwn yn analog o un log, i'r consol. Mae gan y sba:

  • Enw, fel arfer enw y dull a weithredwyd
  • Enw'r gwasanaeth y cynhyrchwyd y rhychwant ynddo
  • ID unigryw eich hun
  • Rhyw fath o wybodaeth feta ar ffurf allwedd/gwerth sydd wedi'i logio i mewn iddo. Er enghraifft, paramedrau dull neu'r dull a ddaeth i ben gyda gwall neu beidio
  • Amseroedd dechrau a gorffen ar gyfer y rhychwant hwn
  • ID rhychwant rhiant

Anfonir pob rhychwant at y casglwr rhychwant i'w storio yn y gronfa ddata i'w adolygu'n ddiweddarach cyn gynted ag y bydd wedi cwblhau ei weithredu. Yn y dyfodol, gallwch chi adeiladu coeden o bob rhychwant trwy gysylltu trwy ID rhiant. Wrth ddadansoddi, gallwch ddod o hyd, er enghraifft, yr holl rhychwantau mewn rhai gwasanaethau a gymerodd fwy na pheth amser. Ymhellach, trwy fynd i rychwant penodol, gweler y goeden gyfan uwchben ac o dan y rhychwant hwn.

Olrhain Gwasanaeth, OpenTracing a Jaeger

Opentrace, Jagger a sut y gwnaethom ei roi ar waith ar gyfer ein prosiectau

Mae safon gyffredin llwybr agored, sy'n disgrifio sut a beth y dylid ei gasglu, heb gael ei glymu trwy olrhain i weithrediad penodol mewn unrhyw iaith. Er enghraifft, yn Java, mae'r holl waith gydag olion yn cael ei wneud trwy'r API Opentrace cyffredin, ac oddi tano, er enghraifft, gellir cuddio Jaeger neu weithrediad diofyn gwag nad yw'n gwneud dim.
Rydym yn defnyddio Jaeger fel gweithrediad Opentrace. Mae'n cynnwys sawl cydran:

Olrhain Gwasanaeth, OpenTracing a Jaeger

  • Mae Jaeger-agent yn asiant lleol sydd fel arfer yn cael ei osod ar bob peiriant ac mae gwasanaethau'n cael eu mewngofnodi iddo ar y porthladd rhagosodedig lleol. Os nad oes asiant, yna mae olion yr holl wasanaethau ar y peiriant hwn fel arfer yn anabl
  • Jaeger-collector - mae pob asiant yn anfon olion a gasglwyd ato, ac mae'n eu rhoi yn y gronfa ddata a ddewiswyd
  • Y gronfa ddata yw eu cassandra dewisol, ond rydym yn defnyddio elasticsearch, mae yna weithrediadau ar gyfer cwpl o gronfeydd data eraill a gweithrediad er cof nad yw'n arbed unrhyw beth i ddisg
  • Mae Jaeger-query yn wasanaeth sy'n mynd i'r gronfa ddata ac yn dychwelyd olion a gasglwyd eisoes i'w dadansoddi
  • Mae Jaeger-ui yn rhyngwyneb gwe ar gyfer chwilio a gweld olion, mae'n mynd i jaeger-query

Olrhain Gwasanaeth, OpenTracing a Jaeger

Gellir galw cydran ar wahân yn gweithredu jaeger opentrace ar gyfer ieithoedd penodol, a thrwy hynny anfonir rhychwantau at jaeger-agent.
Cysylltu Jagger yn Java yn dod i lawr i weithredu'r rhyngwyneb io.opentracing.Tracer, ac ar ôl hynny bydd yr holl olion drwyddo yn hedfan i'r asiant go iawn.

Olrhain Gwasanaeth, OpenTracing a Jaeger

Hefyd ar gyfer cydran y gwanwyn, gallwch chi gysylltu opentracing-spring-cloud-starter a gweithredu gan Jaeger opentracing-spring-jaeger-cloud-starter a fydd yn ffurfweddu olrhain yn awtomatig ar gyfer popeth sy'n mynd trwy'r cydrannau hyn, er enghraifft ceisiadau http i reolwyr, ceisiadau i'r gronfa ddata trwy jdbc, ac ati.

Olion mewngofnodi i Java

Yn rhywle ar y lefel uchaf, rhaid creu'r Rhychwant gyntaf, gellir gwneud hyn yn awtomatig, er enghraifft, gan reolwr y gwanwyn pan dderbynnir cais, neu â llaw os nad oes un. Yna caiff ei drosglwyddo trwy'r Cwmpas isod. Os yw unrhyw un o'r dulliau isod eisiau ychwanegu Rhychwant, mae'n cymryd y rhychwant gweithredol cyfredol o'r Cwmpas, yn creu Rhychwant newydd ac yn dweud mai ei riant yw'r rhychwant gweithredol sy'n deillio o hynny, ac mae'n gwneud y Rhychwant newydd yn weithredol. Wrth alw gwasanaethau allanol, trosglwyddir y rhychwant gweithredol presennol iddynt, ac mae'r gwasanaethau hynny'n creu rhychwantau newydd gan gyfeirio at y rhychwant hwn.
Mae'r holl waith yn mynd trwy enghraifft Tracer, gallwch ei gael trwy'r mecanwaith DI, neu GlobalTracer.get () fel newidyn byd-eang os nad yw'r mecanwaith DI yn gweithio. Yn ddiofyn, os nad yw olrhain wedi'i gychwyn, bydd NoopTracer yn dychwelyd nad yw'n gwneud dim.
Ymhellach, ceir y cwmpas presennol o'r olrhain trwy'r ScopeManager, crëir cwmpas newydd o'r un presennol gyda rhwymiad o'r rhychwant newydd, ac yna mae'r Cwmpas a grëwyd ar gau, sy'n cau'r rhychwant a grëwyd ac yn dychwelyd y Cwmpas blaenorol i y cyflwr gweithredol. Mae cwmpas yn gysylltiedig ag edefyn, felly wrth raglennu aml-edau, rhaid i chi beidio ag anghofio trosglwyddo'r rhychwant gweithredol i edefyn arall, er mwyn actifadu Cwmpas edefyn arall ymhellach gan gyfeirio at y rhychwant hwn.

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

Ar gyfer rhaglennu aml-edau, mae hefyd TracedExecutorService a deunydd lapio tebyg sy'n anfon y rhychwant presennol yn awtomatig i'r edefyn pan fydd tasgau asyncronig yn cael eu lansio:

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

Ar gyfer ceisiadau http allanol mae yna OlrhainHttpClient

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

Problemau a wynebwyd gennym

  • Nid yw ffa a DI bob amser yn gweithio os na ddefnyddir yr olrheiniwr mewn gwasanaeth neu gydran, felly Autowired Efallai na fydd Tracer yn gweithio a bydd yn rhaid i chi ddefnyddio GlobalTracer.get().
  • Nid yw anodiadau yn gweithio os nad yw yn gydran neu yn wasanaeth, neu os gelwir y dull o ddull cyfagos o'r un dosbarth. Mae'n rhaid i chi fod yn ofalus i wirio beth sy'n gweithio a defnyddio creu olrhain â llaw os nad yw @Traced yn gweithio. Gallwch hefyd atodi casglwr ychwanegol ar gyfer anodiadau java, yna dylent weithio ym mhobman.
  • Yn yr hen gwanwyn a gwanwyn cist, nid yw awtogyfluniad cwmwl gwanwyn opentraing yn gweithio oherwydd bygiau yn DI, yna os ydych chi am i'r olion yn y cydrannau gwanwyn weithio'n awtomatig, gallwch chi ei wneud trwy gyfatebiaeth â 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
  • Ceisiwch gydag adnoddau nad yw'n gweithio mewn grwfi, rhaid i chi ddefnyddio ceisiwch yn olaf.
  • Rhaid i bob gwasanaeth fod â'i enw spring.application.enw ei hun a bydd olion yn cael eu cofnodi oddi tano. Beth mae enw ar wahân ar gyfer y gwerthiant a'r prawf, er mwyn peidio ag ymyrryd â nhw gyda'i gilydd.
  • Os ydych chi'n defnyddio GlobalTracer a tomcat, yna mae gan bob gwasanaeth sy'n rhedeg yn y tomcat hwn un GlobalTracer, felly bydd ganddyn nhw i gyd yr un enw gwasanaeth.
  • Wrth ychwanegu olion i ddull, mae angen i chi fod yn siŵr na chaiff ei alw'n aml yn ddolen. Mae angen ychwanegu un olrhain cyffredin ar gyfer pob galwad, sy'n gwarantu cyfanswm yr amser gwaith. Fel arall, bydd llwyth gormodol yn cael ei greu.
  • Unwaith yn jaeger-ui, gwnaed ceisiadau rhy fawr am nifer fawr o olion, a chan nad oeddent yn aros am ymateb, fe wnaethant hynny eto. O ganlyniad, dechreuodd jaeger-query fwyta llawer o gof ac arafu elastig. Wedi'i helpu trwy ailgychwyn jaeger-query

Samplu, storio a gweld olion

Mae tri math olion samplu:

  1. Const sy'n anfon ac yn arbed pob olion.
  2. Tebygol sy'n hidlo olion gyda pheth tebygolrwydd penodol.
  3. Cyfraddiadau sy'n cyfyngu ar nifer yr olion yr eiliad. Gallwch chi ffurfweddu'r gosodiadau hyn ar y cleient, naill ai ar yr jaeger-agent neu ar y casglwr. Nawr rydyn ni'n defnyddio const 1 yn y pentwr prisio, gan nad oes llawer iawn o geisiadau, ond maen nhw'n cymryd amser hir. Yn y dyfodol, os bydd hyn yn rhoi llwyth gormodol ar y system, gallwch ei gyfyngu.

Os ydych chi'n defnyddio cassandra, yna yn ddiofyn dim ond am ddau ddiwrnod y mae'n storio olion. Rydym yn defnyddio elasticsearch ac mae olion yn cael eu storio am byth ac nid ydynt yn cael eu dileu. Mae mynegai ar wahân yn cael ei greu ar gyfer pob diwrnod, er enghraifft jaeger-service-2019-03-04. Yn y dyfodol, mae angen i chi ffurfweddu glanhau awtomatig o hen olion.

Er mwyn gweld yr olion mae angen:

  • Dewiswch y gwasanaeth rydych chi am hidlo olion ynddo, er enghraifft, tomcat7-default ar gyfer gwasanaeth sy'n rhedeg yn y tomcat ac na all gael ei enw ei hun.
  • Yna dewiswch y llawdriniaeth, yr egwyl amser a'r amser gweithredu lleiaf, er enghraifft o 10 eiliad, i gymryd dim ond dienyddiadau hir.
    Olrhain Gwasanaeth, OpenTracing a Jaeger
  • Ewch i un o'r olion a gweld beth oedd yn arafu yno.
    Olrhain Gwasanaeth, OpenTracing a Jaeger

Hefyd, os yw rhywfaint o ID cais yn hysbys, yna gallwch ddod o hyd i olrhain gan yr id hwn trwy chwiliad tag, os yw'r id hwn wedi'i gofnodi yn y rhychwant olrhain.

Cofnodion

Erthyglau

Fideo

Ffynhonnell: hab.com

Ychwanegu sylw