[英]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
,則可以訪問JCacheMetrics和CacheMeterBinder類中由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.