Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Gigamit namo ang arkitektura sa microservice sa among mga proyekto. Kung mahitabo ang mga bottleneck sa pasundayag, daghang oras ang gigugol sa pagmonitor ug pag-parse sa mga troso. Kung gi-log ang mga timing sa mga indibidwal nga operasyon sa usa ka log file, kasagaran lisud sabton kung unsa ang hinungdan sa pagsangpit niini nga mga operasyon, aron masubay ang pagkasunod-sunod sa mga aksyon o ang pagbalhin sa oras sa usa ka operasyon nga may kalabotan sa lain sa lainlaing mga serbisyo.

Aron maminusan ang manwal nga pagtrabaho, nakahukom kami nga gamiton ang usa sa mga himan sa pagsubay. Mahitungod kung giunsa ug ngano nga magamit nimo ang pagsubay ug kung giunsa namon kini nahimo, ug hisgutan sa kini nga artikulo.

Unsa nga mga problema ang masulbad pinaagi sa pagsubay

  1. Pangitaa ang mga bottleneck sa performance sulod sa usa ka serbisyo ug sa tibuok execution tree tali sa tanang partisipante nga serbisyo. Pananglitan:
    • Daghang mubu nga sunud-sunod nga tawag tali sa mga serbisyo, pananglitan, sa geocoding o sa usa ka database.
    • Taas nga paghulat sa I/O, sama sa pagbalhin sa network o pagbasa sa disk.
    • Taas nga pag-parse sa datos.
    • Taas nga mga operasyon nga nanginahanglan cpu.
    • Mga seksyon sa code nga dili kinahanglan aron makuha ang katapusan nga resulta ug mahimong tangtangon o malangan.
  2. Tin-aw nga masabtan sa unsa nga pagkasunod-sunod unsa ang gitawag ug unsa ang mahitabo sa diha nga ang operasyon gihimo.
    Pagsubay sa Serbisyo, OpenTracing ug Jaeger
    Makita nga, pananglitan, ang Hangyo miabot sa serbisyo sa WS -> ang serbisyo sa WS nagdugang data pinaagi sa serbisyo sa R ​​-> dayon nagpadala usa ka hangyo sa serbisyo sa V -> ang serbisyo sa V nagkarga daghang datos gikan sa R serbisyo -> miadto sa serbisyo sa P -> ang serbisyo sa P miadto pag-usab sa serbisyo R -> serbisyo V wala magtagad sa resulta ug miadto sa serbisyo J -> ug unya gibalik ang tubag sa serbisyo WS, samtang nagpadayon sa pagkalkula sa laing butang sa background.
    Kung wala ang ingon nga pagsubay o detalyado nga dokumentasyon alang sa tibuuk nga proseso, lisud kaayo nga masabtan kung unsa ang nahitabo kung nagtan-aw sa code sa unang higayon, ug ang code nagkatag sa lainlaing mga serbisyo ug gitago sa luyo sa usa ka hugpong sa mga bins ug mga interface.
  3. Koleksyon sa kasayuran bahin sa punoan sa pagpatay alang sa sunod nga gi-defer nga pagtuki. Sa matag yugto sa pagpatuman, mahimo nimong idugang ang kasayuran sa pagsubay nga magamit sa kini nga yugto ug dayon mahibal-an kung unsa ang data sa input nga nagdala sa parehas nga senaryo. Pananglitan:
    • User ID
    • Katungod
    • Uri sa pinili nga pamaagi
    • Log o execution error
  4. Ang paghimo sa mga pagsubay ngadto sa usa ka subset sa mga sukatan ug dugang nga pagtuki nga anaa na sa porma sa mga sukatan.

Unsa nga trace ang ma-log. Span

