Prometheus Push Gateway 官方已表示不会实现指标自动过期。在某些应用情景下,会导致指标Group越来越多,导致Push Gateway或Prometheus进程消耗过多内存。
如果有需求,这里有个简单的Shell脚本,删除所有超过60秒未推送的指标:
baseurl=localhost:9091
for uri in $(curl -sS $baseurl/api/v1/metrics | jq -r '
.data[].push_time_seconds.metrics[0] |
select((now - (.value | tonumber)) > 60) |
(.labels as $labels | ["job", "instance"] | map(.+"/"+$labels[.]) | join("/"))
'); do
curl -XDELETE $baseurl/metrics/$uri | exit
echo curl -XDELETE $baseurl/metrics/$uri
done
运行以上脚本的前提是安装 jq 和 curl 。将脚本添加到Crontab中即可实现自动清理过期指标。
解释:
- Push Gateway 按 Group 来管理指标,每个Group包含一组指标和唯一的 Group Labels。
- Push Gateway 的API
/api/vi/metrics
可以获取所有Group和当前指标值、上次推送时间。 - 使用 jq 语言按上次推送时间过滤Group,然后使用 DELETE API 删除组。
- Group Labels 是 Group 的唯一标识,取决于Push Client,每个Group可能有不同的Labels。一般默认有job和instance,如果有其他字段也需要添加到脚本里,否则删除指定Group时会把相同job和instance的Group全都删掉。以上脚本假设所有Group Labels都相同,所以请勿用于Group Labels不一致的场合。
- Group Labels 有规定的顺序,顺序不正确会导致DELETE返回404。你必须自己尝试正确的顺序。
- 使用以下脚本可以获取当前所有Group Labels,但返回的顺序并不满足顺序的条件:
baseurl=localhost:9091
curl -sS $baseurl/api/v1/metrics | jq -r '.data[].push_time_seconds.metrics[0].labels'
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。