Stručný sprievodca mikrometrom

1. Úvod

Mikrometer poskytuje jednoduchú fasádu nad klientmi prístrojového vybavenia pre množstvo populárnych monitorovacích systémov. V súčasnosti podporuje tieto monitorovacie systémy: Atlas, Datadog, Graphite, Ganglia, Influx, JMX a Prometheus.

V tomto článku si predstavíme základné použitie mikrometra a jeho integráciu s pružinou.

Pre zjednodušenie si vezmeme ako príklad mikrometer Atlas, ktorý demonštruje väčšinu našich prípadov použitia.

2. Závislosť od Maven

Na začiatok pridajme do nasledujúcej závislosti pom.xml:

 io.mikrometer mikrometer-register-atlas 0,12.0.VEREJNOSŤ 

Najnovšiu verziu nájdete tu.

3. MeterRegistry

V spoločnosti Micrometer, a MeterRegistry je hlavný komponent používaný na registráciu meračov. Môžeme iterovať cez register a ďalej rozvíjať metriky každého merača, aby sme vygenerovali časový rad v backende s kombináciami metrík a ich hodnôt dimenzií.

Najjednoduchšia forma registra je SimpleMeterRegistry. Ale vo väčšine prípadov by sme mali použiť a MeterRegistry výslovne určené pre náš monitorovací systém; pre Atlas je AtlasMeterRegistry.

CompositeMeterRegistry umožňuje pridanie viacerých registrov. Poskytuje riešenie na súčasné publikovanie metrík aplikácií do rôznych podporovaných monitorovacích systémov.

Môžeme pridať ľubovoľné MeterRegistry potrebné na nahranie údajov na viac platforiem:

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

Mikrometer má statickú podporu globálneho registra: Metrics.globalRegistry. Na generovanie meračov je tiež poskytnutá sada statických nástrojov založených na tomto globálnom registri Metriky:

@Test public void givenGlobalRegistry_whenIncrementAnywhere_thenCounted () {class CountedObject {private CountedObject () {Metrics.counter ("objects.instance"). Increment (1.0); }} Metrics.addRegistry (nový SimpleMeterRegistry ()); Metrics.counter ("objects.instance"). Increment (); new CountedObject (); Voliteľné counterOptional = Metrics.globalRegistry .find ("objects.instance"). Counter (); assertTrue (counterOptional.isPresent ()); assertTrue (counterOptional.get (). count () == 2,0); }

4. Značky a Merače

4.1. Značky

Identifikátor a Merač sa skladá z mena a značiek. Navrhuje sa, že by sme sa mali riadiť konvenciou pomenovania, ktorá oddeľuje slová bodkou, aby sme pomohli zaručiť prenosnosť metrických mien naprieč rôznymi monitorovacími systémami.

Počítadlo počítadla = registry.counter ("page.visitors", "age", "20s");

Značky možno použiť na rozčlenenie metriky na usudzovanie o hodnotách. V kóde vyššie page.visitors je názov meradla s vek = 20 rokov ako jeho značka. V takom prípade je počítadlom počítaný počet návštevníkov stránky vo veku od 20 do 30 rokov.

Pre veľký systém môžeme do registra pripojiť bežné značky, napríklad metriky pochádzajú z konkrétnej oblasti:

registry.config (). commonTags ("region", "ua-východ");

4.2. Počítadlo

A Počítadlo hlási iba započítanie cez zadanú vlastnosť aplikácie. Môžeme zostaviť vlastné počítadlo pomocou plynulého stavača alebo pomocnej metódy ľubovoľného Metrická registrácia:

Counter counter = Counter .builder ("instance") .description ("označuje počet inštancií objektu") .tags ("dev", "performance") .register (register); prírastok počítadla (2,0); assertTrue (counter.count () == 2); prírastok počítadla (-1); assertTrue (counter.count () == 2);

Ako je vidieť z úryvku vyššie, pokúsili sme sa znížiť počítadlo o jednu ale počítadlo môžeme iba monotónne zvýšiť o fixnú kladnú sumu.

4.3. Časovače

Na meranie latencie alebo frekvencie udalostí v našom systéme môžeme použiť Časovače. A Časovač bude hlásiť aspoň celkový čas a počet udalostí konkrétnych časových radov.

Môžeme napríklad zaznamenať udalosť aplikácie, ktorá môže trvať niekoľko sekúnd:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); Časovač časovača = registry.timer ("app.event"); timer.record (() -> {try {TimeUnit.MILLISECONDS.sleep (1500);} catch (InterruptedException ignored) {}}); timer.record (3000, MILLISECONDS); assertTrue (2 == timer.count ()); assertTrue (4510> timer.totalTime (MILLISECONDS) && 4500 <= timer.totalTime (MILLISECONDS));