Sa pagsubay adunay konsepto sa usa ka span, kini usa ka analogue sa usa ka log, sa console. Ang spa adunay:

  • Ngalan, kasagaran ang ngalan sa pamaagi nga gipatuman
  • Ang ngalan sa serbisyo diin namugna ang span
  • Kaugalingong talagsaon nga ID
  • Usa ka matang sa meta nga impormasyon sa porma sa usa ka yawe/bili nga na-log in niini. Pananglitan, ang mga parameter sa pamaagi o ang pamaagi natapos sa usa ka sayup o wala
  • Mga oras sa pagsugod ug pagtapos alang niini nga gidugayon
  • ID sa span sa ginikanan

Ang matag span ipadala ngadto sa span collector aron itago sa database alang sa ulahi nga pagrepaso sa diha nga kini makompleto ang pagpatuman niini. Sa umaabot, makahimo ka og usa ka kahoy sa tanan nga mga gitas-on pinaagi sa pagkonektar pinaagi sa ginikanan id. Kung nag-analisar, mahimo nimong makit-an, pananglitan, ang tanan nga mga span sa pipila nga serbisyo nga nagkinahanglag daghang oras. Dugang pa, pinaagi sa pag-adto sa usa ka espesipikong gitas-on, tan-awa ang tibuok nga kahoy sa ibabaw ug sa ubos niini nga dangaw.

Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Opentrace, Jagger ug giunsa namo kini pagpatuman para sa among mga proyekto

Adunay usa ka komon nga sumbanan opentrace, nga naghulagway kung giunsa ug unsa ang kinahanglan nga kolektahon, nga wala gihigot pinaagi sa pagsubay sa usa ka piho nga pagpatuman sa bisan unsang pinulongan. Pananglitan, sa Java, ang tanan nga trabaho nga adunay mga pagsubay gihimo pinaagi sa sagad nga Opentrace API, ug sa ilawom niini, pananglitan, ang Jaeger o usa ka walay sulod nga default nga pagpatuman nga wala’y mahimo nga matago.
Gigamit namo Manguha isip pagpatuman sa Opentrace. Naglangkob kini sa daghang mga sangkap:

Pagsubay sa Serbisyo, OpenTracing ug Jaeger

  • Ang Jaeger-agent usa ka lokal nga ahente nga kasagarang na-install sa matag makina ug ang mga serbisyo naka-log in niini sa lokal nga default port. Kung wala’y ahente, ang mga pagsubay sa tanan nga mga serbisyo sa kini nga makina kasagarang gi-disable
  • Jaeger-collector - ang tanan nga mga ahente nagpadala sa nakolekta nga mga pagsubay niini, ug kini nagbutang kanila sa pinili nga database
  • Ang database mao ang ilang gusto nga cassandra, apan gigamit namon ang elasticsearch, adunay mga implementasyon alang sa usa ka magtiayon nga uban pang mga database ug usa ka in-memory nga pagpatuman nga wala makatipig bisan unsa sa disk.
  • Ang Jaeger-query usa ka serbisyo nga moadto sa database ug ibalik ang nakolekta na nga mga bakas alang sa pagtuki
  • Ang Jaeger-ui usa ka web interface alang sa pagpangita ug pagtan-aw sa mga pagsubay, kini moadto sa jaeger-query

Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Ang usa ka bulag nga bahin mahimong tawgon nga pagpatuman sa opentrace jaeger alang sa piho nga mga pinulongan, diin ang mga span gipadala ngadto sa jaeger-agent.
Pagkonektar sa Jagger sa Java moabut ngadto sa pagpatuman sa io.opentracing.Tracer interface, human niini ang tanan nga mga pagsubay pinaagi niini molupad ngadto sa tinuod nga ahente.

Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Usab alang sa sangkap sa tingpamulak, mahimo nimong makonektar opentracing-spring-cloud-starter ug pagpatuman gikan sa Jaeger opentracing-spring-jaeger-cloud-starter nga awtomatikong i-configure ang pagsubay alang sa tanan nga moagi niini nga mga sangkap, pananglitan ang mga hangyo sa http sa mga tigkontrol, mga hangyo sa database pinaagi sa jdbc, ug uban pa.

