Inleiding tot Dropwizard Metrics

1. Inleiding

Metrics is een Java-bibliotheek die meetinstrumenten biedt voor Java-toepassingen.

Het heeft verschillende modules, en in dit artikel zullen we de metrics-core module, metrics-healthchecks module, metrics-servlets module en metrics-servlet module uitwerken en de rest schetsen, ter referentie.

2. Module metrics-core

2.1. Afhankelijkheden van Maven

Om de metrics-core module, is er slechts één afhankelijkheid vereist die moet worden toegevoegd aan de pom.xml het dossier:

 io.dropwizard.metrics metrics-core 3.1.2 

En je kunt de laatste versie hier vinden.

2.2. MetricRegistry

Simpel gezegd, we gebruiken de MetricRegistry class om een ​​of meer metrieken te registreren.

We kunnen één metriekregister gebruiken voor al onze meetgegevens, maar als we verschillende rapportagemethoden voor verschillende meetwaarden willen gebruiken, kunnen we onze meetwaarden ook in groepen verdelen en voor elke groep verschillende meetregisters gebruiken.

Laten we een MetricRegistry nu:

MetricRegistry metricRegistry = nieuwe MetricRegistry ();

En dan kunnen we hiermee wat statistieken registreren MetricRegistry:

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

Er zijn twee basismanieren om een ​​nieuwe metriek te maken: er zelf een instantiëren of er een uit het metriekregister halen. Zoals u kunt zien, hebben we ze allebei in het bovenstaande voorbeeld gebruikt, we instantiëren de Meter object "meter1" en we krijgen er nog een Meter object "meter2" dat is gemaakt door de metricRegistry.

In een metriekregister heeft elke metriek een unieke naam, aangezien we hierboven "meter1" en "meter2" als metrische namen hebben gebruikt. MetricRegistry biedt ook een reeks statische hulpmethoden om ons te helpen de juiste metrieknamen te maken:

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

Als we een set metrische registers moeten beheren, kunnen we SharedMetricRegistries class, wat een singleton en thread-safe is. We kunnen er een metriekregister aan toevoegen, dit metriekregister eruit halen en het verwijderen:

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

3. Metrische concepten

De metrics-core-module biedt verschillende veelgebruikte metrische typen: Meter, Meter, Teller, Histogram en Timer, en Verslaggever om metrische waarden uit te voeren.

3.1. Meter

EEN Meter meet het aantal voorvallen van gebeurtenissen en de frequentie:

Meter meter = nieuwe meter (); lange initCount = meter.getCount (); assertThat (initCount, equalTo (0L)); meter.mark (); assertThat (meter.getCount (), equalTo (1L)); meter.mark (20); assertThat (meter.getCount (), equalTo (21L)); double meanRate = meter.getMeanRate (); dubbele oneMinRate = meter.getOneMinuteRate (); dubbele fiveMinRate = meter.getFiveMinuteRate (); dubbele vijftienMinRate = meter.getFifteenMinuteRate (); 

De getCount () methode geeft het aantal gebeurtenissen terug, en Mark() methode voegt 1 of n toe aan het aantal voorvallen van gebeurtenissen. De Meter object biedt vier tarieven die de gemiddelde tarieven voor het geheel vertegenwoordigen Meter levensduur, respectievelijk voor de laatste minuut, voor de afgelopen vijf minuten en voor het recente kwartaal.

3.2. Meter

Meter is een interface die simpelweg wordt gebruikt om een ​​bepaalde waarde te retourneren. De metrics-core-module biedt verschillende implementaties ervan: Verhoudingsmeter, CachedGauge, Afgeleide meter en JmxAttributeGauge.

Verhoudingsmeter is een abstracte klasse en meet de verhouding van de ene waarde tot de andere.

Laten we eens kijken hoe we het kunnen gebruiken. Eerst implementeren we een klasse AanwezigheidsratioGauge:

