Úvod do metriky Dropwizard

1. Úvod

Metrics je knižnica Java, ktorá poskytuje meracie prístroje pre aplikácie Java.

Má niekoľko modulov a v tomto článku pre vašu referenciu vypracujeme modul metriky - jadro, modul metriky - zdravotné kontroly, modul metriky - servlety a modul metriky - servlet a zvyšok načrtneme.

2. Modul metrika-jadro

2.1. Maven závislosti

Ak chcete použiť metrika-jadro je iba jedna závislosť, ktorú je potrebné pridať do pom.xml spis:

 io.dropwizard.metrics metriky - jadro 3.1.2 

A jeho najnovšiu verziu nájdete tu.

2.2. Metrická registrácia

Jednoducho povedané, použijeme Metrická registrácia triedy na registráciu jednej alebo viacerých metrík.

Pre všetky naše metriky môžeme použiť jeden register metrík, ale ak chceme pre rôzne metriky použiť rôzne metódy vykazovania, môžeme tiež rozdeliť naše metriky do skupín a pre každú skupinu použiť rôzne registre metrík.

Vytvorme a Metrická registrácia teraz:

MetricRegistry metricRegistry = nový MetricRegistry ();

A potom s tým môžeme zaregistrovať niektoré metriky Metrická registrácia:

Merač meter1 = nový meter (); metricRegistry.register ("meter1", meter1); Merač meter2 = metricRegistry.meter ("meter2"); 

Existujú dva základné spôsoby, ako vytvoriť novú metriku: vytvoriť si jednu inštanciu sami alebo ju získať z metrického registra. Ako vidíte, vo vyššie uvedenom príklade sme použili obidve z nich, vytvárame inštancie Merač objekt „meter1“ a dostávame ďalší Merač objekt „meter2“, ktorý je vytvorený metrickýRegister.

V metrickom registri má každá metrika jedinečný názov, pretože ako názvy metrík sme vyššie použili metre „meter1“ a „meter2“. Metrická registrácia tiež poskytuje sadu statických pomocných metód, ktoré nám pomáhajú vytvárať správne metrické názvy:

Názov reťazca1 = MetricRegistry.name (Filter.class, "request", "count"); Reťazec name2 = MetricRegistry.name ("CustomFilter", "response", "count"); 

Ak potrebujeme spravovať množinu metrických registrov, môžeme použiť SharedMetricRegistries triedy, ktorá je jednotná a bezpečná pre vlákna. Môžeme doň pridať metrický register, načítať z neho tento metrický register a odstrániť ho:

SharedMetricRegistries.add ("predvolené", metricRegistry); MetricRegistry retrievedMetricRegistry = SharedMetricRegistries.getOrCreate ("predvolené"); SharedMetricRegistries.remove ("predvolené"); 

3. Koncepty metrík

Modul metriky-jadro poskytuje niekoľko bežne používaných typov metrík: Merač, Ukazovateľ, Počítadlo, Histogram a Časovača Reportér na výstup hodnôt metrík.

3.1. Merač

A Merač meria počet a mieru výskytu udalostí:

Merač = nový merač (); long initCount = meter.getCount (); assertThat (initCount, equalTo (0L)); značka metra (); assertThat (meter.getCount (), equalTo (1L)); značka metra (20); assertThat (meter.getCount (), equalTo (21L)); double meanRate = meter.getMeanRate (); dvojitá oneMinRate = meter.getOneMinuteRate (); double fiveMinRate = meter.getFiveMinuteRate (); double fifteenMinRate = meter.getFifteenMinuteRate (); 

The getCount () metóda vracia počet výskytov udalostí a značka () metóda pridá 1 alebo n k počtu výskytov udalostí. The Merač objekt poskytuje štyri sadzby, ktoré predstavujú priemerné sadzby pre celok Merač životnosť za poslednú minútu, za posledných päť minút a za posledný štvrťrok.

3.2. Ukazovateľ

Ukazovateľ je rozhranie, ktoré sa jednoducho používa na vrátenie konkrétnej hodnoty. Modul metriky-jadro poskytuje niekoľko jeho implementácií: RatioGauge, CachedGauge, DerivativeGauge a JmxAttributeGauge.

RatioGauge je abstraktná trieda a meria pomer jednej hodnoty k druhej.

