Service Tracing, OpenTracing jeung Jaeger

Service Tracing, OpenTracing jeung Jaeger

Kami nganggo arsitéktur microservice dina proyék kami. Nalika bottlenecks kinerja lumangsung, loba waktu anu spent monitoring sarta parsing log. Nalika logging waktos operasi individu kana file log, biasana sesah ngartos naon anu nyababkeun panyebaran operasi ieu, pikeun ngalacak sekuen tindakan atanapi pergeseran waktos hiji operasi relatif ka anu sanés dina jasa anu béda.

Pikeun ngaleutikan tanaga gawé manual, urang mutuskeun pikeun ngagunakeun salah sahiji parabot tracing. Ngeunaan kumaha sareng kunaon anjeun tiasa nganggo ngalacak sareng kumaha urang ngalakukeunana, sareng bakal dibahas dina tulisan ieu.

Masalah naon bisa direngsekeun ku tracing

  1. Manggihan bottlenecks kinerja duanana dina layanan tunggal jeung dina sakabéh tangkal palaksanaan antara sakabeh jasa milu. Salaku conto:
    • Seueur sauran pondok padeukeut antara jasa, contona, ka geocoding atanapi ka pangkalan data.
    • Ngadagoan I/O lila, saperti mindahkeun jaringan atawa maca disk.
    • Parsing data panjang.
    • Operasi lila merlukeun cpu.
    • Bagéan kode anu henteu diperyogikeun pikeun kéngingkeun hasil ahir sareng tiasa dihapus atanapi ditunda.
  2. Jelas ngartos dina urutan naon nu disebut na naon kajadian nalika operasi anu dipigawé.
    Service Tracing, OpenTracing jeung Jaeger
    Ieu bisa ditempo yén, contona, Request sumping ka layanan WS -> layanan WS supplemented data ngaliwatan layanan Sunda -> lajeng dikirim pamundut ka layanan V -> jasa V dimuat loba data ti jasa R -> indit ka layanan P -> jasa P indit deui ka layanan R -> jasa V dipaliré hasilna tur indit ka layanan J -> sarta ngan lajeng mulangkeun respon kana layanan WS, bari terus ngitung hal sejenna dina tukang.
    Tanpa renik sapertos atanapi dokuméntasi lengkep pikeun sakabéh prosés, éta hésé pisan ngartos naon anu lumangsung mun anjeun nempo kode pikeun kahiji kalina, jeung kode ieu sumebar di sakuliah jasa béda jeung disumputkeun tukangeun kebat bins na interfaces.
  3. Koléksi inpormasi ngeunaan tangkal palaksanaan pikeun analisis nunggak salajengna. Dina unggal tahapan palaksanaan, anjeun tiasa nambihan inpormasi kana jejak anu sayogi dina tahap ieu teras terangkeun data input naon anu nyababkeun skenario anu sami. Salaku conto:
    • ID Pangguna
    • Hak
    • Jenis métode dipilih
    • Kasalahan log atanapi palaksanaan
  4. Ngarobah ngambah kana sawaréh ti metrics jeung analisis salajengna geus dina bentuk metrics.

Naon jejak tiasa log. bentang

Dina tracing aya konsép bentang, ieu analog hiji log, mun konsol nu. Spa ngabogaan:

  • Ngaran, biasana nami metode anu dieksekusi
  • Ngaran jasa dimana bentang dihasilkeun
  • ID unik sorangan
  • Sababaraha jinis inpormasi meta dina bentuk konci / nilai anu parantos lebet kana éta. Contona, parameter métode atawa métode ditungtungan ku kasalahan atawa henteu
  • Mimitian sareng waktos tungtung pikeun bentang ieu
  • ID bentang kolot

Unggal bentang dikirim ka collector bentang pikeun disimpen dina database pikeun review engké pas eta geus réngsé palaksanaan na. Dina mangsa nu bakal datang, anjeun tiasa ngawangun tangkal sadaya bentang ku cara ngahubungkeun ku indungna id. Nalika nganalisa, anjeun tiasa mendakan, contona, sadaya bentang dina sababaraha jasa anu nyandak langkung ti sababaraha waktos. Salajengna, ku buka bentang husus, tingali sakabéh tangkal luhur jeung handap bentang ieu.

Service Tracing, OpenTracing jeung Jaeger

Opentrace, Jagger sareng kumaha urang ngalaksanakeunana pikeun proyék-proyék urang