Na zaznamenávanie dlho prebiehajúcich udalostí používame LongTaskTimer:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); LongTaskTimer longTaskTimer = LongTaskTimer .builder ("3rdPartyService") .register (register); long currentTaskId = longTaskTimer.start (); skus {TimeUnit.SECONDS.sleep (2); } catch (InterruptedException ignored) {} ​​long timeElapsed = longTaskTimer.stop (currentTaskId); assertTrue (timeElapsed / (int) 1e9 == 2);

4.4. Ukazovateľ

Meradlo ukazuje aktuálnu hodnotu merača.

Líši sa od iných metrov, Meradlá by mali hlásiť údaje, iba ak sú dodržané. Meradlá môže byť užitočné pri sledovaní štatistík medzipamäte, zbierok atď.:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); Zoznam zoznam = nový ArrayList (4); Gauge gauge = Gauge .builder ("cache.size", list, List :: size) .register (register); assertTrue (gauge.value () == 0,0); list.add ("1"); assertTrue (gauge.value () == 1,0);

4.5. Distribúcia Zhrnutie

Distribúciu udalostí a jednoduché zhrnutie poskytuje server Distribúcia Zhrnutie:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); DistributionSummary distributionSummary = DistributionSummary .builder ("request.size") .baseUnit ("bytes") .register (register); distributionSummary.record (3); distributionSummary.record (4); distributionSummary.record (5); assertTrue (3 == distributionSummary.count ()); assertTrue (12 == distributionSummary.totalAmount ());

Navyše, Distribúcia Zhrnutie a Časovače môžu byť obohatené kvantilmi:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); Časovač časovača = Timer.builder ("test.timer") .quantiles (WindowSketchQuantiles .quantiles (0,3, 0,5, 0,95) .create ()) .register (register);

V úryvku vyššie sú tri merače so značkami kvantil = 0,3, kvantil = 0,5 a kvantil = 0,95 bude k dispozícii v registri, čo naznačuje hodnoty, pod ktoré spadá 95%, 50% a 30% pozorovaní.

Ak chcete vidieť tieto kvantily v akcii, pridajme nasledujúce záznamy:

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);

Potom to môžeme overiť extrakciou hodnôt z týchto troch kvantilov Meradlá:

Zoznam quantileGauges = registry.getMeters (). Stream () .filter (m -> m.getType (). Name (). Equals ("Gauge")) .map (meter -> (Gauge) meter) .collect (Collectors .listovať()); assertTrue (3 == quantileGauges.size ()); Mapa quantileMap = extractTagValueMap (register, Type.Gauge, 1e9); assertThat (quantileMap, allOf (hasEntry ("kvantil = 0,3", 2), hasEntry ("kvantil = 0,5", 3), hasEntry ("kvantil = 0,95", 8)));

Okrem toho mikrometer podporuje aj histogramy:

DistributionSummary hist = DistributionSummary .builder ("summary") .histogram (Histogram.linear (0, 10, 5)) .register (register);

Podobne ako pri kvantiloch, aj po pripojení niekoľkých záznamov vidíme, že histogram zvláda výpočet celkom dobre:

Mapové histogramy = extractTagValueMap (register, Type.Counter, 1.0); assertThat (histogramy, allOf (hasEntry ("bucket = 0.0", 0), hasEntry ("bucket = 10.0", 2), hasEntry ("bucket = 20.0", 2), hasEntry ("bucket = 30.0", 1), hasEntry ("bucket = 40.0", 1), hasEntry ("bucket = Infinity", 0)));

Histogramy môžu vo všeobecnosti pomôcť ilustrovať priame porovnanie v samostatných segmentoch. Histogramy môžu byť tiež časovo odstupňované, čo je celkom užitočné na analýzu času odozvy back-endovej služby:

Register SimpleMeterRegistry = nový SimpleMeterRegistry (); Časovač časovača = Časovač .builder ("časovač") .histogram (Histogram.linearTime (TimeUnit.MILLISECONDS, 0, 200, 3)) .register (register); // ... assertThat (histograms, allOf (hasEntry ("bucket = 0.0", 0), hasEntry ("bucket = 2.0E8", 1), hasEntry ("bucket = 4.0E8", 1), hasEntry ("bucket = Infinity ", 3)));

5. Spojivá

Mikrometer má viac vstavaných spojovacích prostriedkov na sledovanie JVM, kešiek, ExecutorService a ťažobné služby.

