Prometheus-gateway

使用中gateway占用内存过大 prometheus-gateway指标会一直存在内存中,需要手动删除 网上有人使用脚本清除 https://segmentfault.com/a/1190000041442728

创建目录

安装docker-compose.yaml

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./conf/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./rules:/etc/prometheus/rules
  pushgateway:
    image: prom/pushgateway
    container_name: pushgateway
    restart: always
    # 持久化存储指标
    command:  --persistence.file="/data/pushgateway.log" --persistence.interval="15m"
    ports:
      - "9091:9091"
    volumes:
      - /etc/localtime:/etc/localtime
      - ./data/gateway:/data

networks:
  default:
    external:
      # 指定网卡
      name: prometheus

注意事项

  • persistence.file 指定的是具体持久化文件,该文件的所在目录最好有nobody用户权限,建议直接设置为777.

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'