Aya standar umum opentrace, nu ngajelaskeun kumaha jeung naon kudu dikumpulkeun, tanpa keur dihijikeun ku tracing ka palaksanaan husus dina basa mana wae. Contona, dina Java, sadaya karya kalawan ngambah dilumangsungkeun ngaliwatan Opentrace API umum, sarta di handapeun eta, contona, Jaeger atawa palaksanaan standar kosong nu teu nanaon bisa disumputkeun.
Kami nganggo Hunter salaku palaksanaan Opentrace. Ieu diwangun ku sababaraha komponén:

Service Tracing, OpenTracing jeung Jaeger

  • Jaeger-agén mangrupakeun agén lokal anu biasana dipasang dina unggal mesin sarta jasa asup kana eta dina port standar lokal. Upami teu aya agén, maka ngambah sadaya jasa dina mesin ieu biasana ditumpurkeun
  • Jaeger-kolektor - sadaya agén ngirimkeun jejak anu dikumpulkeun ka dinya, sareng nempatkeun éta dina pangkalan data anu dipilih
  • Pangkalan data nyaéta cassandra anu dipikaresepna, tapi kami nganggo elasticsearch, aya palaksanaan pikeun sababaraha database sanés sareng palaksanaan dina mémori anu henteu nyimpen nanaon kana disk.
  • Jaeger-query mangrupikeun jasa anu mana ka pangkalan data sareng mulangkeun jejak anu parantos dikumpulkeun pikeun dianalisis
  • Jaeger-ui mangrupikeun antarbeungeut wéb pikeun milarian sareng ningali jejak, éta nuju ka jaeger-query

Service Tracing, OpenTracing jeung Jaeger

A komponén misah bisa disebut palaksanaan opentrace jaeger pikeun basa husus, ngaliwatan nu bentang dikirim ka jaeger-agén.
Nyambungkeun Jagger di Jawa asalna handap pikeun nerapkeun antarbeungeut io.opentracing.Tracer, nu satutasna sagala ngambah ngaliwatan eta bakal ngapung ka agén nyata.

Service Tracing, OpenTracing jeung Jaeger

Ogé pikeun komponén spring, Anjeun bisa nyambung opentracing-spring-cloud-starter sarta palaksanaan ti Jaeger opentracing-spring-jaeger-cloud-starter nu otomatis bakal ngonpigurasikeun tracing pikeun sagalana nu ngaliwatan komponén ieu, contona requests http mun Controllers, requests ka database ngaliwatan jdbc, jsb.

Ngalacak logging di Jawa

Di mana waé di tingkat luhur, Span munggaran kedah didamel, ieu tiasa dilakukeun sacara otomatis, contona, ku spring controller nalika pamundut ditampi, atanapi sacara manual upami teu aya. Ieu lajeng dikirimkeun ngaliwatan Wengkuan handap. Mun sagala métode handap hayang nambahkeun span a, eta nyokot activeSpan ayeuna ti wengkuan, nyiptakeun span anyar jeung nyebutkeun indungna nyaeta activeSpan dihasilkeun, sarta ngajadikeun span anyar aktip. Nalika nelepon jasa éksternal, bentang aktif ayeuna diteruskeun ka aranjeunna, sareng jasa-jasa éta nyiptakeun bentang énggal kalayan ngarujuk kana bentang ieu.
Sadaya padamelan ngalangkungan conto Tracer, anjeun tiasa ngalangkungan mékanisme DI, atanapi GlobalTracer.get () salaku variabel global upami mékanisme DI henteu jalan. Sacara standar, lamun tracer teu acan initialized, NoopTracer bakal balik nu teu nanaon.
Salajengna, wengkuan ayeuna dicandak ti tracer ngaliwatan ScopeManager, a wengkuan anyar dijieun tina hiji ayeuna ku beungkeutan bentang anyar, lajeng wengkuan dijieun ditutup, nu nutup bentang dijieun tur mulih wengkuan saméméhna ka kaayaan aktip. Lingkup dihijikeun ka thread, jadi lamun programming multi-threaded, anjeun teu kudu poho pikeun mindahkeun bentang aktif ka thread sejen, pikeun aktivasina salajengna tina Wengkuan thread sejen kalawan rujukan ka bentang ieu.

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

Pikeun program multi-threaded, aya ogé TracedExecutorService sareng bungkus anu sami anu sacara otomatis neraskeun bentang ayeuna kana utas nalika tugas asinkron diluncurkeun:

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

