Betrieb unter Spring Boot
Monitoring
Vorbemerkungen
Um das JWT bzw. dessen Integration im Betrieb überwachen zu können, sind serverseitig einige Messpunkte eingehängt. Dazu wird micrometer als neutrale Fassade genutzt, so dass eine große Bandbreite gängiger Systeme angebunden werden kann.
Vorhandene Metriken
Metrik (Web) | Metrik (JMX) | Auftreten | Typ | Messung |
---|---|---|---|---|
jwt.read.document | jwtReadDocument | Der Inhalt des Dokuments wird über den Reader in ein jadice document geladen | Timer | Die Zeit, die zum Laden des Dokuments benötigt wurde |
jwt.read.document.failure | jwtReadDocumentFailure | Meter | Die Anzahl der bisherigen Fehlschläge beim Laden (Bspw. enthielt das Dokument unzulässige Daten oder eine IO Operation schlug fehl) | |
jwt.render.tile | jwtRenderTile | Eine Kachel wird zu einem Bild gerendert | Timer | Die Zeit, die zum Rendern einer Kachel benötigt wurde |
jwt.render.tile.failure | jwtRenderTileFailure | Meter | Die Anzahl der bisherigen Fehlschläge beim Rendern von Kacheln | |
jwt.recover.document | jwtRecoverDocument | Stellt ein Dokument wieder her, nachdem es aus dem Cache expired wurde | Timer | Die Zeit, die für die Wiederherstellung des Dokuments benötigt wurde |
jwt.recover.document.failure | jwtRecoverDocumentFailure | Meter | Die Anzahl der bisherigen Fehlschläge bei der Wiederherstellung | |
jwt.render.maximumPoolSize | jwtRenderMaximumPoolSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die höchste Anzahl an Threads, die der Tile-Rendering-Thread-Pool annehmen kann |
jwt.render.poolSize | jwtRenderPoolSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die aktuelle Anzahl an Threads, die der Tile-Rendering-Thread-Pool hat |
jwt.render.corePoolSize | jwtRenderCorePoolSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die minimale Anzahl an Threads, die für das Tile-Rendering immer bereit stehen (diese Threads sind immer alive und bekommen keinen Timeout etc.) |
jwt.render.largestPoolSize | jwtRenderLargestPoolSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die höchste Anzahl an Threads, die bisher gleichzeitig aktiv waren |
jwt.render.activeCount | jwtRenderActiveCount | Eine Kachel wird zu einem Bild gerendert | Gauge | Die Anzahl an Threads, die aktuell Rendering-Tasks ausführen |
jwt.render.queueSize | jwtRenderQueueSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die Anzahl an Rendering-Tasks, die sich in der Warteschlange zur Ausführung befinden |
jwt.render.futuresQueueSize | jwtRenderFuturesQueueSize | Eine Kachel wird zu einem Bild gerendert | Gauge | Die Anzahl an Rendering-Tasks für alle Clients, die aktuell mehr Rendering-Tasks angefragt haben, als pro Client zulässig |
jadice.cache.evictions | jadiceCacheEvictions | Cache | Gauge | Anzahl der Aufräumvorgänge |
jadice.cache.gets | jadiceCacheGets | Cache | Gauge | Anzahl der Abrufe von Elementen aus dem Cache |
jadice.cache.hit-ratio | jadiceCacheHit-ratio | Cache | Gauge | Trefferquote |
jadice.cache.object-count | jadiceCacheObject-count | Cache | Gauge | Anzahl der Elemente im Cache |
jadice.cache.size | jadiceCacheSize | Cache | Gauge | Geschätzte Größe in Bytes |
Abruf der Metriken mittels Spring Boot
Nachfolgend werden beispielhaft Aktivierung und Abruf der Metriken über Spring Boot beschrieben.
Aktivierung der Metriken
Um auf die verschiedenen Metriken zugreifen zu können, müssen der Integration folgende Dependencies hinzugefügt und Konfigurationen vorgenommen werden:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-jmx</artifactId> <!-- nur erforderlich, falls die Metriken über JMX exponiert werden sollen -->
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId> <!-- nur erforderlich, wenn Prometheus für die Darstellung der Metriken genutzt werden soll -->
</dependency>
application.yml
Über welches Protokoll Endpoints (z.B. HTTP, JMX) exponiert werden sollen, konfiguriert man beispielsweise in der application.yml. Details siehe Dokumentation zu Spring Boot Actuator Folgendes Beispiel zeigt, wie man beide Wege exponiert:
management:
endpoints:
web:
exposure:
include: health, metrics, info
jmx:
exposure:
include: health, metrics, info
metrics:
enable:
all: true
export:
jmx:
enabled: true
endpoint:
health:
show-components: always
show-details: always
spring:
jmx:
enabled: true
Web-Metriken: z.B. Abruf über den Browser
Metriken, die per Web exponiert sind, kann man über HTTP gemäß der Konventionen und Konfiguration in Spring Boot Actuator abrufen:
http://myserver.xom/myapplication/actuator/metrics/NameDerMetrik → z.B.: http://webtoolkit.jadice.com/actuator/metrics/jwt.readDocument
Beispielausgabe von jwt.readDocument
JMX-Metriken: z.B. Abruf über jconsole
Die Metriken sind unter MBeans im Ordner metrics in dem ihrem Typ entsprechenden Unterordner zu finden:
z.B. jwtReadDocument hat den Typ Timer → unter metrics/timers
Durch die Auswahl des Unterpunkts Attributes der Metrik werden die ermittelten Werte angezeigt.
Beispielauswahl und -ausgabe von jwtReadDocument
Einhängen eigener Messpunkte in die Integration
Eigene Messpunkte (z.B. in DocumentDataProvider
-Implementierungen)
lassen sich leicht ergänzen, Details siehe
micrometer-Dokumentation.
Nachfolgend ein Beispiel zum Einhängen eines Timers:
Sample s = Timer.start();
{
// do something
}
Timer timer = Metrics.timer("mydomain.myname");
s.stop(timer);
Pendant in Spring Boot
@Timed("mydomain.myname")
public void someMethod{
// do something
}
Die Klasse, zu der someMethod gehört, muss per Spring-Mechanismus injected worden sein, damit @Timed funktioniert.