Aplicación Batch de Spring Boot 2.x, ¿cómo acceder a las métricas de caché de Micrometer para el registro?
Usando Spring Boot 2.5.7, Micrometer 1.7.6, Ehcache 3.9.7, y tener spring-boot-starter-actuator en el classpath. Estoy construyendo una aplicación batch (no una aplicación web, sin APIs de actuator expuestas). Tengo un
ehcache.xml
configurado para habilitar las estadísticas:
<eh:service>
<jsr107:defaults enable-management="true" enable-statistics="true"/>
</eh:service>
<pre><code><eh:cache alias="myCache" uses-template="default">
<eh:key-type>java.lang.String</eh:key-type>
<eh:value-type>java.lang.String</eh:value-type>
<eh:listeners>
<eh:listener>
<eh:class>com.company.package.MyListener</eh:class>
<!-- more event config ... -->
</eh:listener>
</eh:listeners>
</eh:cache>
</code></pre>
Me gustaría codificar el oyente para escribir periódicamente estadísticas de la caché en un registro. El pseudocódigo sería algo así:
@Autowired
CacheManager mgr;
<pre><code>mgr.getCacheNames().forEach( cacheName -> {
writeCacheStats(cacheName);
});
void writeCacheStats(String cacheName) {
// get statistics for cacheName from Micrometer or Boot... HOW?
// write statistics to log
}
</code></pre>
He examinado la documentación de Spring Boot Actuator y Micrometer, y varios posts de blogs, y no puedo descubrir cómo hacer esto. La mayoría de la documentación parece asumir que uno está monitoreando a través de API, lo cual no es lo que necesito. Parece un caso de uso básico, así que sospecho que estoy omitiendo algo obvio. Espero que alguien pueda señalarme en la dirección correcta.
davy.ai
Para recuperar estadísticas de caché y escribirlas en un registro en una aplicación por lotes, podemos usar el
MeterRegistry
de Micrometer para acceder a las métricas de Ehcache. Específicamente, el métodometerRegistry.find
se puede utilizar para obtener la métricaTimer
para un nombre de caché particular. La métricaTimer
realiza un seguimiento del tiempo necesario para las operaciones de caché y también incluye una métrica decount
ymean
para los aciertos y fallos de caché. Aquí hay un código de ejemplo para comenzar:En este código, se crea un componente
CacheStatsLogger
con unmeterRegistry
ycacheManager
inyectados usando la inyección de dependencia de Spring. El métodologCacheStats
está anotado con@Scheduled
para ejecutarse cada minuto e itera a través de todos los nombres de caché. Para cada caché, se recupera la métricaTimer
correspondiente utilizandometerRegistry.find(cacheName).timer()
. A partir de esta métrica, obtenemos el número de aciertos y fallos de caché, así como la proporción de aciertos / fallos, que luego se pueden registrar o mostrar de cualquier manera deseada.