In meinem Blog-Eintrag “Alles gesund? Health checking mit MicroProfile Health” habe ich dargestellt, wie einfach man den Gesundheitszustand einer Anwendung auf Basis von MicroProfile Health veröffentlichen kann. Und wenn man nun nicht nur wissen möchte, ob ein Service läuft, sondern mehr Details über den Service-Zustand erfahren möchte? Dann unterstützt uns ein weiterer Baustein: MicroProfile Metrics.
Telemetriedaten out of the box
Über den Rest-Endpoint /metrics/base
werden ohne weiteren Programmieraufwand Basis-Telemetriedaten zur Verfügung gestellt:
{ "memory.maxHeap": 8342470656, "memory.usedHeap": 259349504, "gc.G1 Young Generation.count": 28, "cpu.systemLoadAverage": 0.6, "thread.count": 111, ... }
Die Daten werden in JSON geliefert, wenn man sie mit diesem Media Type anfordert (z. B. curl -H "Accept: application/json" localhost:8080/metrics/base
). Mit dem Default-Media-Type text/plain
werden die Daten passend für die Verarbeitung in Prometheus geliefert.
Der Endpoint /metrics/vendor
ist für herstellerspezifische Messdaten aus der genutzten Plattform vorgesehen.
Anwendungsspezifische Metriken
EE-Anwendungen können weitere Messdaten bereitstellen. So kann man bspw. Methoden von CDI Beans mit der Annotation @Gauge
versehen:
@Gauge(name = "answerToLifeUniverseAndEverything", absolute = true, unit = MetricUnits.NONE) public long getAnswerToLifeUniverseAndEverything() { return 42; }
Die derart zur Verfügung gestellten Werte werden im Endpoint /metrics/application
veröffentlicht:
{ "answerToLifeUniverseAndEverything": 42 }
Neben dieser Möglichkeit, eigene Messwerte zu berechnen und zu veröffentlichen, kann man auch Telemetriedaten durch das Framework aggregieren lassen:
@GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @Timed(name = "personList", absolute = true) public List getAll() { return this.personRepository.findAll(); }
@Timed
bewirkt hier, dass die Ausführungszeiten der annotierten Methode gemessen und zu verschiedenen statistischen Werten aggregiert werden:
{ "personList": { "p50": 4922800.0, "p75": 5160200.0, "p95": 1.00322E7, "p98": 1.00322E7, "p99": 1.00322E7, "p999": 1.00322E7, "min": 3218000.0, "mean": 5476794.800597489, "max": 1.00322E7, "stddev": 2340795.005960796, "count": 5, "meanRate": 0.6766077577220262, "oneMinRate": 1.0, "fiveMinRate": 1.0, "fifteenMinRate": 1.0 } }
Analog könnte mit @Counted
ein Aufrufzähler für eine Methode etabliert werden.
Gesamt-Metrik
Der Endpoint /metrics
fasst die bislang genannten Datengruppen in ein Gesamtergebnis zusammen.
Plattformen
MicroProfile Metrics wird u. a. von folgenden JEE-Servern unterstützt:
- OpenLiberty (mit aktivierten Features
mpMetrics-1.1
undmonitor-1.0
). - Payara.
- WildFly (Achtung: WildFly hat unterschiedliche Ports für Applikations- und Management-Zugriffe, im Default
8080
und9990
. Der o. a. REST-Endpoint/metrics
steht über den Management-Port zur Verfügung).
Die genannten Klassen befinden sich bspw. in der Maven-Dependency org.eclipse.microprofile:microprofile
.
Demo
In https://github.com/GEDOPLAN/metrics-demo finden Sie ein Beispielprojekt mit einem REST-Service, dessen GET
– und POST
-Methoden so annotiert sind, dass Zeiten bzw. Aufrufzahlen gemessen werden. Der o. a. Service, der die legendäre 42
als Ergebnis liefert, ist ebenfalls im Beispielprojekt enthalten. Die Anwendung kann als WAR-File auf einen der genannten Server deployt werden. Alternativ können über vorkonfigurierte Maven-Profile Docker-Images zum direkten Ausprobieren erstellt werden.
Bis bald – vielleicht auch in einem unserer Trainings in Berlin, Bielefeld, Köln oder bei Ihnen!
https://gedoplan-it-training.de/
4 Kommentare. Hinterlasse eine Antwort
Danke für diesen informativen Beitrag.
Wo werden diese Metrics Daten gehalten? (Heap Memory?)
Die Spezifikation sagt dazu nichts aus. Bei allen mir bekannten Servern liegen die Daten im Memory.
Wie lassen sich die Metriken im Wildfly Domain Modus aktivieren und vor allem abfragen? Im Standalone Modus ist die Extension per Default aktiviert und per Mgmt.-Port im Zugriff.
Leider gibt es im Domain Mode derzeit keine Unterstützung für MicroProfile Metrics.