使用 prometheus 查询缓存命中率图

Query for a cache hit rate graph with prometheus

我在 Spring 启动应用程序中使用 Caffeine 缓存。所有指标都已启用,因此我将它们放在 Prometheus 和 Grafana 上。

基于 cache_gets_total 指标,我想构建一个 HitRate 图表。

我已经尝试 缓存命中 :

delta(cache_gets_total{result="hit",name="myCache"}[1m])

全部从缓存中获取

sum(delta(cache_gets_total{name="myCache"}[1m]))

这两个指标都正常工作并且具有值。但是当我试图获得命中率时,我没有数据点。我试过的查询:

delta(cache_gets_total{result="hit",name="myCache"}[1m]) / sum(delta(cache_gets_total{name="myCache"}[1m]))

为什么这个查询不起作用以及如何根据信息获取命中率图,我从 Spring Boot 和 Caffeine?

运行 两者("cache hits" 和 "all gets")在 prometheus 中单独查询并将获得的标签集与结果进行比较。 对于“/”操作,双方必须完全具有相同的标签(和值)。通常需要一些聚合来 "drop" 不需要的 dimensions/labels (例如:如果您已经从两个查询中获得一个值,那么只需将它们都包装在 sum() 中 - 在划分之前)。

首先,建议在指定的lookbehind window 上使用increase() instead of delta for calculating the increase of the counterincrease() 函数正确处理计数器重置为零,这可能在服务重启时发生,而 delta() 会 return 如果给定的回顾 window 涵盖计数器重置,则结果不正确。

接下来,Prometheus 在执行 / 操作时搜索具有相同标签集的时间序列对。然后它针对每对时间序列分别应用给定的操作。来自 increase(cache_gets_total{result="hit",name="myCache"}[1m]) 的时间序列 return 至少有两个标签:result="hit"name="myCache",而来自 sum(increase(cache_gets_total{name="myCache"}[1m])) 的时间序列 return 有零个标签因为sum聚合后删除了所有标签。

Prometheus 提供了这个问题的解决方案——on()group_left() 修饰符。 on() 修饰符允许限制标签集,在搜索具有相同标签集的时间序列对时应使用该修饰符,而 group_left() 修饰符允许在 [=16= 的左侧匹配多个时间序列] 在 / 运算符的右侧有一个时间序列。参见 these docs。所以下面的查询应该return缓存命中率:

increase(cache_gets_total{result="hit",name="myCache"}[1m])
  / on() group_left()
sum(increase(cache_gets_total{name="myCache"}[1m]))

存在替代解决方案:

  1. 要使用 sum() 函数删除 increase(cache_gets_total{result="hit",name="myCache"}[1m]) 中的所有标签:
sum(increase(cache_gets_total{result="hit",name="myCache"}[1m]))
  /
sum(increase(cache_gets_total{name="myCache"}[1m]))
  1. 将查询的右边部分包装成scalar() function. This enables vector op scalar matching rules described here:
increase(cache_gets_total{result="hit",name="myCache"}[1m])
  /
scalar(sum(increase(cache_gets_total{name="myCache"}[1m])))

也可以通过sum(...) by (name)模板通过单个查询获得所有缓存的缓存命中率:

sum(increase(cache_gets_total{result="hit"}[1m])) by (name)
  /
sum(increase(cache_gets_total[1m])) by (name)