文章目录
- [Pushgateway 数据自动清理](#Pushgateway 数据自动清理)
-
- [一、Pushgateway 数据清理的必要性](#一、Pushgateway 数据清理的必要性)
- 二、自动清理方案
- 三、最佳实践建议
- 四、验证与维护
- 五、示例
- [1. 基于时间的自动清理](#1. 基于时间的自动清理)
-
- [1.1 使用 Pushgateway 的 API 定期清理](#1.1 使用 Pushgateway 的 API 定期清理)
- [1.2 使用 Pushgateway 的 `--persistence.file` 和 `--persistence.interval` 参数](#1.2 使用 Pushgateway 的
--persistence.file
和--persistence.interval
参数)
- [2. 基于任务的自动清理](#2. 基于任务的自动清理)
-
- [2.1 任务完成后自动清理](#2.1 任务完成后自动清理)
- [2.2 使用 Kubernetes Finalizers (如果运行在 K8s 中)](#2.2 使用 Kubernetes Finalizers (如果运行在 K8s 中))
- [3. 高级自动清理方案](#3. 高级自动清理方案)
-
- [3.1 使用 Pushgateway 的 Admin API (需要启用)](#3.1 使用 Pushgateway 的 Admin API (需要启用))
- [3.2 使用 Prometheus 记录规则标记过期数据](#3.2 使用 Prometheus 记录规则标记过期数据)
- [4. 示例最佳实践建议](#4. 示例最佳实践建议)
Pushgateway 数据自动清理
Pushgateway 作为 Prometheus 生态中的一个重要组件,主要用于临时和批处理作业的指标推送。然而,Pushgateway 默认不会自动清理过期指标数据,这可能导致指标堆积、内存占用过高甚至服务崩溃。以下是 Pushgateway 数据自动清理的完整解决方案。
一、Pushgateway 数据清理的必要性
Pushgateway 设计上不会自动删除推送给它的任何指标数据,这带来几个主要问题:
- 指标数据会无限期保留,即使相关作业已终止
- 随着时间推移,Pushgateway 内存占用会不断增长,可能导致服务崩溃
- Prometheus 会持续拉取这些过期数据,影响监控准确性
二、自动清理方案
方案1:使用带TTL功能的Pushgateway分支版本
一个社区维护的Pushgateway分支版本支持TTL(Time-To-Live)功能:
bash
docker run -d -p 9091:9091 dmathai/prom-pushgateway-ttl:latest --metric.timetolive=60s
参数说明:
--metric.timetolive
:设置指标的存活时间(如60s),超过此时间的指标会自动删除
优点 :实现简单,无需额外维护
缺点:非官方版本,可能存在兼容性问题
方案2:使用Shell脚本定期清理
以下脚本可删除超过指定时间(如60秒)未更新的指标:
bash
#!/bin/bash
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
done
部署步骤:
- 确保系统已安装
jq
和curl
工具 - 将脚本保存为
/opt/scripts/pushgateway_clean.sh
- 添加执行权限:
chmod +x /opt/scripts/pushgateway_clean.sh
- 设置crontab定期执行(如每分钟):
bash
*/1 * * * * /bin/bash /opt/scripts/pushgateway_clean.sh >/dev/null 2>&1
注意事项:
- 脚本假设所有Group都包含
job
和instance
标签 - 如果Group包含其他标签,需要修改脚本中的标签列表
- Group Labels有特定顺序,顺序不正确会导致删除失败
方案3:结合Prometheus记录规则自动清理
- 首先在Prometheus中创建记录规则,识别过期指标:
yaml
# prometheus.yml 中添加
rule_files:
- 'pushgateway_rules.yml'
yaml
# pushgateway_rules.yml 内容
groups:
- name: pushgateway_cleanup
rules:
- record: pushgateway:stale_metrics
expr: time() - push_time_seconds > 60
- 使用Prometheus API查询过期指标并删除:
bash
#!/bin/bash
STALE_METRICS=$(curl -s 'http://prometheus:9090/api/v1/query?query=pushgateway:stale_metrics' | jq -r '.data.result[].metric.job')
for JOB in $STALE_METRICS; do
curl -X DELETE "http://pushgateway:9091/metrics/job/$JOB"
done
三、最佳实践建议
-
合理设置指标生命周期:
- 短周期作业:设置较短的TTL(如5-10分钟)
- 长周期作业:设置与作业周期匹配的TTL
-
标签设计规范:
- 确保每个作业有唯一的job名称
- 包含有意义的instance标签
- 避免使用易变的标签值
-
监控Pushgateway自身:
- 监控
pushgateway_http_requests_total
了解API调用情况 - 监控
pushgateway_metrics_count
了解指标数量变化
- 监控
-
持久化配置 :
如果需要保留某些关键指标,可以启用持久化:
bashdocker run -d -p 9091:9091 -v /data:/data prom/pushgateway --persistence.file=/data/pushgateway.data
四、验证与维护
-
验证自动清理效果:
- 定期检查
pushgateway_metrics_count
指标 - 通过Pushgateway Web界面(默认9091端口)查看当前指标
- 定期检查
-
日志监控:
- 监控清理脚本的执行日志
- 设置告警规则,当清理失败时通知
-
定期审查:
- 每季度审查TTL设置是否仍符合业务需求
- 根据业务变化调整清理策略
通过实施以上SOP,可以有效管理Pushgateway中的指标数据,避免因数据堆积导致的问题,同时确保监控系统的稳定运行。
五、示例
1. 基于时间的自动清理
1.1 使用 Pushgateway 的 API 定期清理
bash
#!/bin/bash
# cleanup_old_metrics.sh
PUSHGATEWAY="http://pushgateway.address:9091"
RETENTION_HOURS=24 # 保留24小时内的数据
# 获取当前时间戳
CURRENT_TS=$(date +%s)
# 获取所有指标组
METRIC_GROUPS=$(curl -s "${PUSHGATEWAY}/api/v1/metrics" | jq -r '.data[].pushTimeUnixSeconds')
# 遍历并清理过期数据
for group in $METRIC_GROUPS; do
PUSH_TIME=$(echo $group | jq -r '.pushTimeUnixSeconds')
AGE_HOURS=$(( (CURRENT_TS - PUSH_TIME) / 3600 ))
if [ $AGE_HOURS -gt $RETENTION_HOURS ]; then
JOB_NAME=$(echo $group | jq -r '.labels.job')
INSTANCE=$(echo $group | jq -r '.labels.instance')
echo "Deleting ${JOB_NAME}/${INSTANCE} (age: ${AGE_HOURS}h)"
curl -X DELETE "${PUSHGATEWAY}/metrics/job/${JOB_NAME}/instance/${INSTANCE}"
fi
done
设置定时任务:
bash
# 每天凌晨1点执行清理
0 1 * * * /path/to/cleanup_old_metrics.sh
1.2 使用 Pushgateway 的 --persistence.file
和 --persistence.interval
参数
启动 Pushgateway 时添加:
bash
./pushgateway \
--persistence.file=/tmp/pushgateway \
--persistence.interval=5m \
--web.enable-admin-api
这样 Pushgateway 会定期将内存中的数据持久化到文件,并在启动时恢复。
2. 基于任务的自动清理
2.1 任务完成后自动清理
bash
#!/bin/bash
# job_script.sh
JOB_NAME="my_batch_job"
INSTANCE=$(hostname)
PUSHGATEWAY="http://pushgateway.address:9091"
# 注册退出时清理的钩子
function cleanup {
echo "Cleaning up Pushgateway metrics..."
curl -X DELETE "${PUSHGATEWAY}/metrics/job/${JOB_NAME}/instance/${INSTANCE}"
}
trap cleanup EXIT
# 推送指标
echo "job_status{state=\"running\"} 1" | curl --data-binary @- "${PUSHGATEWAY}/metrics/job/${JOB_NAME}/instance/${INSTANCE}"
# 执行实际任务
your_actual_task_here
# 更新最终状态
echo "job_status{state=\"finished\"} 1" | curl --data-binary @- "${PUSHGATEWAY}/metrics/job/${JOB_NAME}/instance/${INSTANCE}"
2.2 使用 Kubernetes Finalizers (如果运行在 K8s 中)
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: example-job
spec:
template:
spec:
containers:
- name: main
image: your-image
command: ["/bin/sh", "-c"]
args:
- |
# 推送指标
echo "job_running 1" | curl --data-binary @- http://pushgateway/metrics/job/example-job/instance/${HOSTNAME}
# 执行任务
your-task-here
# 退出前清理
curl -X DELETE http://pushgateway/metrics/job/example-job/instance/${HOSTNAME}
restartPolicy: Never
3. 高级自动清理方案
3.1 使用 Pushgateway 的 Admin API (需要启用)
启动 Pushgateway 时添加 --web.enable-admin-api
参数,然后可以使用:
bash
# 清理所有指标
curl -X PUT "${PUSHGATEWAY}/api/v1/admin/wipe"
3.2 使用 Prometheus 记录规则标记过期数据
在 Prometheus 配置中添加记录规则:
yaml
rule_files:
- 'pushgateway_rules.yml'
pushgateway_rules.yml 内容:
yaml
groups:
- name: pushgateway_cleanup
rules:
- record: pushgateway_metric_expired
expr: |
time() - pushgateway_metric_push_time > 86400 # 24小时过期
unless ON(job, instance) pushgateway_metric_value
然后可以基于此规则触发清理操作
4. 示例最佳实践建议
-
分层清理策略:
- 短期任务:任务完成后立即清理
- 中期监控:设置24小时保留期
- 长期数据:考虑直接写入Prometheus或其他TSDB
-
监控清理过程:
bash# 监控Pushgateway指标组数量 curl -s "${PUSHGATEWAY}/metrics" | grep 'pushgateway_metrics_entries'
-
避免清理风暴:
- 大规模清理时添加延迟
- 考虑分批清理
-
日志记录:
- 记录所有清理操作
- 监控清理失败情况
通过以上方案,可以实现Pushgateway数据的自动化生命周期管理,避免无用数据积累。