Pagsubay sa pag-log sa Java

Sa usa ka lugar sa taas nga lebel, ang una nga Span kinahanglan himuon, mahimo kini awtomatiko, pananglitan, sa controller sa tingpamulak kung ang usa ka hangyo madawat, o mano-mano kung wala. Dayon kini ipasa pinaagi sa Saklaw sa ubos. Kung ang bisan unsang mga pamaagi sa ubos gusto nga magdugang usa ka Span, gikuha niini ang kasamtangan nga activeSpan gikan sa Scope, nagmugna og bag-ong Span ug giingon nga ang ginikanan niini mao ang sangputanan nga activeSpan, ug gihimo ang bag-ong Span nga aktibo. Kung nagtawag sa mga serbisyo sa gawas, ang karon nga aktibo nga gitas-on gipasa sa kanila, ug ang mga serbisyo naghimo ug mga bag-ong span nga adunay kalabotan sa kini nga gitas-on.
Ang tanan nga trabaho moagi sa Tracer nga pananglitan, mahimo nimo kini makuha pinaagi sa mekanismo sa DI, o GlobalTracer.get () ingon usa ka global variable kung ang mekanismo sa DI dili molihok. Sa kasagaran, kung ang tracer wala pa masugdan, ang NoopTracer mobalik nga wala'y mahimo.
Dugang pa, ang kasamtangan nga scope makuha gikan sa tracer pinaagi sa ScopeManager, usa ka bag-ong scope ang gihimo gikan sa kasamtangan nga adunay usa ka pagbugkos sa bag-ong span, ug unya ang gibuhat nga Scope gisirado, nga nagsira sa gibuhat nga span ug mibalik sa miaging Scope sa ang aktibo nga estado. Ang kasangkaran gihigot sa usa ka hilo, mao nga kung ang multi-threaded nga programming, kinahanglan nga dili nimo kalimtan ang pagbalhin sa aktibo nga gitas-on sa lain nga hilo, alang sa dugang nga pagpaaktibo sa Kasangkaran sa lain nga hilo nga adunay kalabotan sa kini nga gitas-on.

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

Para sa multi-threaded programming, aduna usab TracedExecutorService ug susamang mga wrapper nga awtomatikong ipasa ang kasamtangang span ngadto sa thread kung ang mga asynchronous nga buluhaton gilunsad:

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

Alang sa gawas nga http nga mga hangyo adunay Pagsubay saHttpClient

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

