Prometheus Push Gateway 官网已示意不会实现指标主动过期。在某些利用情景下,会导致指标Group越来越多,导致Push Gateway或Prometheus过程耗费过多内存。
如果有需要,这里有个简略的Shell脚本,删除所有超过60秒未推送的指标:
baseurl=localhost:9091for 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/$uridone
运行以上脚本的前提是装置 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:9091curl -sS $baseurl/api/v1/metrics | jq -r '.data[].push_time_seconds.metrics[0].labels'