【问题标题】:Spring Boot 2.x Batch application, how to access Micrometer cache metrics for logging?Spring Boot 2.x Batch 应用程序,如何访问 Micrometer 缓存指标以进行日志记录?
【发布时间】:2022-08-20 18:51:10
【问题描述】:

使用 Spring Boot 2.5.7、Micrometer 1.7.6、Ehcache 3.9.7,并在类路径上有 spring-boot-starter-actuator。我正在建造一个批应用程序(不是 Web 应用程序,没有公开的执行器 API)。我有一个 ehcache.xml 配置为启用统计信息:

    <eh:service>
        <jsr107:defaults enable-management=\"true\" enable-statistics=\"true\"/>
    </eh:service>

    <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>

我想编写侦听器以定期将缓存统计信息写入日志。伪代码看起来像:

    @Autowired
    CacheManager mgr;  

    mgr.getCacheNames().forEach( cacheName -> {
        writeCacheStats(cacheName);
    });

    void writeCacheStats(String cacheName) {
        // get statistics for cacheName from Micrometer or Boot... HOW?
        // write statistics to log
    }

我已经梳理了 Spring Boot Actuator 和 Micrometer 文档以及几篇博客文章,但无法弄清楚如何做到这一点。大多数文档似乎都假设一个是通过 API 进行监控,这不是我所需要的。这似乎是一个基本的用例,所以我怀疑我遗漏了一些明显的东西。我希望有人能指出我正确的方向。

    标签: java spring-boot ehcache spring-micrometer


    【解决方案1】:

    如果您在类路径中也有spring-boot-starter-cache,您可以访问micrometer 在JCacheMetrics 和CacheMeterBinder 类中定义的指标。您可以通过注入 MeterRegistry bean 来访问它们。记录指标的代码如下所示:

    import java.util.Collections;
    import java.util.Map;
    
    import org.springframework.stereotype.Component;
    
    import io.micrometer.core.instrument.FunctionCounter;
    import io.micrometer.core.instrument.Gauge;
    import io.micrometer.core.instrument.Meter;
    import io.micrometer.core.instrument.MeterRegistry;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    
    @Slf4j
    @Component
    @RequiredArgsConstructor
    public class CacheUtil {
        private final MeterRegistry meterRegistry;
    
        public void logCacheMetrics() {
            LOGGER.info("Cache metrics: size={}, hits={}, misses={}, puts={}, evictions={}, removals={}",
                    getGaugeValue("cache.size"),
                    getFunctionCounterValue("cache.gets", Collections.singletonMap("result", "hit")),
                    getFunctionCounterValue("cache.gets", Collections.singletonMap("result", "miss")),
                    getFunctionCounterValue("cache.puts"),
                    getFunctionCounterValue("cache.evictions"),
                    getGaugeValue("cache.removals"));
        }
    
        private Meter getMeter(String meterName, Map<String, String> tags) {
            return meterRegistry.getMeters().stream()
                    .filter(meter -> meter.getId().getName().equals(meterName) &&
                            tags.entrySet().stream()
                                    .allMatch(inputTag -> meter.getId().getTags().stream()
                                            .anyMatch(meterTag -> meterTag.getKey().equals(inputTag.getKey())
                                                    && meterTag.getValue().equals(inputTag.getValue()))))
                    .findFirst()
                    .orElse(null);
        }
    
        private double getGaugeValue(String gaugeName) {
            Gauge gauge = (Gauge) getMeter(gaugeName, Collections.emptyMap());
    
            return gauge != null ? gauge.value() : 0;
        }
    
        private double getFunctionCounterValue(String counterName, Map<String, String> tags) {
            FunctionCounter counter = (FunctionCounter) getMeter(counterName, tags);
    
            return counter != null ? counter.count() : 0;
        }
    
        private double getFunctionCounterValue(String counterName) {
            return getFunctionCounterValue(counterName, Collections.emptyMap());
        }
    }
    

    这会产生如下所示的日志:

    2022-08-20 05:39:09.725  INFO 13364 --- [nio-8080-exec-7] io.github.devatherock.util.CacheUtil     : Cache metrics: size=0.0, hits=35.0, misses=1.0, puts=1.0, evictions=0.0, removals=0.0
    2022-08-20 05:39:10.106  INFO 13364 --- [nio-8080-exec-8] io.github.devatherock.util.CacheUtil     : Cache metrics: size=0.0, hits=36.0, misses=1.0, puts=1.0, evictions=0.0, removals=0.0
    

    请注意,由于这些指标对于不同的缓存实现是通用的,因此某些指标(如本例中的大小和驱逐)可能显示为 0,因为它们可能没有为 Ehcache 记录。在运行时记录这些指标的示例应用程序可以在github 上找到。您可能还可以访问更多在 EhCache2Metrics 类中定义的 Ehcache 特定指标,尽管我尚未对其进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2022-07-06
      • 2015-02-08
      • 2014-06-13
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多