Mga problema nga among giatubang

  • Ang mga liso ug DI dili kanunay molihok kung ang tracer wala gigamit sa usa ka serbisyo o sangkap, kung ingon-ana Autowired Ang Tracer mahimong dili molihok ug kinahanglan nimo gamiton ang GlobalTracer.get().
  • Ang mga anotasyon dili molihok kung kini dili usa ka sangkap o serbisyo, o kung ang pamaagi gitawag gikan sa usa ka silingan nga pamaagi sa parehas nga klase. Kinahanglan ka nga mag-amping sa pagsusi kung unsa ang molihok ug gamiton ang manual nga pagsubay sa paghimo kung ang @Traced dili molihok. Mahimo ka usab nga maglakip sa usa ka dugang nga compiler alang sa mga anotasyon sa java, unya kinahanglan nga magtrabaho sila bisan diin.
  • Sa daan nga tingpamulak ug tingpamulak nga boot, ang opentraing spring cloud autoconfiguration dili molihok tungod sa mga bug sa DI, unya kung gusto nimo ang mga pagsubay sa mga sangkap sa tingpamulak nga awtomatikong magtrabaho, mahimo nimo kini pinaagi sa pagtandi sa 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
  • Ang pagsulay sa mga kahinguhaan dili molihok sa groovy, kinahanglan nimo nga gamiton ang pagsulay sa katapusan.
  • Ang matag serbisyo kinahanglan adunay kaugalingon nga spring.application.name diin ang mga pagsubay ma-log. Unsa ang usa ka bulag nga ngalan alang sa pagbaligya ug pagsulay, aron dili makabalda kanila nga magkauban.
  • Kung mogamit ka sa GlobalTracer ug tomcat, nan ang tanan nga mga serbisyo nga nagdagan sa kini nga tomcat adunay usa ka GlobalTracer, aron silang tanan adunay parehas nga ngalan sa serbisyo.
  • Kung magdugang mga pagsubay sa usa ka pamaagi, kinahanglan nimo nga sigurohon nga wala kini gitawag sa daghang mga higayon sa usa ka loop. Kinahanglan nga magdugang usa ka sagad nga pagsubay alang sa tanan nga mga tawag, nga naggarantiya sa tibuuk nga oras sa pagtrabaho. Kung dili, usa ka sobra nga load ang mabuhat.
  • Sa higayon nga sa jaeger-ui, daghan kaayo nga mga hangyo ang gihimo alang sa daghang mga pagsubay, ug tungod kay wala sila maghulat alang sa usa ka tubag, gibuhat nila kini pag-usab. Ingon usa ka sangputanan, ang jaeger-query nagsugod sa pagkaon sa daghang panumduman ug gipahinay ang pagkamaunat. Gitabangan pinaagi sa pagsugod pag-usab sa jaeger-query

Pag-sampol, pagtipig ug pagtan-aw sa mga pagsubay

Adunay tulo ka matang sampling mga pagsubay:

  1. Const nga nagpadala ug nagtipig sa tanan nga mga pagsubay.
  2. Probabilistic nga nagsala sa mga pagsubay nga adunay gihatag nga posibilidad.
  3. Ratelimting nga naglimite sa gidaghanon sa mga pagsubay matag segundo. Mahimo nimong i-configure kini nga mga setting sa kliyente, bisan sa jaeger-agent o sa kolektor. Karon among gigamit ang const 1 sa valuator stack, tungod kay dili kaayo daghan nga mga hangyo, apan kini nagkinahanglan og taas nga panahon. Sa umaabot, kung kini maghatag ug sobra nga load sa sistema, mahimo nimong limitahan kini.

Kung mogamit ka og cassandra, nan pinaagi sa default kini nagtipig lamang sa mga pagsubay sulod sa duha ka adlaw. Gigamit namo pagkamaunat-unat ug ang mga pagsubay gitipigan sa tanang panahon ug dili mapapas. Ang usa ka bulag nga indeks gihimo alang sa matag adlaw, pananglitan jaeger-service-2019-03-04. Sa umaabot, kinahanglan nimo nga i-configure ang awtomatik nga paglimpyo sa mga daan nga pagsubay.

Aron makita ang mga pagsubay kinahanglan nimo:

  • Pilia ang serbisyo nga gusto nimong i-filter ang mga pagsubay, pananglitan, tomcat7-default alang sa usa ka serbisyo nga nagdagan sa tomcat ug dili adunay kaugalingon nga ngalan.
  • Dayon pilia ang operasyon, ang agwat sa oras ug ang minimum nga oras sa operasyon, pananglitan gikan sa 10 segundos, aron mokuha lamang ug taas nga mga pagpatay.
    Pagsubay sa Serbisyo, OpenTracing ug Jaeger
  • Adto sa usa sa mga timailhan ug tan-awa kung unsa ang naghinay-hinay didto.
    Pagsubay sa Serbisyo, OpenTracing ug Jaeger

Usab, kung nahibal-an ang pipila ka hangyo id, nan makit-an nimo ang usa ka pagsubay sa kini nga id pinaagi sa pagpangita sa tag, kung kini nga id na-log sa gidugayon sa pagsubay.

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

Artikulo

Video

Source: www.habr.com

Idugang sa usa ka comment