Kratki vodič za mikrometar

1. Uvod

Mikrometar pruža jednostavnu fasadu nad klijentima instrumentacije za brojne popularne sustave nadzora. Trenutno podržava sljedeće sustave za nadzor: Atlas, Datadog, Graphite, Ganglia, Influx, JMX i Prometheus.

U ovom ćemo članku predstaviti osnovnu uporabu mikrometra i njegovu integraciju s Springom.

Radi jednostavnosti uzet ćemo Micrometer Atlas kao primjer kako bismo prikazali većinu naših slučajeva upotrebe.

2. Ovisnost Mavena

Za početak, dodajte sljedeću ovisnost na pom.xml:

 io.micrometer mikrometar-registar-atlas 0.12.0.OSLOBOĐENJE 

Najnoviju verziju možete pronaći ovdje.

3. MeterRegistry

U Mikrometru, a MeterRegistry je glavna komponenta koja se koristi za registraciju brojila. Možemo prelaziti kroz registar i dalje mjerne podatke svakog mjerača, kako bismo generirali vremenski niz u pozadini s kombinacijama mjernih podataka i njihovih vrijednosti dimenzija.

Najjednostavniji oblik registra je SimpleMeterRegistry. Ali u većini slučajeva trebali bismo koristiti a MeterRegistry izričito dizajniran za naš sustav praćenja; za Atlas je AtlasMeterRegistry.

CompositeMeterRegistry omogućuje dodavanje više registara. Pruža rješenje za istovremeno objavljivanje mjernih podataka aplikacija na različitim podržanim sustavima nadzora.

Možemo dodati bilo koji MeterRegistry potrebno za prijenos podataka na više platformi:

CompositeMeterRegistry compositeRegistry = novi CompositeMeterRegistry (); SimpleMeterRegistry oneSimpleMeter = novi SimpleMeterRegistry (); AtlasMeterRegistry atlasMeterRegistry = novi AtlasMeterRegistry (atlasConfig, Clock.SYSTEM); compositeRegistry.add (oneSimpleMeter); compositeRegistry.add (atlasMeterRegistry);

U Micrometru postoji statična podrška globalnog registra: Metrike.globalRegistry. Također, za generiranje brojila pruža se set statičkih graditelja temeljenih na ovom globalnom registru Metrika:

@Test javna praznina givenGlobalRegistry_whenIncrementAnywhere_thenCount () {class CcountObject {private CountObject () {Metrics.counter ("objects.instance"). Prirast (1.0); }} Metrics.addRegistry (novi SimpleMeterRegistry ()); Metrics.counter ("objects.instance") .crement (); novi uračunati objekt (); Neobvezno counterOptional = Metrics.globalRegistry .find ("objects.instance"). Counter (); assertTrue (counterOptional.isPresent ()); assertTrue (counterOptional.get (). count () == 2.0); }

4. Oznake i Brojila

4.1. Oznake

Identifikator a Metar sastoji se od imena i oznaka. Predlaže se da slijedimo konvenciju imenovanja koja razdvaja riječi točkicom kako bi se zajamčila prenosivost metričkih imena u više sustava praćenja.

Brojač brojača = registry.counter ("page.visitors", "age", "20s");

Oznake može se koristiti za rezanje metrike radi zaključivanja o vrijednostima. U gornjem kodu, stranica.posjetitelji je naziv brojila, sa dob = 20s kao njegova oznaka. U ovom je slučaju brojač namijenjen brojanju posjetitelja stranice u dobi između 20 i 30 godina.

Za veliki sustav možemo dodati uobičajene oznake u registar, recimo da su mjerni podaci iz određene regije:

registry.config (). commonTags ("regija", "ua-istok");

4.2. Brojač

A Brojač izvještava samo brojanje određenog svojstva aplikacije. Prilagođeni brojač možemo izgraditi pomoću tečnog graditelja ili pomoćne metode bilo kojeg drugog MetricRegistry:

Brojač brojača = Counter .builder ("instanca") .description ("označava broj instanci objekta") .tags ("dev", "performance") .register (registar); brojač.prirast (2.0); assertTrue (counter.count () == 2); brojač.prirast (-1); assertTrue (counter.count () == 2);

Kao što se vidi iz gornjeg isječka, pokušali smo smanjiti brojač za jedan ali brojač možemo povećati monotono samo za fiksni pozitivni iznos.

4.3. Tajmeri

Za mjerenje kašnjenja ili učestalosti događaja u našem sustavu možemo koristiti Tajmeri. A Tajmer izvijestit će barem ukupno vrijeme i broj događaja određenih vremenskih serija.