Pokiaľ ide o JVM a monitorovanie systému, môžeme monitorovať metriky zavádzača tried (ClassLoaderMetrics), Pamäťová oblasť JVM (JvmMemoryMetrics) a metriky GC (JvmGcMetrics), využitie vlákna a CPU (JvmThreadMetrics, ProcessorMetrics).

Monitorovanie cache (v súčasnosti sú podporované iba Guava, EhCache, Hazelcast a Caffeine) je podporované prístrojovým vybavením s GuavaCacheMetrics, EhCache2Metrics, HazelcastCacheMetricsa CaffeineCacheMetrics. A na sledovanie služby spätného prihlásenia sa môžeme viazať LogbackMetrics do ľubovoľného platného registra:

new LogbackMetrics (). bind (register);

Použitie vyššie uvedených spojív je dosť podobné LogbackMetrics a sú dosť jednoduché, takže sa tu nebudeme venovať ďalším podrobnostiam.

6. Jarná integrácia

Spring Boot Actuator poskytuje správu závislostí a automatickú konfiguráciu mikrometra. Teraz je podporovaný v Spring Boot 2.0 / 1.xa Spring Framework 5.0 / 4.x.

Budeme potrebovať nasledujúcu závislosť (najnovšiu verziu nájdete tu):

 io.mikrometer mikrometer-pružina-dedičstvo 0,12.0. UVOĽNENIE 

Bez akejkoľvek ďalšej zmeny v existujúcom kóde sme povolili jarnú podporu mikrometra. Metriky pamäte JVM našej jarnej aplikácie sa automaticky zaregistrujú v globálnom registri a zverejnia sa do predvoleného koncového bodu atlasu: // localhost: 7101 / api / v1 / zverejniť.

Existuje niekoľko konfigurovateľných vlastností na riadenie správania pri exportovaní metrík, počnúc od spring.metrics.atlas. *. Skontrolujte AtlasConfig zobraziť celý zoznam konfiguračných vlastností pre publikovanie Atlas.

Ak potrebujeme viazať viac metrík, pridajte ich iba ako @Bean do kontextu aplikácie.

Povedzme, že potrebujeme JvmThreadMetrics:

@Bean JvmThreadMetrics threadMetrics () {vrátiť nový JvmThreadMetrics (); }

Čo sa týka webového monitorovania, je nakonfigurovaný automaticky pre každý koncový bod v našej aplikácii, dá sa však spravovať pomocou vlastnosti konfigurácie: spring.metrics.web.autoTimeServerRequests.

Predvolená implementácia poskytuje štyri dimenzie metrík pre koncové body: metóda požiadavky HTTP, kód odpovede HTTP, identifikátor URI koncového bodu a informácie o výnimkách.

Keď sú žiadosti odpovedané, metriky týkajúce sa metódy žiadosti (ZÍSKAJTE, POSTatď.) budú uverejnené v Atlase.

Pomocou rozhrania Atlas Graph API môžeme vygenerovať graf na porovnanie doby odozvy pre rôzne metódy:

V predvolenom nastavení sú kódy odpovedí 20x, 30x, 40x, 50x budú tiež hlásené:

Môžeme tiež porovnať rôzne identifikátory URI:

alebo skontrolujte metriky výnimiek:

Všimnite si, že môžeme tiež použiť @ Časované v triede radiča alebo v špecifických metódach koncových bodov na prispôsobenie značiek, dlhých úloh, kvantilov a percentilov metrík:

@RestController @Timed ("people") verejná trieda PeopleController {@GetMapping ("/ people") @Timed (value = "people.all", longTask = true) verejný zoznam listPeople () {// ...}}

Na základe vyššie uvedeného kódu uvidíme nasledujúce značky kontrolou koncového bodu Atlas // localhost: 7101 / api / v1 / tags / name:

["people", "people.all", "jvmBufferCount", ...]

Mikrometer tiež pracuje vo funkčnom webovom rámci predstavenom v Spring Boot 2.0. Metriky je možné povoliť filtrovaním Funkcia smerovača:

RouterFunctionMetrics metriky = nový RouterFunctionMetrics (register); RouterFunctions.route (...) .filter (metrics.timer ("server.requests"));

Môžu sa zhromažďovať aj metriky zo zdroja údajov a naplánované úlohy. Ďalšie informácie nájdete v oficiálnej dokumentácii.

7. Záver

V tomto článku sme predstavili metrický fasádny mikrometer. Vďaka abstrahovaniu a podpore viacerých monitorovacích systémov v rámci spoločnej sémantiky tento nástroj uľahčuje prepínanie medzi rôznymi monitorovacími platformami.

Celý implementačný kód tohto článku nájdete ako vždy na serveri Github.


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