openbare klasse AttendanceRatioGauge breidt RatioGauge {privé int attendanceCount uit; privé int courseCount; @Override beschermde Ratio getRatio () {return Ratio.of (attendanceCount, courseCount); } // standaard constructeurs} 

En dan testen we het:

RatioGauge ratioGauge = nieuwe AttendanceRatioGauge (15, 20); assertThat (ratioGauge.getValue (), equalTo (0.75)); 

CachedGauge is een andere abstracte klasse die waarde kan cachen, daarom is het erg handig als de waarden duur zijn om te berekenen. Om het te gebruiken, moeten we een klasse implementeren ActiveUsersGauge:

openbare klasse ActiveUsersGauge breidt CachedGauge uit {@Override beschermde lijst loadValue () {return getActiveUserCount (); } privélijst getActiveUserCount () {Lijstresultaat = nieuwe ArrayList (); result.add (12L); resultaat teruggeven; } // standaard constructeurs}

Vervolgens testen we het om te zien of het werkt zoals verwacht:

Meter activeUsersGauge = nieuwe ActiveUsersGauge (15, TimeUnit.MINUTES); Lijst verwacht = nieuwe ArrayList (); verwacht. toevoegen (12L); assertThat (activeUsersGauge.getValue (), equalTo (verwacht)); 

We stellen de vervaltijd van de cache in op 15 minuten bij het instantiëren van het ActiveUsersGauge.

Afgeleide meter is ook een abstracte klasse en stelt u in staat om een ​​waarde af te leiden uit andere Meter als zijn waarde.

Laten we naar een voorbeeld kijken:

public class ActiveUserCountGauge breidt DerivativeGauge uit {@Override protected Integer-transformatie (lijstwaarde) {return value.size (); } // standaard constructeurs}

Dit Meter ontleent zijn waarde aan een ActiveUsersGauge, dus we verwachten dat dit de waarde is van de grootte van de basislijst:

Meter activeUsersGauge = nieuwe ActiveUsersGauge (15, TimeUnit.MINUTES); Gauge activeUserCountGauge = nieuwe ActiveUserCountGauge (activeUsersGauge); assertThat (activeUserCountGauge.getValue (), equalTo (1)); 

JmxAttributeGauge wordt gebruikt wanneer we toegang moeten hebben tot de statistieken van andere bibliotheken die via JMX worden weergegeven.

3.3. Teller

De Teller wordt gebruikt voor het opnemen van verhogingen en verlagingen:

Teller teller = nieuwe teller (); lange 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 wordt gebruikt voor het bijhouden van een stream van Lang waarden en het analyseert hun statistische kenmerken zoals max, min, gemiddelde, mediaan, standaarddeviatie, 75e percentiel enzovoorts:

Histogram histogram = nieuw histogram (nieuw UniformReservoir ()); histogram.update (5); lange telling1 = 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); lange telling2 = 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 bemonstert de gegevens met behulp van reservoirbemonstering, en wanneer we instantiëren een Histogram object, moeten we het reservoir expliciet instellen.

Reservoir is een interface en metrics-core biedt vier implementaties ervan: ExponentieelDecayingReservoir, UniformReservoir, SlidingTimeWindowReservoir, SlidingWindowReservoir.

In het bovenstaande gedeelte hebben we vermeld dat een metriek ook kan worden gemaakt door MetricRegistry, naast het gebruik van een constructor. Wanneer we gebruiken metricRegistry.histogram (), het retourneert een Histogram bijvoorbeeld met ExponentieelDecayingReservoir implementatie.

3.5. Timer

Timer wordt gebruikt voor het bijhouden van meerdere tijdsduur die wordt weergegeven door Context objecten, en het biedt ook hun statistische gegevens:

Timer timer = nieuwe timer (); Timer.Context context1 = timer.time (); TimeUnit.SECONDS.sleep (5); long elapsed1 = context1.stop (); assertEquals (5000000000L, elapsed1, 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. Verslaggever

Als we onze metingen moeten uitvoeren, kunnen we gebruiken Verslaggever. Dit is een interface en de metrics-core-module biedt verschillende implementaties ervan, zoals ConsoleReporter, CsvReporter, Slf4jReporter, JmxReporter enzovoorts.

Hier gebruiken we ConsoleReporter als voorbeeld:

MetricRegistry metricRegistry = nieuwe MetricRegistry (); Meter meter = metricRegistry.meter ("meter"); meter.mark (); meter.mark (200); Histogram histogram = metricRegistry.histogram ("histogram"); histogram.update (12); histogram.update (17); Teller counter = metricRegistry.counter ("teller"); counter.inc (); counter.dec (); ConsoleReporter reporter = ConsoleReporter.forRegistry (metricRegistry) .build (); reporter.start (5, TimeUnit.MICROSECONDS); reporter.report (); 

Hier is de voorbeelduitvoer van het ConsoleReporter:

- Histogrammen ----------------------------------------------- ------------------- aantal histogrammen = 2 min = 12 max = 17 gemiddeld = 14,50 stddev = 2,50 mediaan = 17,00 75% <= 17,00 95% <= 17,00 98% <= 17,00 99% <= 17,00 99,9% <= 17,00 - Meter ---------------------------------- ------------------------------------ Metertelling = 201 gemiddelde snelheid = 1756,87 gebeurtenissen / seconde 1 minuut tarief = 0,00 gebeurtenissen / seconde 5-minuten tarief = 0,00 gebeurtenissen / seconde 15-minuten tarief = 0,00 gebeurtenissen / seconde 

4. Module metrics-healthchecks

Metrics heeft een extensie metrics-healthchecks module voor het omgaan met health checks.

4.1. Afhankelijkheden van Maven

Om de metrics-healthchecks-module te gebruiken, moeten we deze afhankelijkheid toevoegen aan het pom.xml het dossier:

 io.dropwizard.metrics metrics-healthchecks 3.1.2 

En je kunt de laatste versie hier vinden.

4.2. Gebruik

Ten eerste hebben we verschillende klassen nodig die verantwoordelijk zijn voor specifieke health check-bewerkingen, en deze klassen moeten worden geïmplementeerd Gezondheids controle.

We gebruiken bijvoorbeeld DatabaseHealthCheck en UserCenterHealthCheck:

openbare klasse DatabaseHealthCheck breidt HealthCheck uit {@Override beschermd Result check () genereert Uitzondering {return Result.healthy (); }} 
openbare klasse UserCenterHealthCheck breidt HealthCheck uit {@Override beschermd Result check () genereert Uitzondering {return Result.healthy (); }} 

Dan hebben we een HealthCheckRegistry (dat is net als MetricRegistry) en registreer het DatabaseHealthCheck en UserCenterHealthCheck ermee:

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

We kunnen het Gezondheids controle:

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

We kunnen alle Gezondheids controle gevallen:

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

Ten slotte kunnen we een specifiek Gezondheids controle voorbeeld:

healthCheckRegistry.runHealthCheck ("db"); 

5. Module metrics-servlets

Metrics biedt ons een handvol handige servlets waarmee we via HTTP-verzoeken toegang hebben tot metrische gegevens.

5.1. Afhankelijkheden van Maven

Om de metrics-servlets-module te gebruiken, moeten we deze afhankelijkheid toevoegen aan de pom.xml het dossier:

 io.dropwizard.metrics metrics-servlets 3.1.2 

En je kunt de laatste versie hier vinden.

5.2. HealthCheckServlet Gebruik

HealthCheckServlet biedt resultaten van gezondheidscontrole. Eerst moeten we een ServletContextListener die onze blootstelt HealthCheckRegistry:

openbare klasse MyHealthCheckServletContextListener breidt HealthCheckServlet.ContextListener uit {openbare statische HealthCheckRegistry HEALTH_CHECK_REGISTRY = nieuwe HealthCheckRegistry (); statische {HEALTH_CHECK_REGISTRY.register ("db", nieuwe DatabaseHealthCheck ()); } @Override beschermde HealthCheckRegistry getHealthCheckRegistry () {return HEALTH_CHECK_REGISTRY; }} 

Vervolgens voegen we zowel deze luisteraar als HealthCheckServlet in de web.xml het dossier:

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

Nu kunnen we de webapplicatie starten en een GET-verzoek sturen naar "// localhost: 8080 / healthcheck" om de resultaten van de gezondheidscontrole te krijgen. Het antwoord zou als volgt moeten zijn:

{"db": {"gezond": true}}

5.3. ThreadDumpServlet Gebruik

ThreadDumpServlet biedt informatie over alle live threads in de JVM, hun status, hun stacktraces en de status van eventuele vergrendelingen waarop ze mogelijk wachten.

Als we het willen gebruiken, hoeven we deze alleen maar toe te voegen aan het web.xml het dossier:

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

Threaddump-gegevens zullen beschikbaar zijn op “// localhost: 8080 / threaddump”.

5.4. PingServlet Gebruik

PingServlet kan worden gebruikt om te testen of de applicatie actief is. We voegen deze toe aan het web.xml het dossier:

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

En stuur dan een GET-verzoek naar "// localhost: 8080 / ping". De statuscode van het antwoord is 200 en de inhoud is "pong".

5.5. MetricsServlet Gebruik

MetricsServlet levert metrische gegevens. Eerst moeten we een ServletContextListener die onze blootstelt MetricRegistry:

openbare klasse MyMetricsServletContextListener breidt MetricsServlet.ContextListener {privé statisch MetricRegistry METRIC_REGISTRY = nieuwe MetricRegistry (); statische {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 beschermd MetricRegistry getMetricRegistry () {return METRIC_REGISTRY; }} 

Zowel deze luisteraar als MetricsServlet moeten worden toegevoegd aan web.xml:

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

Dit wordt weergegeven in onze webapplicatie op "// localhost: 8080 / metrics". Het antwoord moet verschillende metrische gegevens bevatten:

{"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 Gebruik

AdminServlet aggregaten HealthCheckServlet, ThreadDumpServlet, MetricsServlet, en PingServlet.

Laten we deze toevoegen aan het web.xml:

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

Het is nu toegankelijk via "// localhost: 8080 / admin". We krijgen een pagina met vier links, één voor elk van die vier servlets.

Houd er rekening mee dat als we een gezondheidscontrole willen uitvoeren en toegang willen krijgen tot metrische gegevens, deze twee luisteraars nog steeds nodig zijn.

6. Module metrics-servlet

De metrics-servlet module biedt een Filter die verschillende statistieken heeft: meters voor statuscodes, een teller voor het aantal actieve verzoeken en een timer voor de duur van het verzoek.

6.1. Afhankelijkheden van Maven

Om deze module te gebruiken, moeten we eerst de afhankelijkheid toevoegen aan het pom.xml:

 io.dropwizard.metrics metrics-servlet 3.1.2 

En je kunt de laatste versie hier vinden.

6.2. Gebruik

Om het te gebruiken, moeten we een ServletContextListener die onze blootstelt MetricRegistry naar de InstrumentedFilter:

openbare klasse MyInstrumentedFilterContextListener breidt InstrumentedFilterContextListener uit {openbare statische MetricRegistry REGISTRY = nieuwe MetricRegistry (); @Override beschermd MetricRegistry getMetricRegistry () {return REGISTRY; }} 

Vervolgens voegen we deze toe aan het web.xml:

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

Nu de InstrumentedFilter kan werken. Als we toegang willen hebben tot de metrische gegevens, kunnen we dit doen via het MetricRegistryREGISTREREN.

7. Andere modules

Behalve de modules die we hierboven hebben geïntroduceerd, heeft Metrics enkele andere modules voor verschillende doeleinden:

  • metrics-jvm: biedt verschillende nuttige statistieken voor het instrumenteren van JVM-internals
  • metrics-ehcache: biedt InstrumentedEhcache, een decorateur voor Ehcache-caches
  • metrics-httpclient: biedt klassen voor het instrumenteren van Apache HttpClient (4.x-versie)
  • metrics-log4j: biedt InstrumentedAppender, een Log4j Appender implementatie voor log4j 1.x die de snelheid van geregistreerde gebeurtenissen registreert op basis van hun registratieniveau
  • metrics-log4j2: is vergelijkbaar met metrics-log4j, alleen voor log4j 2.x
  • metrics-logback: biedt InstrumentedAppender, een Logback Appender implementatie die de snelheid van geregistreerde gebeurtenissen registreert op basis van hun registratieniveau
  • metrics-json: biedt HealthCheckModule en MetricsModule voor Jackson

Wat meer is, behalve deze hoofdprojectmodules, bieden sommige andere bibliotheken van derden integratie met andere bibliotheken en frameworks.

8. Conclusie

Instrumentatietoepassingen zijn een veel voorkomende vereiste, dus in dit artikel hebben we Metrics geïntroduceerd, in de hoop dat dit u kan helpen bij het oplossen van uw probleem.

Zoals altijd is de volledige broncode voor het voorbeeld beschikbaar op GitHub.


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