![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
U prošlosti, kada smo govorili o backendu, obično smo mislili na jednu veliku aplikaciju sa jednom, velikom bazom podataka, a evidentiranje je bilo dovoljno za praćenje. Sada, zahvaljujući tehnologijama kao što je Kubernetes , mikroservise su postale standard. Aplikacije su brojnije i distribuirane, a tradicionalno evidentiranje više nije dovoljno za otklanjanje grešaka i dijagnosticiranje problema u našim aplikacijama.
Odlično rešenje za organizovanje nadgledanja je OpenTelemetry — moderan komplet alata koji se može koristiti za otklanjanje grešaka i analizu performansi distribuiranih sistema.
Ovaj članak je namijenjen IT profesionalcima koji žele proširiti svoje znanje u backend optimizaciji. U nastavku ćemo detaljno opisati šta je OpenTelemetry, njegove ključne koncepte i probleme koje pomaže u rješavanju. Ako vas zanima kako OpenTelemetry može promijeniti vaš pristup praćenju i otklanjanju grešaka pozadinskih sistema, poboljšavajući njihovu pouzdanost i efikasnost — čitajte dalje.
Velike tehnološke kompanije prvi put su se suočile s izazovom distribuiranog evidentiranja i praćenja u kasnim 2000-im. Google je 2010. godine objavio rad,
2014. godine pojavio se Kubernetes, koji je značajno pojednostavio razvoj mikroservisa i drugih sistema distribuiranih u oblaku. To je dovelo do toga da su mnoge kompanije naišle na probleme sa distribuiranim evidentiranjem i praćenjem u mikroservisima. Za standardizaciju distribuiranog praćenja kreiran je OpenTracing standard, koji je usvojio CNCF, i Googleov OpenCensus projekat.
Projekti OpenTracing i OpenCensus su 2019. godine najavili spajanje pod imenom OpenTelemetry. Ova platforma kombinuje najbolje prakse akumulirane tokom mnogo godina, omogućavajući besprekornu integraciju praćenja, evidentiranja i metrike u bilo koji sistem, bez obzira na njihovu složenost.
Danas OpenTelemetry nije samo projekat; to je industrijski standard za prikupljanje i prijenos telemetrijskih podataka. Razvijen je i podržan od strane zajednice stručnjaka i vodećih kompanija na tržištu kao što su Google i Microsoft. Projekat nastavlja da se razvija, dobijajući nove mogućnosti za pojednostavljenje procesa integracije i korišćenja.
OpenTelemetry je sveobuhvatan skup praksi i alata koji definiraju koje signale aplikacija može generirati za interakciju sa vanjskim svijetom i kako se ti signali mogu prikupiti i vizualizirati za praćenje stanja aplikacija i sistema u cjelini. Tri glavne vrste signala su praćenje, evidentiranje i prikupljanje metrika .
** Pogledajmo detaljnije svaku komponentu: \
OpenTelemetry uvodi koncept operativnih konteksta. Kontekst prvenstveno uključuje atribute kao što su `trace_id`
(identifikator za trenutnu operaciju) i `span_id`
(identifikator za pod-zahtjev, pri čemu svaki ponovni pokušaj pod-zahtjeva ima jedinstveni `span_id`
).
Dodatno, kontekst može sadržavati statičke informacije, kao što je ime čvora gdje je aplikacija raspoređena ili ime okruženja (prod/qa). Ova polja, poznata kao resursi u terminologiji OpenTelemetry, pridružena su svakom dnevniku, metrici ili tragu radi lakšeg pretraživanja. Konteksti također mogu uključivati dinamičke podatke, kao što je identifikator trenutne krajnje točke ( `http_path: "GET /user/:id/info"`
), koji se mogu selektivno priključiti grupama dnevnika, metrika ili tragova.
OpenTelemetry konteksti se mogu prenositi između različitih aplikacija koristeći protokole za širenje konteksta. Ovi protokoli se sastoje od skupova zaglavlja koji se dodaju svakom HTTP ili gRPC zahtjevu ili zaglavlja poruka za redove. Ovo omogućava nizvodnim aplikacijama da rekonstruišu operativni kontekst iz ovih zaglavlja.
Evo nekoliko primjera širenja konteksta:
B3-Propagation Ovo je skup zaglavlja ( x-b3-*
) prvobitno razvijen za Zipkin sistem praćenja. Prilagođen je u OpenTracing i korišćen od strane mnogih alata i biblioteka. B3-Propagacija nosi trace_id
/ span_id
i zastavicu koja pokazuje da li je uzorkovanje potrebno.
Kontekst praćenja W3C Razvijen od strane W3C radne grupe, ovaj standard objedinjuje različite pristupe širenju konteksta u jedan standard i podrazumevani je u OpenTelemetry. Dobar primjer primjene ovih standarda je praćenje izvršenja zahtjeva koji prolazi kroz mikroservise implementirane različitim tehnologijama bez ugrožavanja tačnosti praćenja i otklanjanja grešaka.
Praćenje je proces snimanja i naknadnog vizualizacije vremenske linije putanje zahtjeva kroz više mikroservisa.
U vizualizaciji, svaka traka se naziva "span" i ima jedinstveni "span_id" . Korijenski raspon se naziva "trace" i ima "trace_id" , koji služi kao identifikator za cijeli zahtjev.
Ova vrsta vizualizacije vam omogućava da:
trace_id
i span_id
za upotrebu u drugim signalima.
Unatoč prividnoj jednostavnosti, evidentiranje ostaje jedno od najmoćnijih alata za dijagnosticiranje problema. OpenTelemetry poboljšava tradicionalno evidentiranje dodavanjem kontekstualnih informacija. Konkretno, ako je prisutan aktivan trag, atributi `trace_id` i `span_id` se automatski dodaju u dnevnike, povezujući ih s vremenskom linijom praćenja. Štaviše, atributi dnevnika mogu uključivati statičke informacije iz konteksta OpenTelemetry, kao što je identifikator čvora, kao i dinamičke informacije, kao što je trenutni identifikator HTTP krajnje tačke (`http_path: "GET /user/:id"`).
Koristeći `trace_id`, možete pronaći zapise svih mikroservisa povezanih sa trenutnim zahtjevom, dok `span_id` omogućava vam da razlikujete podzahtjeve. Na primjer, u slučaju ponovnih pokušaja, zapisnici iz različitih pokušaja će imati različite `span_id`. Korišćenje ovih identifikatora omogućava brzu analizu ponašanja celog sistema u realnom vremenu, ubrzavajući dijagnozu problema i povećavajući stabilnost i pouzdanost.
Prikupljanje metrika pruža kvantitativne podatke o performansama sistema, kao što su kašnjenje, stope grešaka, korištenje resursa i još mnogo toga. Praćenje metrike u realnom vremenu omogućava vam da brzo odgovorite na promjene performansi, spriječite kvarove i iscrpljivanje resursa i osigurate visoku dostupnost i pouzdanost aplikacije za korisnike.
Integracija sa sistemima za metričko skladištenje i vizualizaciju kao što su Prometheus i Grafana olakšava vizualizaciju ovih podataka, značajno pojednostavljujući praćenje.
OpenTelemetry metrički kolektori su kompatibilni sa Prometheus i OpenMetrics standardima, omogućavajući lak prelazak na OpenTelemetry rješenja bez značajnih promjena. OpenTelemetry SDK dozvoljava da se primjeri trace_id izvoze zajedno s metrikom, što omogućava korelaciju metrike s primjerima dnevnika i tragovima.
Zajedno, zapisnici, metrika i praćenje stvaraju sveobuhvatan prikaz stanja sistema:
Pored tri osnovne komponente, OpenTelemetry uključuje koncepte uzorkovanja, prtljaga i upravljanja kontekstom operacije.
U sistemima sa visokim opterećenjem, količina dnevnika i tragova postaje ogromna, što zahtijeva značajne resurse za infrastrukturu i pohranu podataka. Da bi se riješio ovaj problem, OpenTelemetry standardi uključuju uzorkovanje signala — mogućnost izvoza samo dijela tragova i dnevnika. Na primjer, možete izvesti detaljne signale iz procenta zahtjeva, dugotrajnih zahtjeva ili zahtjeva za grešku. Ovaj pristup omogućava dovoljno uzorkovanja za izgradnju statistike uz uštedu značajnih resursa.
Međutim, ako svaki sistem samostalno odluči koje zahtjeve će detaljno pratiti, na kraju imamo fragmentiran pogled na svaki zahtjev. Neki sistemi mogu izvesti detaljne podatke dok drugi mogu samo djelomično izvoziti ili ne izvoze uopće.
Da bi se riješio ovaj problem, OpenTelemetry-jevi mehanizmi širenja konteksta prenose oznaku uzorkovanja zajedno sa `trace_id`/`span_id`. Ovo osigurava da ako početna usluga koja prima korisnički zahtjev odluči da zahtjev treba detaljno pratiti, svi ostali sistemi će slijediti taj primjer. U suprotnom, svi sistemi bi trebali djelomično ili ne izvoziti signale radi očuvanja resursa. Ovaj pristup se naziva „Uzorkovanje glave“ — odluka koja se donosi na početku obrade zahteva, bilo nasumično ili na osnovu nekih ulaznih atributa.
Osim toga, OpenTelemetry podržava "Tail Sampling", gdje sve aplikacije uvijek izvoze sve signale u detalje, ali postoji međubafer. Nakon prikupljanja svih podataka, ovaj bafer odlučuje da li će zadržati pune podatke ili zadržati samo djelomični uzorak. Ova metoda omogućava reprezentativniji uzorak svake kategorije zahtjeva (uspješan/dug/greška), ali zahtijeva dodatno podešavanje infrastrukture.
Mehanizam prtljage omogućava da se proizvoljni parovi ključ/vrijednost prenesu zajedno sa trace_id
/ span_id
, automatski prolazeći između svih mikroservisa tokom obrade zahtjeva. Ovo je korisno za prijenos dodatnih informacija potrebnih kroz stazu zahtjeva—kao što su informacije o korisniku ili postavke okruženja za izvršavanje.
Primjer zaglavlja za prijenos prtljage prema W3C standardu: tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE,userId=1c30032v5
Evo nekoliko primjera korištenja prtljage:
Dodavanje informacija poslovnog konteksta kao što su userId
, productId
ili deviceId
mogu se proslijediti kroz sve mikroservise. Aplikacije mogu automatski evidentirati ove informacije, omogućavajući pretraživanje dnevnika prema korisničkom kontekstu za originalni zahtjev.
Postavke specifičnih konfiguracijskih parametara za SDK-ove ili infrastrukturu.
Zastavice rutiranja Oznake koje pomažu balansatorima opterećenja da donose odluke o usmjeravanju. Tokom testiranja, neki zahtjevi će se možda morati usmjeriti na lažne pozadine. Pošto se prtljag automatski prenosi kroz sve usluge, nema potrebe za kreiranjem dodatnih protokola – samo postavite pravilo na balansatoru opterećenja.
Imajte na umu da, iako je učinak Prtljaga minimalan, prekomjerna upotreba može značajno povećati opterećenje mreže i usluge. Pažljivo odaberite koje podatke zaista trebate proći kroz Prtljag kako biste izbjegli probleme s performansama.
Implementacija OpenTelemetry na infrastrukturnom nivou uključuje integraciju OpenTelemetry backenda u arhitekturu aplikacije i konfiguriranje infrastrukture za agregaciju podataka.
Proces se sastoji od četiri faze:
Integracija aplikacija U prvoj fazi, OpenTelemetry SDK-ovi su direktno integrisani u aplikacije za prikupljanje metrike, evidencije i tragova, obezbeđujući kontinuirani protok podataka o performansama svake komponente sistema.
Konfigurisanje izvoznika Prikupljeni podaci se usmjeravaju iz aplikacija preko eksportera u eksterne sisteme za dalju obradu, kao što je evidentiranje, praćenje, praćenje ili sistemi analize, ovisno o vašim potrebama.
Agregacija i skladištenje Ova faza može uključivati normalizaciju podataka, njihovo obogaćivanje dodatnim informacijama i spajanje podataka iz različitih izvora kako bi se stvorio jedinstven pogled na stanje sistema.
Vizualizacija podataka Konačno, obrađeni podaci su predstavljeni kao kontrolne table u sistemima kao što su Grafana (za metriku i tragove) ili Kibana (za dnevnike). Ovo omogućava timovima da brzo procijene zdravlje sistema, identifikuju probleme i trendove i postave upozorenja na osnovu generisanih signala.
Da biste se integrisali sa aplikacijom, potrebno je da povežete odgovarajući OpenTelemetry SDK za programski jezik koji se koristi ili da koristite biblioteke i okvire koji direktno podržavaju OpenTelemetry. OpenTelemetry često implementira široko korišćena sučelja iz poznatih biblioteka, omogućavajući zamjenu. Na primjer, biblioteka Micrometer se obično koristi za prikupljanje metrika u Java ekosistemu. OpenTelemetry SDK pruža svoje implementacije Micrometer interfejsa, omogućavajući izvoz metrike bez promjene glavnog koda aplikacije. Štaviše, OpenTelemetry nudi implementacije starijih OpenTracing i OpenCensus interfejsa, olakšavajući glatku migraciju na OpenTelemetry.
U IT sistemima, OpenTelemetry može postati ključ za budućnost pouzdanog i efikasnog backenda. Ovaj alat pojednostavljuje otklanjanje grešaka i nadgledanje, a takođe otvara mogućnosti za duboko razumevanje performansi aplikacije i optimizaciju na novom nivou. Pridružite se zajednici OpenTelemetry kako biste pomogli u oblikovanju budućnosti u kojoj je razvoj pozadinskog sustava jednostavniji i učinkovitiji!