Uvod u metriku Dropwizarda

1. Uvod

Metrics je Java knjižnica koja nudi mjerne instrumente za Java programe.

Ima nekoliko modula, a u ovom ćemo članku razraditi metrics-core modul, metrics-healthchecks module, metrics-servlets module, and metrics-servlet module, a ostatak ćemo skicirati za vašu referencu.

2. Modul metrika-jezgra

2.1. Ovisnosti Mavena

Da biste koristili metrika-jezgra modul, potrebna je samo jedna ovisnost koju treba dodati u pom.xml datoteka:

 io.dropwizard.metrics metrics-core 3.1.2 

A njegovu najnoviju verziju možete pronaći ovdje.

2.2. MetricRegistry

Jednostavno rečeno, koristit ćemo MetricRegistry razred za registraciju jedne ili više metričkih vrijednosti.

Možemo koristiti jedan registar mjernih podataka za sve naše metrike, ali ako želimo koristiti različite metode izvještavanja za različite mjerne podatke, također možemo podijeliti svoje metrike u skupine i koristiti različite registre mjernih podataka za svaku skupinu.

Stvorimo a MetricRegistry sada:

MetricRegistry metricRegistry = novi MetricRegistry ();

A onda s tim možemo registrirati neke mjerne podatke MetricRegistry:

Metar metar1 = novi Metar (); metricRegistry.register ("metar1", metar1); Brojilo metar2 = metricRegistry.meter ("metar2"); 

Postoje dva osnovna načina stvaranja novog mjernog podatka: instanciranje vlastitog primjerka ili njegovo preuzimanje iz registra metričkih podataka. Kao što vidite, obojicu smo koristili u gornjem primjeru, instanciramo Metar objekt "metar1" i dobivamo drugi Metar objekt "metar2" koji kreira metricRegistry.

U registru metričkih podataka svaki metrički naziv ima jedinstveni naziv, jer smo gore koristili "meter1" i "meter2". MetricRegistry također pruža skup statičkih pomoćnih metoda koje nam pomažu u stvaranju vlastitih naziva mjernih podataka:

String name1 = MetricRegistry.name (Filter.class, "request", "count"); String name2 = MetricRegistry.name ("CustomFilter", "response", "count"); 

Ako trebamo upravljati skupom metričkih registara, možemo koristiti SharedMetricRegistries klase, koja je jednostruka i bez niti. U njega možemo dodati metrički registar, dohvatiti ovaj metrički registar iz njega i ukloniti ga:

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

3. Metrički koncepti

Jezgra metričkog jezgra pruža nekoliko često korištenih tipova metričkih podataka: Metar, Mjerač, Brojač, Histogram i Tajmer, i Reporter za izlaz vrijednosti mjernih podataka.

3.1. Metar

A Metar mjeri broj događaja i stopu događaja:

Metar brojilo = novi Metar (); long initCount = meter.getCount (); assertThat (initCount, jednakTo (0L)); metar.mark (); assertThat (meter.getCount (), jednakTo (1L)); metar.oznaka (20); assertThat (meter.getCount (), jednakTo (21L)); dvostruka srednja vrijednost = meter.getMeanRate (); udvostruči oneMinRate = meter.getOneMinuteRate (); dvostruko fiveMinRate = meter.getFiveMinuteRate (); dvostruko petnaestMinRate = metar.getFifteenMinuteRate (); 

The getCount () metoda vraća broj događaja događaja i ocjena() metoda dodaje 1 ili n u broj događaja. The Metar objekt pruža četiri stope koje predstavljaju prosječne stope za cjelinu Metar životni vijek, posljednjih jednu minutu, posljednjih pet minuta, odnosno posljednju četvrtinu.

3.2. Mjerač

Mjerač je sučelje koje se jednostavno koristi za vraćanje određene vrijednosti. Metrics-core modul pruža nekoliko njegovih implementacija: RatioGauge, CachedGauge, Derivativni mjerač i JmxAttributeGauge.

