Service Tracing, OpenTracing lan Jaeger

Service Tracing, OpenTracing lan Jaeger

Kita nggunakake arsitektur microservice ing proyek kita. Nalika kemacetan kinerja kedadeyan, akeh wektu kanggo ngawasi lan parsing log. Nalika logging wektu operasi individu menyang file log, biasane angel ngerti apa sing ndadékaké panyuwunan operasi kasebut, kanggo nglacak urutan tumindak utawa owah-owahan wektu siji operasi relatif marang layanan liyane ing layanan sing beda-beda.

Kanggo nyilikake tenaga kerja manual, kita mutusake nggunakake salah sawijining alat tracing. Babagan carane lan ngapa sampeyan bisa nggunakake tracing lan carane nindakake, lan bakal dibahas ing artikel iki.

Masalah apa sing bisa ditanggulangi kanthi nglacak

  1. Temokake bottlenecks kinerja ing siji layanan lan ing kabeh wit eksekusi ing antarane kabeh layanan sing melu. Tuladhane:
    • Akeh telpon consecutive singkat antarane layanan, contone, kanggo geocoding utawa database.
    • I / O ngenteni suwe, kayata transfer jaringan utawa maca disk.
    • Parsing data dawa.
    • Operasi dawa sing mbutuhake cpu.
    • Bagean kode sing ora dibutuhake kanggo entuk asil pungkasan lan bisa dicopot utawa ditundha.
  2. Cetha ngerti ing urutan apa sing diarani lan apa sing kedadeyan nalika operasi ditindakake.
    Service Tracing, OpenTracing lan Jaeger
    Bisa dideleng, contone, Panjaluk teka menyang layanan WS -> layanan WS nambahake data liwat layanan R -> banjur ngirim panjalukan menyang layanan V -> layanan V ngemot akeh data saka R. layanan -> tindak menyang layanan P -> layanan P maneh menyang layanan R -> layanan V ora nggatekake asil lan pindhah menyang layanan J -> lan mung banjur mbalekake respon kanggo layanan WS, nalika terus ngetung liyane ing latar mburi.
    Tanpa tilak kuwi utawa dokumentasi rinci kanggo kabeh proses, iku banget angel mangertos apa mengkono nalika katon ing kode kanggo pisanan, lan kode kasebar ing layanan beda lan didhelikake konco Bunch saka tong sampah lan antarmuka.
  3. Koleksi informasi babagan wit eksekusi kanggo analisis sing ditundha. Ing saben tahap eksekusi, sampeyan bisa nambah informasi menyang jejak sing kasedhiya ing tahap iki lan banjur nemtokake data input apa sing nyebabake skenario sing padha. Tuladhane:
    • ID pangguna
    • Hak
    • Jinis metode sing dipilih
    • Log utawa kesalahan eksekusi
  4. Ngowahi jejak menyang subset saka metrik lan analisis luwih wis ing wangun metrik.

Tilak apa bisa log. span

Ing nelusuri ana konsep span, iki analog saka siji log, kanggo console. Spa duwe:

  • Jeneng, biasane jeneng metode sing dieksekusi
  • Jeneng layanan sing span digawe
  • ID unik dhewe
  • Sawetara jinis informasi meta ing wangun kunci / nilai sing wis mlebu. Contone, paramèter cara utawa cara rampung karo kesalahan utawa ora
  • Wektu wiwitan lan pungkasan kanggo rentang iki
  • ID span wong tuwa

Saben span dikirim menyang kolektor span kanggo disimpen ing basis data kanggo ditinjau mengko yen wis rampung eksekusi. Ing mangsa ngarep, sampeyan bisa mbangun wit kabeh jembar kanthi nyambungake karo id induk. Nalika nganalisa, sampeyan bisa nemokake, contone, kabeh span ing sawetara layanan sing njupuk luwih saka sawetara wektu. Luwih, kanthi pindhah menyang span tartamtu, ndeleng kabeh wit ndhuwur lan ngisor span iki.

Service Tracing, OpenTracing lan Jaeger

Opentrace, Jagger lan carane kita dileksanakake kanggo proyek kita

