使用 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 counter。 increase()
函数正确处理计数器重置为零,这可能在服务重启时发生,而 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]))
存在替代解决方案:
- 要使用
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]))
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)
我在 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 counter。 increase()
函数正确处理计数器重置为零,这可能在服务重启时发生,而 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]))
存在替代解决方案:
- 要使用
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]))
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)