RatioGauge je apstraktna klasa i mjeri omjer jedne vrijednosti prema drugoj.

Pogledajmo kako ga koristiti. Prvo, implementiramo klasu Mjerilo omjera posjećenosti:

javna klasa AttendanceRatioGauge proširuje RatioGauge {private int atteanceCount; private int courseCount; @Override protected Ratio getRatio () {return Ratio.of (prisustvo, Zbroj, tečaj); } // standardni konstruktori} 

A onda ga testiramo:

RatioGauge ratioGauge = novi AttendanceRatioGauge (15, 20); assertThat (ratioGauge.getValue (), jednakTo (0,75)); 

CachedGauge je još jedna apstraktna klasa koja može predmemorirati vrijednost, stoga je vrlo korisno kada su vrijednosti skupe za izračunavanje. Da bismo je koristili, moramo implementirati klasu ActiveUsersGauge:

javna klasa ActiveUsersGauge proširuje CachedGauge {@Override zaštićeni popis loadValue () {return getActiveUserCount (); } privatni popis getActiveUserCount () {Rezultat popisa = novi ArrayList (); rezultat.doda (12L); povratni rezultat; } // standardni konstruktori}

Zatim ga testiramo kako bismo provjerili radi li prema očekivanjima:

Mjerač activeUsersGauge = novi ActiveUsersGauge (15, TimeUnit.MINUTES); Očekivani popis = novi ArrayList (); očekuje se.doda (12L); assertThat (activeUsersGauge.getValue (), jednakTo (očekuje se)); 

Vrijeme instalacije predmemorije postavili smo na 15 minuta prilikom instanciranja datoteke ActiveUsersGauge.

Derivativni mjerač je također apstraktna klasa i omogućuje vam izvođenje vrijednosti iz drugih Mjerač kao njegova vrijednost.

Pogledajmo primjer:

javna klasa ActiveUserCountGauge proširuje DerivativeGauge {@Override zaštićena cjelovita transformacija (vrijednost popisa) {return value.size (); } // standardni konstruktori}

Ovaj Mjerač izvodi svoju vrijednost iz an ActiveUsersGauge, pa očekujemo da će to biti vrijednost iz veličine osnovnog popisa:

Mjerač activeUsersGauge = novi ActiveUsersGauge (15, TimeUnit.MINUTES); Mjerač activeUserCountGauge = novi ActiveUserCountGauge (activeUsersGauge); assertThat (activeUserCountGauge.getValue (), jednakTo (1)); 

JmxAttributeGauge koristi se kada trebamo pristupiti mjernim podacima drugih knjižnica izloženih putem JMX-a.

3.3. Brojač

The Brojač koristi se za bilježenje povećanja i smanjenja:

Brojač brojača = novi brojač (); dugo initCount = brojač.getCount (); assertThat (initCount, jednakTo (0L)); brojač.inc (); assertThat (counter.getCount (), jednakTo (1L)); brojač.inc (11); assertThat (counter.getCount (), jednakTo (12L)); counter.dec (); assertThat (counter.getCount (), jednakTo (11L)); counter.dec (6); assertThat (counter.getCount (), jednakTo (5L));

3.4. Histogram

Histogram koristi se za praćenje toka Dugo vrijednosti i analizira njihove statističke karakteristike kao što su maks., min., srednja vrijednost, medijan, standardna devijacija, 75. percentil i tako dalje:

Histogram histogram = novi histogram (novi UniformReservoir ()); histogram.update (5); dugo brojanje1 = histogram.getCount (); assertThat (count1, jednakTo (1L)); Snapshot snapshot1 = histogram.getSnapshot (); assertThat (snapshot1.getValues ​​(). length, jednakTo (1)); assertThat (snapshot1.getValues ​​() [0], jednakTo (5L)); histogram.update (20); dugo brojanje2 = histogram.getCount (); assertThat (count2, jednakTo (2L)); Snapshot snapshot2 = histogram.getSnapshot (); assertThat (snapshot2.getValues ​​(). length, jednakTo (2)); assertThat (snapshot2.getValues ​​() [1], jednakTo (20L)); assertThat (snapshot2.getMax (), jednakTo (20L)); assertThat (snapshot2.getMean (), jednakTo (12.5)); assertEquals (10,6, snapshot2.getStdDev (), 0,1); assertThat (snapshot2.get75thPercentile (), jednakTo (20.0)); assertThat (snapshot2.get999thPercentile (), jednakTo (20.0)); 

Histogram uzorkuje podatke pomoću uzorkovanja iz ležišta, a kada instanciramo a Histogram objekt, moramo izričito postaviti njegov rezervoar.

Rezervoar je sučelje i metrička jezgra pruža ih četiri implementacije: Eksponencijalno propadajući rezervoar, UniformReservoir, SlidingTimeWindowReservoir, SlidingWindowReservoir.

U gornjem smo odjeljku spomenuli da metriku može stvoriti i MetricRegistry, osim korištenja konstruktora. Kad koristimo metricRegistry.histogram (), vraća a Histogram primjer s Eksponencijalno propadajući rezervoar provedba.

3.5. Tajmer

Tajmer koristi se za praćenje više vremenskih trajanja koja su predstavljena s Kontekst objekata, a također pruža i njihove statističke podatke:

Timer timer = novi Timer (); Timer.Context context1 = timer.time (); TimeUnit.SECONDS.sleep (5); dugo prošlo1 = context1.stop (); assertEquals (5000000000L, proteklo1, 1000000); assertThat (timer.getCount (), jednakTo (1L)); assertEquals (0,2, timer.getMeanRate (), 0,1); Timer.Context context2 = timer.time (); TimeUnit.SECONDS.sleep (2); context2.close (); assertThat (timer.getCount (), jednakTo (2L)); assertEquals (0,3, timer.getMeanRate (), 0,1); 

3.6. Reporter

Kad trebamo iznijeti svoja mjerenja, možemo koristiti Reporter. Ovo je sučelje, a metrics-core modul pruža nekoliko njegovih implementacija, kao što su ConsoleReporter, CsvReporter, Slf4jReporter, JmxReporter i tako dalje.

Ovdje koristimo ConsoleReporter kao primjer:

MetricRegistry metricRegistry = novi MetricRegistry (); Brojilo brojila = metricRegistry.meter ("metar"); metar.mark (); metar.oznaka (200); Histogram histogram = metricRegistry.histogram ("histogram"); histogram.update (12); histogram.update (17); Brojač brojača = metricRegistry.counter ("brojač"); brojač.inc (); counter.dec (); ConsoleReporter reporter = ConsoleReporter.forRegistry (metricRegistry) .build (); reporter.start (5, TimeUnit.MICROSECONDS); reporter.report (); 

Evo uzorka rezultata ConsoleReporter:

- Histogrami ----------------------------------------------- ------------------- broj histograma = 2 min = 12 max = 17 srednje = 14,50 stddev = 2,50 medijana = 17,00 75% <= 17,00 95% <= 17,00 98% <= 17,00 99% <= 17,00 99,9% <= 17,00 - Brojila ---------------------------------- ------------------------------------ Brojač brojila = 201 srednja brzina = 1756,87 događaja / sekundi 1-minuta stopa = 0,00 događaja / sekundi 5-minutna stopa = 0,00 događaja / sekundi 15-minutna stopa = 0,00 događaja / sekundi 

4. Modul metrike-zdravstvene provjere

Metrics ima proširenje metrics-healthchecks modul za bavljenje zdravstvenim provjerama.

4.1. Ovisnosti Mavena

Da bismo koristili modul metrics-healthchecks, moramo dodati ovu ovisnost u pom.xml datoteka:

 io.dropwizard.metrics metrics-healthchecks 3.1.2 

A njegovu najnoviju verziju možete pronaći ovdje.

4.2. Upotreba

Prvo, trebamo nekoliko klasa koje su odgovorne za određene operacije provjere zdravlja, a te klase moraju provoditi Provjera zdravlja.

Na primjer, koristimo DatabaseHealthCheck i UserCenterHealthCheck:

javna klasa DatabaseHealthCheck proširuje HealthCheck {@Override zaštićen Provjera rezultata () baca izuzetak {return Result.healthy (); }} 
javna klasa UserCenterHealthCheck proširuje HealthCheck {@Override zaštićen Provjera rezultata () baca izuzetak {return Result.healthy (); }} 

Zatim, trebamo HealthCheckRegistry (što je baš kao MetricRegistry) i registrirajte DatabaseHealthCheck i UserCenterHealthCheck s tim:

HealthCheckRegistry healthCheckRegistry = novi HealthCheckRegistry (); healthCheckRegistry.register ("db", novi DatabaseHealthCheck ()); healthCheckRegistry.register ("uc", novi UserCenterHealthCheck ()); assertThat (healthCheckRegistry.getNames (). size (), jednakTo (2)); 

Također možemo poništiti registraciju Provjera zdravlja:

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

Možemo pokrenuti sve Provjera zdravlja primjerci:

Rezultati mape = healthCheckRegistry.runHealthChecks (); for (Map.Entry entry: results.entrySet ()) {assertThat (entry.getValue (). isHealthy (), jednakTo (true)); } 

Napokon, možemo pokrenuti određenu Provjera zdravlja primjer:

healthCheckRegistry.runHealthCheck ("db"); 

5. Modul metrika-servleti

Metrika nam pruža pregršt korisnih servleta koji nam omogućuju pristup podacima povezanim s metrikom putem HTTP zahtjeva.

5.1. Ovisnosti Mavena

Da bismo koristili modul metrics-servlets, moramo dodati ovu ovisnost u pom.xml datoteka:

 io.dropwizard.metrics metrics-servlets 3.1.2 

A njegovu najnoviju verziju možete pronaći ovdje.

5.2. HealthCheckServlet Upotreba

HealthCheckServlet pruža rezultate zdravstvene provjere. Prvo, moramo stvoriti a ServletContextListener koja izlaže naše HealthCheckRegistry:

javna klasa MyHealthCheckServletContextListener proširuje HealthCheckServlet.ContextListener {public static HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry (); statička {HEALTH_CHECK_REGISTRY.register ("db", nova DatabaseHealthCheck ()); } @Override protected HealthCheckRegistry getHealthCheckRegistry () {return HEALTH_CHECK_REGISTRY; }} 

Zatim dodamo i ovog slušatelja i HealthCheckServlet u web.xml datoteka:

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

Sada možemo pokrenuti web aplikaciju i poslati GET zahtjev na “// localhost: 8080 / healthcheck” kako bismo dobili rezultate zdravstvene provjere. Njegov bi odgovor trebao biti ovakav:

{"db": {"zdravo": istina}}

5.3. ThreadDumpServlet Upotreba

ThreadDumpServlet pruža informacije o svim živim nitima u JVM-u, njihovim stanjima, njihovim tragovima stogova i stanju svih brava koje možda čekaju.

Ako ga želimo koristiti, jednostavno ih moramo dodati u web.xml datoteka:

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

Podaci o izvatku niti bit će dostupni na “// localhost: 8080 / threaddump”.

5.4. PingServlet Upotreba

PingServlet može se koristiti za testiranje radi li aplikacija. To dodajemo u web.xml datoteka:

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

A zatim pošaljite GET zahtjev na “// localhost: 8080 / ping”. Statusni kod odgovora je 200, a njegov sadržaj je "pong".

5.5. MetricsServlet Upotreba

MetricsServlet pruža metričke podatke. Prvo, moramo stvoriti a ServletContextListener koja izlaže naše MetricRegistry:

javna klasa MyMetricsServletContextListener proširuje MetricsServlet.ContextListener {privatni statički MetricRegistry METRIC_REGISTRY = novi MetricRegistry (); statički {Brojač brojača = METRIC_REGISTRY.counter ("m01-brojač"); brojač.inc (); Histogram histogram = METRIC_REGISTRY.histogram ("m02-histogram"); histogram.update (5); histogram.update (20); histogram.update (100); } @Override zaštićen MetricRegistry getMetricRegistry () {return METRIC_REGISTRY; }} 

I ovaj slušatelj i MetricsServlet treba dodati u web.xml:

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

To će biti izloženo u našoj web aplikaciji na “// localhost: 8080 / metrics”. Njegov bi odgovor trebao sadržavati razne metričke podatke:

{"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}}," metri ": {}," tajmeri ": {}} 

5.6. AdminServlet Upotreba

AdminServlet agregati HealthCheckServlet, ThreadDumpServlet, MetricsServlet, i PingServlet.

Dodajmo ih u web.xml:

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

Sada mu se može pristupiti na “// localhost: 8080 / admin”. Dobit ćemo stranicu koja sadrži četiri poveznice, po jednu za svaki od ta četiri servleta.

Imajte na umu da su, ako želimo provjeriti stanje i pristupiti podacima mjernih podataka, ta dva slušatelja i dalje potrebna.

6. Modul metrika-servlet

The metrika-servlet modul pruža a filtar koji ima nekoliko mjernih podataka: brojila za statusne kodove, brojač broja aktivnih zahtjeva i mjerač vremena trajanja zahtjeva.

6.1. Ovisnosti Mavena

Da bismo koristili ovaj modul, dodajmo prvo ovisnost u pom.xml:

 io.dropwizard.metrics metrics-servlet 3.1.2 

A njegovu najnoviju verziju možete pronaći ovdje.

6.2. Upotreba

Da bismo ga koristili, moramo stvoriti ServletContextListener koja izlaže naše MetricRegistry prema InstrumentedFilter:

javna klasa MyInstrumentedFilterContextListener proširuje InstrumentedFilterContextListener {javni statički MetricRegistry REGISTRY = novi MetricRegistry (); @Override protected MetricRegistry getMetricRegistry () {return REGISTRY; }} 

Zatim ih dodajemo u web.xml:

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

Sada InstrumentedFilter može raditi. Ako želimo pristupiti njegovim mjernim podacima, možemo to učiniti putem njegovih MetricRegistryREGISTAR.

7. Ostali moduli

Osim modula koje smo uveli gore, Metrics ima i neke druge module za različite svrhe:

  • metrika-jvm: pruža nekoliko korisnih mjernih podataka za izradu instrumenata JVM-a
  • metrika-ehcache: pruža InstrumentedEhcache, dekorator za Ehcache predmemorije
  • metrics-httpclient: nudi satove za instrumentaciju Apache HttpClient (verzija 4.x)
  • metrics-log4j: pruža InstrumentedAppender, Log4j Napadač implementacija za log4j 1.x koja bilježi stopu zabilježenih događaja prema njihovoj razini bilježenja
  • metrika-log4j2: sličan je metrics-log4j, samo za log4j 2.x
  • metrika-povratna evidencija: pruža InstrumentedAppender, povratna informacija Napadač implementacija koja bilježi stopu zabilježenih događaja prema njihovoj razini bilježenja
  • metrics-json: pruža HealthCheckModule i MetricsModule za Jacksona

Štoviše, osim ovih glavnih projektnih modula, neke druge biblioteke trećih strana pružaju integraciju s drugim knjižnicama i okvirima.

8. Zaključak

Instrumentacija aplikacija čest je zahtjev, pa smo u ovom članku predstavili Metrics, nadajući se da vam može pomoći u rješavanju vašeg problema.

Kao i uvijek, cjeloviti izvorni kod za primjer dostupan je na GitHub-u.


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