[英]Query for a cache hit rate graph with prometheus
我将 Caffeine 缓存与 Spring Boot 应用程序一起使用。 所有指标都已启用,因此我将它们放在 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]))
为什么这个查询不起作用以及如何根据信息获取 HitRate 图,我有来自 Spring Boot 和 Caffeine?
首先,建议使用increase()而不是delta来计算计数器在指定 lookbehind window 上的增加。 increase()
function 正确处理计数器重置为零,这可能发生在服务重启时,而delta()
如果给定的 lookbehind window 涵盖计数器重置,将返回不正确的结果。
接下来,Prometheus 在执行/
操作时搜索具有相同标签集的时间序列对。 然后它针对每对时间序列分别应用给定的操作。 increase(cache_gets_total{result="hit",name="myCache"}[1m])
返回的时间序列至少有两个标签: result="hit"
和name="myCache"
,而sum(increase(cache_gets_total{name="myCache"}[1m]))
) 返回的时间序列sum(increase(cache_gets_total{name="myCache"}[1m]))
的标签为零,因为sum在聚合后删除了所有标签。
Prometheus 提供了这个问题的解决方案——on( on()
和group_left()
修饰符。 on()
修饰符允许限制标签集,在搜索具有相同标签集的时间序列对时应使用该修饰符,而group_left()
修饰符允许将左侧的多个时间序列/
左侧的单个时间序列相匹配/
运算符的右侧。 请参阅这些文档。 所以下面的查询应该返回缓存命中率:
increase(cache_gets_total{result="hit",name="myCache"}[1m])
/ on() group_left()
sum(increase(cache_gets_total{name="myCache"}[1m]))
存在替代解决方案:
sum()
function 从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)
在Prometheus中分别运行两个查询(“缓存命中”和“所有获取”),并将获得的标签集与结果进行比较。 为了使“ /”操作起作用,双方必须具有完全相同的标签(和值)。 通常,需要进行一些汇总才能“删除”不需要的维度/标签(例如:如果两个查询中已经有一个值,则只需将它们都包装在sum()中-在除法之前)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.