Ana standar umum opentrace, sing njlèntrèhaké cara lan apa sing kudu diklumpukake, tanpa diikat kanthi nglacak implementasi tartamtu ing basa apa wae. Contone, ing Jawa, kabeh karya karo ngambah wis digawa metu liwat Opentrace API umum, lan ing ngisor iki, contone, Jaeger utawa implementasine standar kosong sing ora nindakake apa-apa bisa didhelikake.
Kita nggunakake Jaeger minangka implementasi Opentrace. Iku kasusun saka sawetara komponen:

Service Tracing, OpenTracing lan Jaeger

  • Jaeger-agen agen lokal sing biasane diinstal ing saben mesin lan layanan sing mlebu menyang ing port standar lokal. Yen ora ana agen, banjur ngambah kabeh layanan ing mesin iki biasane dipatèni
  • Jaeger-collector - kabeh agen ngirim jejak sing diklumpukake, lan dilebokake ing database sing dipilih
  • Basis data minangka cassandra sing disenengi, nanging kita nggunakake elasticsearch, ana implementasine kanggo sawetara database liyane lan implementasine ing memori sing ora nyimpen apa-apa menyang disk.
  • Jaeger-query minangka layanan sing menyang database lan ngasilake jejak sing wis diklumpukake kanggo dianalisis
  • Jaeger-ui minangka antarmuka web kanggo nggoleki lan ndeleng jejak, menyang jaeger-query

Service Tracing, OpenTracing lan Jaeger

Komponen kapisah bisa disebut implementasine opentrace jaeger kanggo basa tartamtu, liwat kang span dikirim menyang jaeger-agen.
Nyambung Jagger ing Jawa teka mudhun kanggo ngleksanakake antarmuka io.opentracing.Tracer, sawise kang kabeh ngambah liwat bakal fly kanggo agen nyata.

Service Tracing, OpenTracing lan Jaeger

Uga kanggo komponen spring, sampeyan bisa nyambung opentracing-spring-cloud-starter lan implementasine saka Jaeger opentracing-spring-jaeger-cloud-starter kang bakal otomatis ngatur nelusuri kanggo kabeh sing liwat komponen iki, contone panjalukan http kanggo pengontrol, panjalukan kanggo database liwat jdbc, etc.

Tilak logging ing Jawa

Nang endi wae ing tingkat ndhuwur, Span pisanan kudu digawe, iki bisa rampung kanthi otomatis, contone, dening spring controller nalika panjalukan ditampa, utawa kanthi manual yen ora ana. Iku banjur ditularaké liwat Scope ing ngisor iki. Yen cara ing ngisor iki pengin nambah span, njupuk ActiveSpan saiki saka Scope, nggawe Span anyar lan ngandika tuwane iku asil activeSpan, lan ndadekake Span anyar aktif. Nalika nelpon layanan eksternal, rentang aktif saiki diterusake, lan layanan kasebut nggawe rentang anyar kanthi referensi kanggo rentang iki.
Kabeh karya dadi liwat Kayata Tracer, sampeyan bisa njaluk liwat mekanisme DI, utawa GlobalTracer.get () minangka variabel global yen mekanisme DI ora bisa. Kanthi gawan, yen tracer durung diwiwiti, NoopTracer bakal bali sing ora nindakake apa-apa.
Salajengipun, orane katrangan saiki dijupuk saka tracer liwat ScopeManager, orane katrangan anyar digawe saka saiki karo naleni saka span anyar, lan banjur Scope digawe ditutup, kang nutup span digawe lan ngasilake Scope sadurungé. status aktif. Lingkup disambungake menyang Utas, supaya nalika program multi-Utas, sampeyan kudu ora lali kanggo mindhah span aktif kanggo thread liyane, kanggo aktivasi luwih saka Scope thread liyane karo referensi kanggo span iki.

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

Kanggo program multi-threaded, uga ana TracedExecutorService lan pambungkus sing padha sing kanthi otomatis nerusake span saiki menyang thread nalika tugas asinkron diluncurake:

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

Kanggo panjalukan http external ana TracingHttpClient

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

