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中即可实现自动清理过期指标。

解释:

  1. Push Gateway 按 Group 来管理指标,每个Group包含一组指标和唯一的 Group Labels。
  2. Push Gateway 的API /api/vi/metrics 可以获取所有Group和当前指标值、上次推送时间。
  3. 使用 jq 语言按上次推送时间过滤Group,然后使用 DELETE API 删除组。
  4. Group Labels 是 Group 的唯一标识,取决于Push Client,每个Group可能有不同的Labels。一般默认有job和instance,如果有其他字段也需要添加到脚本里,否则删除指定Group时会把相同job和instance的Group全都删掉。以上脚本假设所有Group Labels都相同,所以请勿用于Group Labels不一致的场合。
  5. Group Labels 有规定的顺序,顺序不正确会导致DELETE返回404。你必须自己尝试正确的顺序。
  6. 使用以下脚本可以获取当前所有Group Labels,但返回的顺序并不满足顺序的条件:
baseurl=localhost:9091
curl -sS $baseurl/api/v1/metrics | jq -r '.data[].push_time_seconds.metrics[0].labels'
03-05 23:51