Introduktion til Dropwizard-metrics

1. Introduktion

Metrics er et Java-bibliotek, der leverer måleinstrumenter til Java-applikationer.

Det har flere moduler, og i denne artikel uddyber vi metrics-core-modul, metrics-healthchecks-modul, metrics-servlets-modul og metrics-servlet-modul og skitserer resten til din reference.

2. Modul metrics-core

2.1. Maven afhængigheder

At bruge metrics-core modul, er der kun en afhængighed, der skal tilføjes til pom.xml fil:

 io.dropwizard.metrics metrics-core 3.1.2 

Og du kan finde den nyeste version her.

2.2. Metrisk registrering

Kort sagt, vi bruger Metrisk registrering klasse for at registrere en eller flere målinger.

Vi kan bruge et metrics-register til alle vores metrics, men hvis vi vil bruge forskellige rapporteringsmetoder til forskellige metrics, kan vi også dele vores metrics i grupper og bruge forskellige metrics-registre for hver gruppe.

Lad os oprette en Metrisk registrering nu:

MetricRegistry metricRegistry = ny MetricRegistry ();

Og så kan vi registrere nogle metrics med dette Metrisk registrering:

Meter meter1 = ny Meter (); metricRegistry.register ("meter1", meter1); Meter meter2 = metricRegistry.meter ("meter2"); 

Der er to grundlæggende måder at oprette en ny metrik på: At starte en selv eller få en fra metrisk registreringsdatabasen. Som du kan se, brugte vi dem begge i eksemplet ovenfor, vi instantierer Måler objekt “meter1”, og vi får en anden Måler objekt "meter2", som er oprettet af metricRegistry.

I en metrisk registreringsdatabase har hver metric et unikt navn, da vi brugte "meter1" og "meter2" som metricnavne ovenfor. Metrisk registrering giver også et sæt statiske hjælpemetoder, der hjælper os med at oprette korrekte metriske navne:

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

Hvis vi har brug for at administrere et sæt metriske registre, kan vi bruge SharedMetricRegistries klasse, som er en singleton og trådsikker. Vi kan tilføje et metrisk register til det, hente dette metric-register fra det og fjerne det:

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

3. Metrics Concepts

Metrics-core-modulet indeholder flere almindeligt anvendte metrictyper: Måler, Målestok, Tæller, Histogram og Timerog Reporter til output-metrics-værdier.

3.1. Måler

EN Måler måler hændelsestællinger og hastighed:

Meter meter = ny Meter (); lang initCount = meter.getCount (); assertThat (initCount, equalTo (0L)); meter.mark (); assertThat (meter.getCount (), equalTo (1L)); meter.mark (20); assertThat (meter.getCount (), equalTo (21L)); dobbelt gennemsnitRate = meter.getMeanRate (); dobbelt oneMinRate = meter.getOneMinuteRate (); dobbelt fiveMinRate = meter.getFiveMinuteRate (); dobbelt femtenMinRate = meter.getFifteenMinuteRate (); 

Det getCount () metode returnerer hændelsestællinger, og mærke() metoden tilføjer 1 eller n til antallet af begivenheder. Det Måler objektet giver fire takster, der repræsenterer gennemsnitspriser for hele Måler levetid for henholdsvis det seneste minut, de seneste fem minutter og for det seneste kvartal.

3.2. Målestok

Målestok er en grænseflade, der simpelthen bruges til at returnere en bestemt værdi. Metrics-core-modulet giver flere implementeringer af det: RatioGauge, CachedGauge, Derivatmåler og JmxAttributeGauge.

RatioGauge er en abstrakt klasse, og den måler forholdet mellem en værdi og en anden.

Lad os se, hvordan vi bruger det. Først implementerer vi en klasse AttendanceRatioGauge:

