簡體   English   中英

Spring 啟動 2.x 批處理應用程序,如何訪問千分尺緩存指標以進行日志記錄?

[英]Spring Boot 2.x Batch application, how to access Micrometer cache metrics for logging?

使用 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 引導執行器和千分尺文檔以及幾篇博客文章,但無法弄清楚如何做到這一點。 大多數文檔似乎都假設一個是通過 API 進行監控,這不是我所需要的。 這似乎是一個基本的用例,所以我懷疑我遺漏了一些明顯的東西。 我希望有人能指出我正確的方向。

如果您在類路徑中也有spring-boot-starter-cache ,則可以訪問JCacheMetricsCacheMeterBinder類中由micrometer定義的指標。 您可以通過注入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.isEmpty()
                                || 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());
    }
}

這會產生如下所示的日志:

06:34:53.821 [http-nio-8080-exec-6] INFO  i.g.d.u.CacheUtil - Cache metrics: size=0.0, hits=12.0, misses=2.0, puts=2.0, evictions=0.0, removals=0.0
06:34:54.257 [http-nio-8080-exec-7] INFO  i.g.d.u.CacheUtil - Cache metrics: size=0.0, hits=13.0, misses=2.0, puts=2.0, evictions=0.0, removals=0.0

請注意,由於這些指標對於不同的緩存實現是通用的,因此某些指標(如本例中的大小和驅逐)可能會顯示為 0,因為它們可能沒有為 Ehcache 記錄。 在運行時記錄這些指標的示例應用程序可以在github上找到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM