Micrometer, il monitoraggio in Java
Come fare misurazioni in Java
Il corretto monitoraggio è parte integrante di un sistema software, in particolar modo è di fondamentale rilevanza con un sistema a microservizi, dove l’affidabilità e i tempi di risposta devono essere tenuti sotto stretto controllo per poter determinare la bontà di tutto il sistema.
Per esporre le varie metriche verso Prometheus utilizzando Java o comunque una JVM, si può utilizzare il prometheus client-java che mette a disposizione lo stretto indispensabile.
Caratteristiche di Micrometer
Per fornire invece un’astrazione più ampia e completa sull’esportazione di metriche in sistemi Java si può scegliere più oculatamente la libreria Micrometer che permette l’integrazione di vari tipi di sistemi di monitoraggio, tra i quali anche il già citato Prometheus. Questa libreria è inoltre in grado di utilizzare varie modalità di composizione di metriche, come contatori o indici applicativi, nonché, grazie all’uso di AOP e annotazioni, di prelevare i tempi di esecuzione dei metodi senza intervenire pesantemente o invasivamente sul codice.
I vantaggi esposti, uniti ad un crescente supporto della comunità Opensource a questa libreria, rendono particolarmente appetibile questa scelta.
Si possono misurare varie grandezze con interfacce comuni per timer, gauge, counter, distribution summary e long task timer.
In particolare è stata già scelta nello Spring Framework, con lo Spring Boot come facade configurabile e aperta per il monitoraggio. Micrometer in effetti supporta un ampio numero di tecnologie di monitoraggio tra le quali:
In Micrometer sono configurabili direttamente il supporto alle statistiche disponibili nella JVM quali:
- Uptime
- Threads
- Memoria della JVM
- File e descrittori
- Garbage Collector
- Class Loader
- Executors
Sono disponibili inoltre e attivabili direttamente varie integrazioni:
Inoltre il supporto a Micrometer è presente in sempre più librerie Opensource per esempio HikariCP, Spring Boot 2, Micronaut,…
Panoramica dell’integazione
L’integrazione parte ovviamente dal modulo da aggiungere:
- io.micrometer : micrometer-registry-prometheus (al momento della scrittura l’ultima versione era la 1.0.7)
Questo ovviamente per l’integrazione con Prometheus, mentre, per avere il supporto agli altri sistemi, occorre utilizzare lo specifico JAR.
Ruota tutto intorno all’oggetto MeterRegistry, interfaccia che viene usata per riferirsi ad una implementazione del registro delle metriche, sulle quali registrare e far azionare i singoli contatori o indici.
Nell’applicazione si potranno ad esempio contare il numero degli accessi ad una certa classe::metodo ma allo stesso tempo misurarne i tempi di esecuzione ed eventualmente pubblicarne anche l’istogramma dei percentili. Quest’ultima può rispondere immediatamente alle tipiche domande da Service Level Agreement:
- l’applicazione ha risposto nel 99% dei casi in meno di X secondi?
- qual’è il rate degli errori rispetto ai successi?
- qual’è l’uptime dell’applicativo?
Ecco un esempio di pannello Grafana esportato via Micrometer con Prometheus con la quale sono esportate molte misure comuni della JVM.
Conclusioni
Il monitoraggio applicativo è per sua natura strettamente dipendente dal software che si vuole misurare ma con Micrometer si ottengono ottimi risultati con poche modifiche al software e in modo chiaro.
Micrometer fornisce in definitiva una astrazione completa e funzionale per la realizzazione di sistemi di monitoraggio applicativo in Java, basandosi su un sistema standard e Open Source!
Articoli correlati
Prometheus Tips: Time based alerts
Monitoraggio Kubernetes con Prometheus esterno al kube
Prometheus Tutorial: 5 - Recording rules e Federazione
Prometheus Tutorial: 4 - Alert Manager
Prometheus Tutorial: 3 - Exporter
Prometheus Tutorial: 2 - Getting started
Prometheus Tutorial: 1 - Intro
Monitoraggio Kubernetes con Prometheus
Prometheus
Microservizi, Netflix Stack, Spring Cloud