如何在Loki中实现仅重启时归零的非递减日志计数器?
基于Loki实现非递减错误日志计数器(仅Loki重启时归零)
完全可行,你可以通过Loki和Prometheus的记录规则组合,实现符合需求的非递减计数器(仅Loki重启时归零),具体方案如下:
核心逻辑
count_over_time确实会生成gauge类型的指标,但它返回的是指定时间窗口内的日志行数增量。我们可以将这个增量通过Prometheus的记录规则持续累加,得到一个行为完全等同于counter的指标——仅在Loki重启时,因为日志数据从新起点开始统计,累加值才会归零。
具体实现步骤
1. Loki侧:定义间隔计数规则
在Loki的记录规则中,按标签分组统计每个时间窗口内"bad foo"日志的数量,自动保留所有原始标签:
groups: - name: bad_foo_increment rules: - record: loki_bad_foo:increment_per_interval expr: count_over_time({job="your-job"} |= "bad foo"[1m])
这里的1m是统计间隔,建议和Loki记录规则的评估间隔保持一致。
2. Prometheus侧:累加增量为总计数器
在Prometheus的记录规则中,将Loki传来的间隔增量累加,得到从Loki启动以来的"bad foo"日志总数:
groups: - name: bad_foo_total_counter rules: - record: loki_bad_foo:total expr: sum_over_time(loki_bad_foo:increment_per_interval[1d])
- 这里的
1d是一个足够大的时间范围,确保覆盖Loki重启后的所有统计周期(如果你的Loki重启间隔更长,可以调整为7d等更大的值)。 - 该指标的值会持续递增,只有当Loki重启后,之前的日志数据不再被纳入查询范围,累加值才会从0开始重新计数,完全符合你的需求。
关键说明
- 虽然
loki_bad_foo:total在Prometheus中是gauge类型,但它的行为和counter完全一致:非递减、仅Loki重启时归零。你可以像使用普通counter一样,对它使用rate()或increase()函数计算速率。 - 所有原始日志的附加标签都会被保留到最终的计数器指标中,满足你按标签维度统计的需求。
内容的提问来源于stack exchange,提问作者George Shuklin
相关产品推荐
相关产品推荐

