Akka HTTP caching使用getOrLoad方法如何添加缓存命中/未命中指标
Akka HTTP Caching 缓存指标问题解答
核心结论
Akka HTTP 官方Caching模块没有内置开箱即用的缓存命中/未命中指标统计能力,你没有遗漏官方文档的相关内容。
两种指标统计实现方案
你可以根据自己的使用场景选择以下任意一种方案实现指标采集:
方案1:自行封装getOrLoad方法埋点
对原生方法做一层轻量包装,自定义埋点统计所需指标,示例代码如下:
import java.util.concurrent.atomic.AtomicLong import akka.http.caching.scaladsl.Cache import scala.concurrent.Future import scala.util.{Success, Failure} // 定义指标统计变量,可根据需要替换为Dropwizard、Prometheus等可观测组件的指标实例 val cacheHits = new AtomicLong(0) val cacheMisses = new AtomicLong(0) val cacheLoadFailures = new AtomicLong(0) def getOrLoadWithMetrics[K, V](cache: Cache[K, V], key: K, loader: K => Future[V]): Future[V] = { cache.get(key) match { case Some(cachedFuture) => cacheHits.incrementAndGet() cachedFuture case None => cacheMisses.incrementAndGet() val loadedFuture = loader(key) loadedFuture.onComplete { case Failure(_) => cacheLoadFailures.incrementAndGet() case Success(_) => // 可扩展统计加载耗时、加载成功数等额外指标 }(cache.executionContext) // 与原生getOrLoad逻辑对齐,将加载结果存入缓存 cache.put(key, loadedFuture) loadedFuture } }
方案2:复用底层Caffeine缓存的原生统计能力
Akka HTTP的LfuCache底层基于Caffeine缓存实现,你可以直接获取底层Caffeine实例获取官方内置的全量统计数据:
- 初始化缓存时开启统计开关
- 调用
unsafe接口获取Caffeine实例读取统计数据
示例代码如下:
import akka.http.caching.scaladsl.{LfuCache, LfuCacheSettings} import com.github.benmanes.caffeine.cache.stats.CacheStats // 初始化缓存时开启统计功能 val cacheSettings: LfuCacheSettings = LfuCache.defaultSettings .withEnableStats(true) val cache: LfuCache[String, String] = LfuCache(cacheSettings) // 按需读取统计指标 val stats: CacheStats = cache.unsafe.stats() val hitCount: Long = stats.hitCount() val missCount: Long = stats.missCount() val hitRate: Double = stats.hitRate() val evictionCount: Long = stats.evictionCount() val averageLoadPenalty: Double = stats.averageLoadPenalty()
内容的提问来源于stack exchange,提问作者Anton Belev
相关产品推荐
相关产品推荐

