es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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étodo meterRegistry.find se puede utilizar para obtener la métrica Timer para un nombre de caché particular. La métrica Timer realiza un seguimiento del tiempo necesario para las operaciones de caché y también incluye una métrica de count y mean para los aciertos y fallos de caché. Aquí hay un código de ejemplo para comenzar:

    import io.micrometer.core.instrument.MeterRegistry;
    import io.micrometer.core.instrument.Timer;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.CacheManager;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CacheStatsLogger {
    
        @Autowired
        private MeterRegistry meterRegistry;
    
        @Autowired
        private CacheManager cacheManager;
    
        @Scheduled(fixedDelay = 60000) // registrar estadísticas de caché cada minuto
        public void logCacheStats() {
            cacheManager.getCacheNames().forEach(cacheName -> {
                Timer cacheTimer = meterRegistry.find(cacheName).timer();
                long cacheHits = cacheTimer.count();
                double cacheHitRatio = cacheHits / (double) (cacheHits + cacheTimer.totalTime().millis());
                double cacheMissRatio = 1 - cacheHitRatio;
                String logMessage = String.format("Caché %s: aciertos=%d, fallos=%d, ratio de aciertos=%.2f, ratio de fallos=%.2f",
                        cacheName, cacheHits, cacheTimer.count() - cacheHits, cacheHitRatio, cacheMissRatio);
                // escribir logMessage en un archivo de registro o en la salida del sistema
            });
        }
    }
    

    En este código, se crea un componente CacheStatsLogger con un meterRegistry y cacheManager inyectados usando la inyección de dependencia de Spring. El método logCacheStats 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étrica Timer correspondiente utilizando meterRegistry.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.

Comments are closed.