Pozrime sa, ako to využiť. Najskôr implementujeme triedu AttendanceRatioGauge:

public class AttendanceRatioGauge rozširuje RatioGauge {private int attendanceCount; private int courseCount; @ Override protected Ratio getRatio () {return Ratio.of (attendanceCount, courseCount); } // štandardné konštruktory} 

A potom to otestujeme:

RatioGauge ratioGauge = nový AttendanceRatioGauge (15, 20); assertThat (ratioGauge.getValue (), equalTo (0,75)); 

CachedGauge je ďalšia abstraktná trieda, ktorá dokáže ukladať hodnoty do medzipamäte, preto je celkom užitočné, keď sú ich hodnoty nákladné. Aby sme to mohli použiť, musíme implementovať triedu ActiveUsersGauge:

public class ActiveUsersGauge rozširuje CachedGauge {@Override chránený zoznam loadValue () {return getActiveUserCount (); } private List getActiveUserCount () {List result = new ArrayList (); result.add (12L); návratový výsledok; } // štandardné konštruktory}

Potom ho otestujeme, aby sme zistili, či funguje podľa očakávaní:

Ukazovateľ activeUsersGauge = nový ActiveUsersGauge (15, TimeUnit.MINUTES); Očakávaný zoznam = nový ArrayList (); očakávaný.pridat (12 l); assertThat (activeUsersGauge.getValue (), equalTo (očakávané)); 

Pri vytváraní inštancie sme nastavili čas vypršania platnosti cache na 15 minút ActiveUsersGauge.

DerivativeGauge je tiež abstraktná trieda a umožňuje vám odvodiť hodnotu od ostatných Ukazovateľ ako jeho hodnota.

Pozrime sa na príklad:

verejná trieda ActiveUserCountGauge rozširuje DerivativeGauge {@Override chránená celočíselná transformácia (hodnota v zozname) {return value.size (); } // štandardné konštruktory}

Toto Ukazovateľ odvodzuje svoju hodnotu od ActiveUsersGauge, takže očakávame, že to bude hodnota z veľkosti základného zoznamu:

Ukazovateľ activeUsersGauge = nový ActiveUsersGauge (15, TimeUnit.MINUTES); Gauge activeUserCountGauge = nový ActiveUserCountGauge (activeUsersGauge); assertThat (activeUserCountGauge.getValue (), equalTo (1)); 

JmxAttributeGauge sa používa, keď potrebujeme prístup k metrikám iných knižníc vystaveným prostredníctvom JMX.

3.3. Počítadlo

The Počítadlo sa používa na zaznamenávanie prírastkov a dekrementácií:

Počítadlo počítadla = nový Počítadlo (); long initCount = counter.getCount (); assertThat (initCount, equalTo (0L)); counter.inc (); assertThat (counter.getCount (), equalTo (1L)); counter.inc (11); assertThat (counter.getCount (), equalTo (12L)); counter.dec (); assertThat (counter.getCount (), equalTo (11L)); counter.dec (6); assertThat (counter.getCount (), equalTo (5L));

3.4. Histogram

Histogram sa používa na sledovanie prúdu Dlhé hodnoty a analyzuje ich štatistické charakteristiky ako napr max, min, stredná hodnota, medián, štandardná odchýlka, 75. percentil a tak ďalej:

Histogramový histogram = nový histogram (nový UniformReservoir ()); histogram.update (5); long count1 = histogram.getCount (); assertThat (count1, equalTo (1L)); Snapshot snapshot1 = histogram.getSnapshot (); assertThat (snapshot1.getValues ​​(). length, equalTo (1)); assertThat (snapshot1.getValues ​​() [0], equalTo (5L)); histogram.update (20); long count2 = histogram.getCount (); assertThat (count2, equalTo (2L)); Snapshot snapshot2 = histogram.getSnapshot (); assertThat (snapshot2.getValues ​​(). length, equalTo (2)); assertThat (snapshot2.getValues ​​() [1], equalTo (20L)); assertThat (snapshot2.getMax (), equalTo (20L)); assertThat (snapshot2.getMean (), equalTo (12.5)); assertEquals (10.6, snapshot2.getStdDev (), 0,1); assertThat (snapshot2.get75thPercentile (), equalTo (20.0)); assertThat (snapshot2.get999thPercentile (), equalTo (20.0)); 

Histogram vzorkuje údaje pomocou vzorkovania zásobníka a keď vytvoríme inštanciu a Histogram objekt, musíme výslovne nastaviť jeho rezervoár.

Priehrada je rozhranie a metriky-jadro poskytuje štyri ich implementácie: Nádrž ExponentiallyDecayingReservoir, Jednotná nádrž, SlidingTimeWindowReservoir, Rezervná nádrž SlidingWindow.

V časti vyššie sme spomenuli, že metriku môže vytvoriť aj server Metrický register, okrem použitia konštruktora. Keď použijeme metricRegistry.histogram (), vráti a Histogram napríklad s ExponentiallyDecayingReservoir implementácia.

3.5. Časovač

Časovač sa používa na sledovanie viacerých časovaní časovania, ktoré sú reprezentované symbolom Kontext objekty a tiež poskytuje ich štatistické údaje:

Časovač časovača = nový Časovač (); Timer.Context context1 = timer.time (); TimeUnit.SECONDS.sleep (5); dlho uplynul1 = context1.stop (); assertEquals (5000000000L, uplynulo1, 10 00000); assertThat (timer.getCount (), equalTo (1L)); assertEquals (0.2, timer.getMeanRate (), 0,1); Timer.Context context2 = timer.time (); TimeUnit.SECONDS.sleep (2); context2.close (); assertThat (timer.getCount (), equalTo (2L)); assertEquals (0,3, timer.getMeanRate (), 0,1); 

3.6. Reportér

Keď potrebujeme na výstup z našich meraní, môžeme použiť Reportér. Toto je rozhranie a modul metrics-core poskytuje niekoľko jeho implementácií, ako napr ConsoleReporter, CsvReporter, Slf4jReporter, JmxReporter a tak ďalej.

Tu používame ConsoleReporter ako príklad:

MetricRegistry metricRegistry = nový MetricRegistry (); Merač meter = metricRegistry.meter ("meter"); značka metra (); značka metra (200); Histogram histogram = metricRegistry.histogram ("histogram"); histogram.update (12); histogram.update (17); Počítadlo počítadla = metricRegistry.counter ("počítadlo"); counter.inc (); counter.dec (); Reportér ConsoleReporter = ConsoleReporter.forRegistry (metricRegistry) .build (); reporter.start (5, TimeUnit.MICROSECONDS); reportér.report (); 

Tu je ukážka výstupu súboru ConsoleReporter:

- Histogramy ----------------------------------------------- ------------------- počet histogramov = 2 min = 12 max = 17 priemer = 14,50 stddev = 2,50 medián = 17,00 75% <= 17,00 95% <= 17,00 98% <= 17,00 99% <= 17,00 99,9% <= 17,00 - Merače ---------------------------------- ------------------------------------ počet metrov = 201 priemerná rýchlosť = 1756,87 udalostí / s 1 minúta rýchlosť = 0,00 udalostí / s 5-minútová rýchlosť = 0,00 udalostí / s 15-minútová rýchlosť = 0,00 udalostí / s 

4. Modul metriky-zdravotné kontroly

Metrika má rozšírený modul metriky-zdravotné kontroly pre kontrolu stavu.

4.1. Maven závislosti

Ak chcete použiť modul metrics-healthchecks, musíme túto závislosť pridať do pom.xml spis:

 io.dropwizard.metrics metriky-zdravotné kontroly 3.1.2 

A jeho najnovšiu verziu nájdete tu.

4.2. Využitie

Najprv potrebujeme niekoľko tried, ktoré sú zodpovedné za konkrétne operácie kontroly stavu, a tieto triedy musia byť implementované Kontrola zdravia.

Napríklad používame DatabaseHealthCheck a UserCenterHealthCheck:

verejná trieda DatabaseHealthCheck rozširuje HealthCheck {@Override chránený Výsledok check () vyvolá Výnimku {návrat Result.healthy (); }} 
verejná trieda UserCenterHealthCheck rozširuje HealthCheck {@Override chránený Výsledok check () vyvolá Výnimku {návrat Result.healthy (); }} 

Potom potrebujeme a HealthCheckRegistry (čo je ako Metrická registrácia) a zaregistrujte DatabaseHealthCheck a UserCenterHealthCheck s tým:

HealthCheckRegistry healthCheckRegistry = nový HealthCheckRegistry (); healthCheckRegistry.register ("db", nová DatabaseHealthCheck ()); healthCheckRegistry.register ("uc", nový UserCenterHealthCheck ()); assertThat (healthCheckRegistry.getNames (). size (), equalTo (2)); 

Môžeme tiež zrušiť registráciu Kontrola zdravia:

healthCheckRegistry.unregister ("uc"); assertThat (healthCheckRegistry.getNames (). size (), equalTo (1)); 

Môžeme spustiť všetky Kontrola zdravia prípady:

Výsledky na mape = healthCheckRegistry.runHealthChecks (); pre (položka Map.Entry: results.entrySet ()) {assertThat (entry.getValue (). isHealthy (), equalTo (true)); } 

Nakoniec môžeme spustiť konkrétny Kontrola zdravia inštancia:

healthCheckRegistry.runHealthCheck ("db"); 

5. Modul metriky-servlety

Metriky nám poskytujú niekoľko užitočných servletov, ktoré nám umožňujú prístup k údajom súvisiacim s metrikami prostredníctvom požiadaviek HTTP.

5.1. Maven závislosti

Aby sme mohli používať modul metrics-servlets, musíme túto závislosť pridať do pom.xml spis:

 io.dropwizard.metrics metriky-servlety 3.1.2 

A jeho najnovšiu verziu nájdete tu.

5.2. HealthCheckServlet Využitie

HealthCheckServlet poskytuje výsledky kontroly zdravotného stavu. Najprv musíme vytvoriť a ServletContextListener ktorý odhaľuje naše HealthCheckRegistry:

verejná trieda MyHealthCheckServletContextListener rozširuje HealthCheckServlet.ContextListener {public static HealthCheckRegistry HEALTH_CHECK_REGISTRY = nový HealthCheckRegistry (); static {HEALTH_CHECK_REGISTRY.register ("db", nová DatabaseHealthCheck ()); } @Override chránený HealthCheckRegistry getHealthCheckRegistry () {návrat HEALTH_CHECK_REGISTRY; }} 

Potom pridáme aj tohto poslucháča, aj HealthCheckServlet do web.xml spis:

 com.baeldung.metrics.servlets.MyHealthCheckServletContextListener healthCheck com.codahale.metrics.servlets.HealthCheckServlet healthCheck / healthcheck 

Teraz môžeme spustiť webovú aplikáciu a poslať požiadavku GET na „// localhost: 8080 / healthcheck“, aby sme získali výsledky kontroly stavu. Jeho reakcia by mala byť nasledovná:

{"db": {"healthy": true}}

5.3. ThreadDumpServlet Využitie

ThreadDumpServlet poskytuje informácie o všetkých živých vláknach v JVM, ich stavoch, stopách zásobníka a stave všetkých zámkov, na ktoré môžu čakať.

Ak ho chceme použiť, jednoducho ich musíme pridať do web.xml spis:

 threadDump com.codahale.metrics.servlets.ThreadDumpServlet threadDump / threaddump 

Údaje o výpise vlákien budú k dispozícii na adrese „// localhost: 8080 / threaddump“.

5.4. PingServlet Využitie

PingServlet možno použiť na otestovanie, či je aplikácia spustená. Tieto pridáme do web.xml spis:

 ping com.codahale.metrics.servlets.PingServlet ping / ping 

A potom pošlite požiadavku GET na „// localhost: 8080 / ping“. Stavový kód odpovede je 200 a jej obsah je „pong“.

5.5. MetricsServlet Využitie

MetricsServlet poskytuje metrické údaje. Najprv musíme vytvoriť a ServletContextListener ktorý odhaľuje naše Metrická registrácia:

verejná trieda MyMetricsServletContextListener rozširuje MetricsServlet.ContextListener {súkromná statická MetricRegistry METRIC_REGISTRY = nová MetricRegistry (); static {Counter counter = METRIC_REGISTRY.counter ("m01-counter"); counter.inc (); Histogram histogram = METRIC_REGISTRY.histogram ("m02-histogram"); histogram.update (5); histogram.update (20); histogram.update (100); } @ Override protected MetricRegistry getMetricRegistry () {return METRIC_REGISTRY; }} 

Tento poslucháč aj MetricsServlet je potrebné pridať do web.xml:

 metriky com.codahale.metrics.servlets.MyMetricsServletContextListener metriky / metriky com.codahale.metrics.servlets.MetricsServlet 

Toto bude vystavené v našej webovej aplikácii na adrese „// localhost: 8080 / metrics“. Jeho odpoveď by mala obsahovať rôzne údaje metrík:

{"version": "3.0.0", "gauges": {}, "counters": {"m01-counter": {"count": 1}}, "histograms": {"m02-histogram": { „count“: 3, „max“: 100, „mean“: 41,66666666666666, „min“: 5, „p50“: 20, „p75“: 100, „p95“: 100, „p98“: 100, „p99 ": 100," p999 ": 100," stddev ": 41.69998667732268}}," meters ": {}," timers ": {}} 

5.6. AdminServlet Využitie

AdminServlet agregáty HealthCheckServlet, ThreadDumpServlet, MetricsServleta PingServlet.

Pridajme tieto do web.xml:

 admin com.codahale.metrics.servlets.AdminServlet admin / admin / * 

Teraz je k nemu prístup na adrese „// localhost: 8080 / admin“. Dostaneme stránku obsahujúcu štyri odkazy, jeden pre každý z týchto štyroch servletov.

Upozorňujeme, že ak chceme vykonať kontrolu stavu a prístup k údajom metrík, títo dvaja poslucháči sú stále potrební.

6. Modul metrika-servlet

The metrika-servlet modul poskytuje a Filtrovať ktorá má niekoľko metrík: merače stavových kódov, počítadlo počtu aktívnych požiadaviek a časovač trvania žiadosti.

6.1. Maven závislosti

Ak chcete použiť tento modul, najskôr do programu pridajme závislosť pom.xml:

 io.dropwizard.metrics metrics-servlet 3.1.2 

A jeho najnovšiu verziu nájdete tu.

6.2. Využitie

Aby sme ho mohli používať, musíme vytvoriť ServletContextListener ktorý odhaľuje naše Metrická registrácia do InstrumentedFilter:

public class MyInstrumentedFilterContextListener rozširuje InstrumentedFilterContextListener {public static MetricRegistry REGISTRY = new MetricRegistry (); @ Override protected MetricRegistry getMetricRegistry () {návrat REGISTRÁCIA; }} 

Potom ich pridáme do web.xml:

  com.baeldung.metrics.servlet.MyInstrumentedFilterContextListener instrumentFilter com.codahale.metrics.servlet.InstrumentedFilter instrumentFilter / * 

Teraz InstrumentedFilter môže fungovať. Ak chceme získať prístup k jej metrickým údajom, môžeme to urobiť prostredníctvom ich Metrická registráciaREGISTRÁCIA.

7. Ostatné moduly

Okrem modulov, ktoré sme predstavili vyššie, má Metrics niekoľko ďalších modulov na rôzne účely:

  • metriky-jvm: poskytuje niekoľko užitočných metrík na vybavenie vnútorných priestorov JVM
  • metrika-ehcache: poskytuje InstrumentedEhcache, maliar na kešky Ehcache
  • metrics-httpclient: poskytuje triedy pre prístrojové vybavenie Apache HttpClient (verzia 4.x)
  • metrics-log4j: poskytuje InstrumentedAppender, a Log4j Dodatok implementácia pre log4j 1.x, ktorá zaznamenáva rýchlosť zaznamenaných udalostí podľa ich úrovne protokolovania
  • metrics-log4j2: je podobné ako metrics-log4j, iba pre log4j 2.x.
  • metrické prihlásenie: poskytuje InstrumentedAppender, Logback Dodatok implementácia, ktorá zaznamenáva rýchlosť zaznamenaných udalostí podľa úrovne ich prihlásenia
  • metriky-json: poskytuje HealthCheckModule a MetricsModule pre Jacksona

A čo viac, okrem týchto hlavných projektových modulov, niektoré ďalšie knižnice tretích strán poskytujú integráciu s inými knižnicami a rámcami.

8. Záver

Prístrojové aplikácie sú bežnou požiadavkou, preto sme v tomto článku predstavili metriky v nádeji, že vám pomôžu vyriešiť váš problém.

Úplný zdrojový kód príkladu je ako vždy k dispozícii na serveri GitHub.


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