offentlig klasse AttendanceRatioGauge udvider RatioGauge {private int attendanceCount; privat int kursusTælling; @ Override beskyttet forhold getRatio () {return Ratio.of (attendanceCount, courseCount); } // standardkonstruktører} 

Og så tester vi det:

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

CachedGauge er en anden abstrakt klasse, der kan cache værdi, derfor er det ret nyttigt, når værdierne er dyre at beregne. For at bruge det skal vi implementere en klasse ActiveUsersGauge:

offentlig klasse ActiveUsersGauge udvider CachedGauge {@ Override-beskyttet liste loadValue () {return getActiveUserCount (); } privat liste getActiveUserCount () {Listeresultat = ny ArrayList (); result.add (12L); returresultat } // standardkonstruktører}

Derefter tester vi det for at se, om det fungerer som forventet:

Målestok activeUsersGauge = ny ActiveUsersGauge (15, TimeUnit.MINUTES); Liste forventet = ny ArrayList (); forventet. tilføj (12L); assertThat (activeUsersGauge.getValue (), equalTo (forventet)); 

Vi indstiller cacheens udløbstid til 15 minutter, når vi aktiverer ActiveUsersGauge.

Derivatmåler er også en abstrakt klasse, og det giver dig mulighed for at udlede en værdi fra andre Målestok som sin værdi.

Lad os se på et eksempel:

offentlig klasse ActiveUserCountGauge udvider DerivativeGauge {@ Override-beskyttet heltalstransformation (listeværdi) {return value.size (); } // standardkonstruktører}

Det her Målestok henter sin værdi fra et ActiveUsersGauge, så vi forventer, at det er værdien fra baselistens størrelse:

Målestok activeUsersGauge = ny ActiveUsersGauge (15, TimeUnit.MINUTES); Gauge activeUserCountGauge = ny ActiveUserCountGauge (activeUsersGauge); assertThat (activeUserCountGauge.getValue (), equalTo (1)); 

JmxAttributeGauge bruges, når vi har brug for adgang til andre biblioteks metrics eksponeret via JMX.

3.3. Tæller

Det Tæller bruges til registrering af inkrementeringer og dekrementeringer:

Counter counter = new Counter (); lang 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 bruges til at holde styr på en strøm af Lang værdier, og det analyserer deres statistiske egenskaber såsom maks, min, middel, median, standardafvigelse, 75. percentil og så videre:

Histogram histogram = nyt histogram (nyt UniformReservoir ()); histogram. opdatering (5); lang count1 = histogram.getCount (); assertThat (count1, equalTo (1L)); Snapshot snapshot1 = histogram.getSnapshot (); assertThat (snapshot1.getValues ​​(). længde, lige til (1)); assertThat (snapshot1.getValues ​​() [0], equalTo (5L)); histogram. opdatering (20); lang count2 = histogram.getCount (); assertThat (count2, equalTo (2L)); Snapshot snapshot2 = histogram.getSnapshot (); assertThat (snapshot2.getValues ​​(). længde, lige til (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 prøver dataene ved hjælp af reservoirprøveudtagning, og når vi instantierer a Histogram objekt, er vi nødt til at indstille dets reservoir eksplicit.

Reservoir er en grænseflade, og metrics-core giver fire implementeringer af dem: Eksponentielt forfaldReservoir, UniformReservoir, SlidingTimeWindowReservoir, SlidingWindowReservoir.

I afsnittet ovenfor nævnte vi, at en metrik også kan oprettes af Metrisk registrering, udover at bruge en konstruktør. Når vi bruger metricRegistry.histogram (), det returnerer en Histogram eksempel med Eksponentielt forfaldReservoir implementering.

3.5. Timer

Timer bruges til at holde styr på flere timingvarigheder, der er repræsenteret af Sammenhæng objekter, og det giver også deres statistiske data:

Timer timer = ny Timer (); Timer.Context context1 = timer.time (); TimeUnit.SECONDS.sleep (5); lang forløbet1 = kontekst1.stop (); assertEquals (5000000000L, forløbet1, 1000000); 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. Reporter

Når vi har brug for at afgive vores målinger, kan vi bruge Reporter. Dette er en grænseflade, og metrics-core-modulet giver flere implementeringer af det, f.eks ConsoleReporter, CsvReporter, Slf4jReporter, JmxReporter og så videre.

Her bruger vi ConsoleReporter som et eksempel:

MetricRegistry metricRegistry = ny MetricRegistry (); Meter meter = metricRegistry.meter ("meter"); meter.mark (); meter.mark (200); Histogram histogram = metriskRegistry.histogram ("histogram"); histogram. opdatering (12); histogram. opdatering (17); Counter counter = metricRegistry.counter ("counter"); counter.inc (); counter.dec (); ConsoleReporter reporter = ConsoleReporter.forRegistry (metricRegistry) .build (); reporter.start (5, TimeUnit.MICROSECONDS); reporter.report (); 

Her er prøveoutputtet af ConsoleReporter:

- Histogrammer ------------------------------------------------------- ------------------- histogramantal = 2 min = 12 max = 17 middel = 14,50 stddev = 2,50 median = 17,00 75% <= 17,00 95% <= 17,00 98% <= 17,00 99% <= 17,00 99,9% <= 17,00 - Meter ---------------------------------- ------------------------------------ målerantal = 201 middelhastighed = 1756,87 hændelser / sekund 1 minut hastighed = 0,00 begivenheder / sekund 5-minutters hastighed = 0,00 begivenheder / sekund 15-minutters hastighed = 0,00 begivenheder / sekund 

4. Modul metrics-healthchecks

Metrics har et modul til udvidelse af metrics-healthchecks til håndtering af sundhedstjek.

4.1. Maven afhængigheder

For at bruge metrics-healthchecks-modulet er vi nødt til at tilføje denne afhængighed til pom.xml fil:

 io.dropwizard.metrics metrics-healthchecks 3.1.2 

Og du kan finde den nyeste version her.

4.2. Anvendelse

For det første har vi brug for flere klasser, der er ansvarlige for specifikke sundhedstjekoperationer, og disse klasser skal implementeres Sundhedstjek.

For eksempel bruger vi DatabaseHealthCheck og UserCenterHealthCheck:

offentlig klasse DatabaseHealthCheck udvider HealthCheck {@Override-beskyttet Resultatkontrol () kaster undtagelse {returner Resultat.healthy (); }} 
offentlig klasse UserCenterHealthCheck udvider HealthCheck {@Override-beskyttet Resultatkontrol () kaster undtagelse {returner Result.healthy (); }} 

Så har vi brug for en HealthCheckRegistry (hvilket er ligesom Metrisk registrering), og registrer DatabaseHealthCheck og UserCenterHealthCheck med det:

HealthCheckRegistry healthCheckRegistry = ny HealthCheckRegistry (); healthCheckRegistry.register ("db", ny DatabaseHealthCheck ()); healthCheckRegistry.register ("uc", ny UserCenterHealthCheck ()); assertThat (healthCheckRegistry.getNames (). størrelse (), equalTo (2)); 

Vi kan også afregistrere Sundhedstjek:

healthCheckRegistry.unregister ("uc"); assertThat (healthCheckRegistry.getNames (). størrelse (), equalTo (1)); 

Vi kan køre alle Sundhedstjek tilfælde:

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

Endelig kan vi køre en specifik Sundhedstjek eksempel:

healthCheckRegistry.runHealthCheck ("db"); 

5. Modul metrics-servlets

Metrics giver os en håndfuld nyttige servlets, der giver os adgang til metrics-relaterede data via HTTP-anmodninger.

5.1. Maven afhængigheder

For at bruge metrics-servlets-modulet skal vi føje denne afhængighed til pom.xml fil:

 io.dropwizard.metrics metrics-servlets 3.1.2 

Og du kan finde den nyeste version her.

5.2. HealthCheckServlet Anvendelse

HealthCheckServlet giver sundhedstjekresultater. Først skal vi oprette en ServletContextListener som udsætter vores HealthCheckRegistry:

offentlig klasse MyHealthCheckServletContextListener udvider HealthCheckServlet.ContextListener {offentlig statisk HealthCheckRegistry HEALTH_CHECK_REGISTRY = ny HealthCheckRegistry (); statisk {HEALTH_CHECK_REGISTRY.register ("db", ny DatabaseHealthCheck ()); } @ Override beskyttet HealthCheckRegistry getHealthCheckRegistry () {returner HEALTH_CHECK_REGISTRY; }} 

Derefter tilføjer vi både denne lytter og HealthCheckServlet ind i web.xml fil:

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

Nu kan vi starte webapplikationen og sende en GET-anmodning til “// localhost: 8080 / healthcheck” for at få sundhedstjekresultater. Dens svar skal være sådan:

{"db": {"sund": sand}}

5.3. ThreadDumpServlet Anvendelse

ThreadDumpServlet giver information om alle live-tråde i JVM, deres tilstande, deres stakspor og tilstanden af ​​alle låse, de måtte vente på.

Hvis vi vil bruge det, skal vi blot tilføje disse til web.xml fil:

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

Tråddumpdata vil være tilgængelige på “// localhost: 8080 / threaddump”.

5.4. PingServlet Anvendelse

PingServlet kan bruges til at teste, om applikationen kører. Vi tilføjer disse i web.xml fil:

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

Og send derefter en GET-anmodning til “// localhost: 8080 / ping”. Svarets statuskode er 200, og dens indhold er "pong".

5.5. MetricsServlet Anvendelse

MetricsServlet giver data om metrics. Først skal vi oprette en ServletContextListener som udsætter vores Metrisk registrering:

offentlig klasse MyMetricsServletContextListener udvider MetricsServlet.ContextListener {privat statisk MetricRegistry METRIC_REGISTRY = ny MetricRegistry (); statisk {Counter counter = METRIC_REGISTRY.counter ("m01-counter"); counter.inc (); Histogram histogram = METRIC_REGISTRY.histogram ("m02-histogram"); histogram. opdatering (5); histogram. opdatering (20); histogram. opdatering (100); } @ Override beskyttet MetricRegistry getMetricRegistry () {return METRIC_REGISTRY; }} 

Både denne lytter og MetricsServlet skal tilføjes til web.xml:

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

Dette vil blive eksponeret i vores webapplikation på “// localhost: 8080 / metrics”. Dens svar skal indeholde forskellige metrics-data:

{"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}}," meter ": {}," timers ": {}} 

5.6. AdminServlet Anvendelse

AdminServlet aggregater HealthCheckServlet, ThreadDumpServlet, MetricsServletog PingServlet.

Lad os tilføje disse til web.xml:

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

Den kan nu tilgås på “// localhost: 8080 / admin”. Vi får en side, der indeholder fire links, en til hver af disse fire servlets.

Bemærk, at disse to lyttere stadig er nødvendige, hvis vi ønsker at foretage sundhedstjek og få adgang til metrikdata.

6. Modul metrics-servlet

Det metrics-servlet modul giver en Filter som har flere metrics: målere for statuskoder, en tæller for antallet af aktive anmodninger og en timer for anmodningens varighed.

6.1. Maven afhængigheder

For at bruge dette modul, lad os først tilføje afhængighed i pom.xml:

 io.dropwizard.metrics metrics-servlet 3.1.2 

Og du kan finde den nyeste version her.

6.2. Anvendelse

For at bruge det skal vi oprette en ServletContextListener som udsætter vores Metrisk registrering til InstrumentedFilter:

offentlig klasse MyInstrumentedFilterContextListener udvider InstrumentedFilterContextListener {public static MetricRegistry REGISTRY = new MetricRegistry (); @ Override beskyttet MetricRegistry getMetricRegistry () {return REGISTRY; }} 

Derefter tilføjer vi disse i web.xml:

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

Nu er det InstrumentedFilter kan arbejde. Hvis vi ønsker at få adgang til dens metrics-data, kan vi gøre det gennem dens Metrisk registreringREGISTRERING.

7. Andre moduler

Bortset fra de moduler, vi introducerede ovenfor, har Metrics nogle andre moduler til forskellige formål:

  • metrics-jvm: indeholder flere nyttige målinger til instrumentering af JVM-interner
  • metrics-ehcache: giver InstrumentedEhcache, en dekoratør til Ehcache-cacher
  • metrics-httpclient: giver klasser til instrumentering af Apache HttpClient (4.x version)
  • metrics-log4j: giver InstrumentedAppender, en Log4j Appender implementering til log4j 1.x, der registrerer hastigheden af ​​loggede begivenheder efter deres logningsniveau
  • metrics-log4j2: ligner metrics-log4j, bare for log4j 2.x
  • metrics-logback: giver InstrumentedAppender, en Logback Appender implementering, der registrerer hastigheden af ​​loggede begivenheder efter deres logningsniveau
  • metrics-json: giver HealthCheckModule og MetricsModule for Jackson

Hvad mere er, bortset fra disse hovedprojektmoduler, tilbyder nogle andre tredjepartsbiblioteker integration med andre biblioteker og rammer.

8. Konklusion

Instrumentering af applikationer er et almindeligt krav, så i denne artikel introducerede vi Metrics i håb om, at det kan hjælpe dig med at løse dit problem.

Som altid er den komplette kildekode til eksemplet tilgængelig på GitHub.


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