Na primjer, možemo snimiti događaj koji može trajati nekoliko sekundi:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); Timer timer = registry.timer ("app.event"); timer.record (() -> {try {TimeUnit.MILLISECONDS.sleep (1500);} catch (InterruptedException ignorisan) {}}); timer.record (3000, MILISEKONDA); assertTrue (2 == timer.count ()); assertTrue (4510> timer.totalTime (MILLISECONDS) && 4500 <= timer.totalTime (MILLISECONDS));

Za snimanje dugotrajnih događaja koji koristimo koristimo LongTaskTimer:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); LongTaskTimer longTaskTimer = LongTaskTimer .builder ("3rdPartyService") .register (registar); long currentTaskId = longTaskTimer.start (); isprobajte {TimeUnit.SECONDS.sleep (2); } catch (InterruptedException ignorisan) {} long timeElapsed = longTaskTimer.stop (currentTaskId); assertTrue (timeElapsed / (int) 1e9 == 2);

4.4. Mjerač

Mjerač prikazuje trenutnu vrijednost metra.

Za razliku od ostalih brojila, Mjerači podatke treba prijaviti samo kad se promatraju. Mjerači može biti korisno prilikom nadgledanja statistike predmemorije, zbirki itd .:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); Lista popisa = novi ArrayList (4); Gauge gauge = Gauge .builder ("cache.size", list, List :: size) .register (registar); assertTrue (gauge.value () == 0.0); list.add ("1"); assertTrue (gauge.value () == 1.0);

4.5. Sažetak distribucije

Distribucija događaja i jednostavan sažetak pruža Sažetak distribucije:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); DistributionSummary distributionSummary = DistributionSummary .builder ("request.size") .baseUnit ("bajtovi") .register (registar); distributionSummary.record (3); distributionSummary.record (4); distributionSummary.record (5); assertTrue (3 == distributionSummary.count ()); assertTrue (12 == distributionSummary.totalAmount ());

Štoviše, Sažetak distribucije i Tajmeri mogu se obogatiti kvantilima:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); Timer timer = Timer.builder ("test.timer") .quantiles (WindowSketchQuantiles .quantiles (0.3, 0.5, 0.95) .create ()) .register (registar);

U gornjem isječku, tri mjerila s oznakama kvantil = 0,3, kvantil = 0,5 i kvantil = 0,95 bit će dostupni u registru, naznačujući vrijednosti ispod kojih pada 95%, 50% i 30% opažanja.

Da bismo vidjeli ove kvantile na djelu, dodajmo sljedeće zapise:

timer.record (2, TimeUnit.SECONDS); timer.record (2, TimeUnit.SECONDS); timer.record (3, TimeUnit.SECONDS); timer.record (4, TimeUnit.SECONDS); timer.record (8, TimeUnit.SECONDS); timer.record (13, TimeUnit.SECONDS);

Tada možemo provjeriti izdvajanjem vrijednosti u ta tri kvantila Mjerači:

Popis quantileGauges = registry.getMeters (). Stream () .filter (m -> m.getType (). Name (). Jednako ("Gauge")) .map (meter -> (Gauge) meter) .collect (Collectors .izlistati()); assertTrue (3 == quantileGauges.size ()); Mapa quantileMap = extractTagValueMap (registar, Type.Gauge, 1e9); assertThat (quantileMap, allOf (hasEntry ("quantile = 0.3", 2), hasEntry ("quantile = 0.5", 3), hasEntry ("quantile = 0.95", 8)));

Osim toga, Micrometer također podržava histograme:

DistributionSummary hist = DistributionSummary .builder ("sažetak") .histogram (Histogram.linear (0, 10, 5)) .register (registar);

Slično kvantilima, nakon dodavanja nekoliko zapisa, možemo vidjeti da histogram prilično dobro obračunava:

Karta histograma = extractTagValueMap (registar, Type.Counter, 1.0); assertThat (histogrami, allOf (hasEntry ("kanta = 0.0", 0), hasEntry ("kanta = 10.0", 2), hasEntry ("kanta = 20.0", 2), hasEntry ("kanta = 30.0", 1), hasEntry ("kanta = 40,0", 1), hasEntry ("kanta = Beskonačnost", 0)));

Općenito, histogrami mogu pomoći u ilustraciji izravne usporedbe u zasebnim skupinama. Histogrami se također mogu vremenski prilagoditi, što je vrlo korisno za analizu vremena odziva pozadinske usluge:

Registar SimpleMeterRegistry = novi SimpleMeterRegistry (); Timer timer = Timer .builder ("timer") .histogram (Histogram.linearTime (TimeUnit.MILLISECONDS, 0, 200, 3)) .register (registar); // ... assertThat (histograms, allOf (hasEntry ("vedro = 0.0", 0), hasEntry ("vedro = 2.0E8", 1), hasEntry ("vedro = 4.0E8", 1), hasEntry ("vedro = Beskonačnost ", 3)));

5. Veziva