Pikeun requests http éksternal aya TracingHttpClient

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

Masalah anu kami hadapi

  • Kacang jeung DI teu salawasna dianggo lamun tracer henteu dipaké dina layanan atawa komponén, lajeng Autowired Tracer bisa jadi teu jalan jeung anjeun kudu make GlobalTracer.get ().
  • Anotasi henteu tiasa dianggo upami sanés komponén atanapi jasa, atanapi upami metodena disebut tina metode tatangga kelas anu sami. Anjeun kedah ati-ati pikeun pariksa naon anu dianggo sareng nganggo ciptaan jejak manual upami @Traced henteu jalan. Anjeun ogé tiasa ngagantelkeun kompiler tambahan pikeun anotasi java, teras aranjeunna kedah dianggo dimana-mana.
  • Dina cinyusu jeung spring boot heubeul, opentraing spring cloud autoconfiguration teu jalan alatan bug di DI, mangka lamun hayang ngambah dina komponén spring jalan sacara otomatis, Anjeun bisa ngalakukeunana ku analogi jeung 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 jeung sumberdaya teu dianggo dina groovy, anjeun kudu make try tungtungna.
  • Unggal layanan kudu boga spring.application.name sorangan nu ngambah bakal asup log. Naon nami misah pikeun diobral jeung test, ku kituna teu ngaganggu aranjeunna babarengan.
  • Upami anjeun nganggo GlobalTracer sareng Tomcat, maka sadaya jasa anu dijalankeun dina Tomcat ieu gaduh hiji GlobalTracer, janten aranjeunna sadayana gaduh nami jasa anu sami.
  • Nalika nambihan ngambah kana metode, anjeun kedah mastikeun yén éta henteu disebut sababaraha kali dina loop. Ieu diperlukeun pikeun nambahkeun hiji renik umum pikeun sakabéh nelepon, nu ngajamin total waktu gawé. Upami teu kitu, kaleuwihan beban bakal dijieun.
  • Sakali di jaeger-ui, requests badag teuing dijieun pikeun angka nu gede ngarupakeun ngambah, sarta saprak maranéhna teu ngadagoan respon, maranéhna ngalakukeun deui. Hasilna, jaeger-query mimiti dahar loba memori jeung ngalambatkeun turun elastis. Dibantosan ku ngabalikan deui jaeger-query

Sampling, nyimpen sareng ningali jejak

Aya tilu rupa ngambah sampling:

  1. Const nu ngirim jeung ngahemat sagala ngambah.
  2. Probabilistik nu nyaring ngambah kalawan sababaraha probabiliti dibikeun.
  3. Ratelimting anu ngabatesan jumlah ngambah per detik. Anjeun tiasa ngonpigurasikeun setelan ieu dina klien, boh dina jaeger-agén atawa dina collector. Ayeuna kami nganggo const 1 dina tumpukan valuator, saprak aya teu pisan loba requests, tapi maranéhna butuh lila. Dina mangsa nu bakal datang, lamun ieu bakal exert beban kaleuleuwihan dina sistem, Anjeun bisa ngawatesan eta.

Upami anjeun nganggo cassandra, maka sacara standar ngan ukur nyimpen jejak salami dua dinten. Kami nganggo élastis jeung ngambah disimpen pikeun sakabéh waktu jeung teu dihapus. Indéks anu misah didamel pikeun unggal dinten, contona jaeger-service-2019-03-04. Dina mangsa nu bakal datang, anjeun kudu ngonpigurasikeun beberesih otomatis tina ngambah heubeul.

Pikeun ningali jejak anjeun peryogi:

  • Pilih jasa anu anjeun hoyong nyaring ngambah, contona, tomcat7-standar pikeun layanan anu dijalankeun dina Tomcat sareng teu tiasa gaduh namina sorangan.
  • Teras pilih operasi, interval waktos sareng waktos operasi minimum, contona tina 10 detik, ngan ukur ngalaksanakeun eksekusi anu panjang.
    Service Tracing, OpenTracing jeung Jaeger
  • Buka salah sahiji ngambah tur tingal naon slowing handap dinya.
    Service Tracing, OpenTracing jeung Jaeger

Ogé, upami sababaraha pamundut id dipikanyaho, teras anjeun tiasa mendakan jejak ku id ieu ngalangkungan pamilarian tag, upami id ieu asup kana rentang renik.

Dokuméntasi

Artikel

Видео

sumber: www.habr.com

Tambahkeun komentar