Masalah sing kita adhepi

  • Kacang buncis lan DI ora tansah bisa yen tracer ora digunakake ing layanan utawa komponen, banjur Autowired Tracer bisa uga ora bisa lan sampeyan kudu nggunakake GlobalTracer.get ().
  • Anotasi ora bisa digunakake yen dudu komponen utawa layanan, utawa yen metode kasebut diarani saka cara tetanggan saka kelas sing padha. Sampeyan kudu ati-ati kanggo mriksa apa sing bisa digunakake lan nggunakake nggawe trace manual yen @Traced ora bisa. Sampeyan uga bisa masang compiler tambahan kanggo anotasi java, banjur padha kudu bisa nang endi wae.
  • Ing spring lawas lan spring boot, opentraing spring cloud autoconfiguration ora bisa amarga kewan omo ing DI, banjur yen sampeyan pengin ngambah ing komponen spring bisa kanthi otomatis, sampeyan bisa nindakake iku kanthi analogi karo 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
  • Coba karo sumber daya ora bisa ing groovy, sampeyan kudu nggunakake nyoba pungkasanipun.
  • Saben layanan kudu duwe spring.application.name dhewe ing ngendi jejak bakal dicathet. Apa jeneng kapisah kanggo Advertisement lan test, supaya dadi ora ngganggu wong bebarengan.
  • Yen sampeyan nggunakake GlobalTracer lan Tomcat, kabeh layanan sing mlaku ing Tomcat iki duwe siji GlobalTracer, mula kabeh bakal duwe jeneng layanan sing padha.
  • Nalika nambahake jejak menyang cara, sampeyan kudu mesthekake yen ora diarani kaping pirang-pirang ing daur ulang. Sampeyan perlu kanggo nambah siji tilak umum kanggo kabeh telpon, kang njamin total wektu karya. Yen ora, beban keluwihan bakal digawe.
  • Sawise ing jaeger-ui, panjalukan gedhe banget kanggo akeh jejak, lan amarga ora ngenteni jawaban, dheweke nindakake maneh. Akibaté, jaeger-query wiwit mangan akeh memori lan alon mudhun elastis. Dibantu kanthi miwiti maneh jaeger-query

Sampling, nyimpen lan ndeleng jejak

Ana telung jinis jejak sampling:

  1. Const sing ngirim lan nyimpen kabeh jejak.
  2. Probabilistik sing nyaring jejak kanthi kemungkinan tartamtu.
  3. Ratelimting sing mbatesi jumlah jejak per detik. Sampeyan bisa ngatur setelan iki ing klien, salah siji ing jaeger-agen utawa ing Penagih. Saiki kita nggunakake const 1 ing tumpukan valuator, wiwit ana ora akeh banget panjalukan, nanging njupuk wektu dawa. Ing mangsa ngarep, yen iki bakal menehi beban gedhe banget ing sistem, sampeyan bisa matesi.

Yen sampeyan nggunakake cassandra, banjur kanthi standar mung nyimpen jejak sajrone rong dina. Kita nggunakake elastisark lan ngambah disimpen kanggo kabeh wektu lan ora dibusak. Indeks kapisah digawe kanggo saben dina, contone jaeger-service-2019-03-04. Ing mangsa ngarep, sampeyan kudu ngatur reresik otomatis saka tilas lawas.

Kanggo ndeleng jejak sampeyan kudu:

  • Pilih layanan sing pengin nyaring jejak, contone, tomcat7-standar kanggo layanan sing mlaku ing Tomcat lan ora bisa duwe jeneng dhewe.
  • Banjur pilih operasi, interval wektu lan wektu operasi minimal, contone saka 10 detik, kanggo njupuk mung eksekusi dawa.
    Service Tracing, OpenTracing lan Jaeger
  • Pindhah menyang salah siji saka tilas lan ndeleng apa sing alon mudhun ana.
    Service Tracing, OpenTracing lan Jaeger

Uga, yen sawetara id panjalukan dikenal, sampeyan bisa nemokake jejak kanthi id iki liwat telusuran tag, yen id iki mlebu ing rentang jejak.

Dokumentasi

Artikel

Video

Source: www.habr.com

Add a comment