Mikrometar ima više ugrađenih veziva za nadgledanje JVM-a, predmemorije, ExecutorService i usluge sječe drva.

Kada je riječ o JVM-u i nadzoru sustava, možemo nadzirati mjerne podatke učitavača klasa (ClassLoaderMetrics), JVM spremište memorije (JvmMemoryMetrics) i GC metrika (JvmGcMetrics), nit i korištenje CPU-a (JvmThreadMetrics, ProcessorMetrics).

Nadzor predmemorije (trenutno su podržani samo Guava, EhCache, Hazelcast i kofein) podržan je instrumentima s GuavaCacheMetrics, EhCache2Metrics, HazelcastCacheMetrics, i CaffeineCacheMetrics. A da bismo nadzirali uslugu povratka dnevnika, možemo se vezati LogbackMetrics u bilo koji valjani registar:

nova LogbackMetrics (). bind (registar);

Korištenje gornjih veziva prilično je slično LogbackMetrics i svi su prilično jednostavni, pa ovdje nećemo ulaziti u daljnje detalje.

6. Proljetna integracija

Spring Boot Actuator pruža upravljanje ovisnostima i automatsku konfiguraciju za Micrometer. Sada je podržan u Spring Boot 2.0 / 1.x i Spring Framework 5.0 / 4.x.

Trebat će nam sljedeća ovisnost (najnoviju verziju možete pronaći ovdje):

 io.micrometer mikrometar-opruga-naslijeđe 0.12.0.OBUSTAŽENJE 

Bez ikakvih daljnjih promjena postojećeg koda, omogućili smo proljetnu podršku s Micrometrom. JVM memorijske metrike naše proljetne aplikacije automatski će se registrirati u globalnom registru i objaviti na zadanoj završnoj točki atlasa: // localhost: 7101 / api / v1 / objaviti.

Dostupno je nekoliko svojstava koja se mogu konfigurirati za upravljanje mjernim podacima koji izvoze ponašanje, počevši od opruga.metrike.atlas. *. Ček AtlasConfig da biste vidjeli cijeli popis svojstava konfiguracije za izdavanje Atlas-a.

Ako moramo povezati više mjernih podataka, dodajte ih samo kao @Grah kontekstu aplikacije.

Recimo da nam treba JvmThreadMetrics:

@Bean JvmThreadMetrics threadMetrics () {vratiti novi JvmThreadMetrics (); }

Što se tiče web nadzora, on se automatski konfigurira za svaku krajnju točku u našoj aplikaciji, ali se njime može upravljati putem konfiguracijskog svojstva: spring.metrics.web.autoTimeServerRequests.

Zadana implementacija pruža četiri dimenzije mjernih podataka za krajnje točke: metoda HTTP zahtjeva, HTTP kod odgovora, URI krajnje točke i informacije o iznimci.

Kada se odgovori na zahtjeve, mjerni podaci koji se odnose na način zahtjeva (DOBITI, OBJAVIitd.) bit će objavljeni u Atlasu.

Uz Atlas Graph API možemo generirati grafikon za usporedbu vremena odziva za različite metode:

Prema zadanim postavkama kodovi odgovora od 20x, 30x, 40x, 50x također će biti prijavljeno:

Također možemo usporediti različite URI-je:

ili provjerite mjerne podatke o iznimkama:

Imajte na umu da možemo i koristiti @ Vrijeme na klasi kontrolera ili određenim metodama krajnje točke za prilagodbu oznaka, dugog zadatka, kvantila i percentila mjernih podataka:

@RestController @Timed ("people") javna klasa PeopleController {@GetMapping ("/ people") @Timed (value = "people.all", longTask = true) javni popis listePeople () {// ...}}

Na temelju gornjeg koda, provjerom krajnje točke Atlas možemo vidjeti sljedeće oznake // localhost: 7101 / api / v1 / tags / name:

["ljudi", "ljudi.sve", "jvmBufferCount", ...]

Mikrometar također radi u funkcionalnom mrežnom okviru uvedenom u Spring Boot 2.0. Mjerni podaci mogu se omogućiti filtriranjem Funkcija usmjerivača:

Metrika RouterFunctionMetrics = nova RouterFunctionMetrics (registar); RouterFunctions.route (...) .filter (metrics.timer ("server.requests"));

Također se mogu prikupiti mjerni podaci iz izvora podataka i planirani zadaci. Više pojedinosti potražite u službenoj dokumentaciji.

7. Zaključak

U ovom smo članku predstavili metrički fasadni mikrometar. Apstrahirajući i podržavajući višestruke sustave praćenja pod uobičajenom semantikom, alat olakšava prebacivanje između različitih platformi za nadzor.

Kao i uvijek, puni implementacijski kod ovog članka nalazi se na Githubu.


$config[zx-auto] not found$config[zx-overlay] not found