实操|Prometheus Pushgateway 部署、推送与数据管理全流程
1、Pushgateway组件介绍Pushgateway是Prometheus监控系统中的一个重要组件它采用被动push的方式获取数据由应用主动将数据推送到pushgateway然后Prometheus再从Pushgateway抓取数据。Pushgateway可以单独运行在任何节点上并不一定要运行在被监控的客户端上。在某些特殊场景下我们可以通过自定义编写脚本把需要监控的数据push到pushgateway然后Prometheus再从pushgateway拉取数据最终实现数据汇总。使用Pushgateway的场景Prometheus和target由于某些原因网络不能互通导致 Prometheus 无法直接拉取各个 target 数据此时需要经由Pushgateway做中转代理。某些作业生命周期较短、批量任务等没有足够的时间等待Prometheus抓取数据。所以可以先把数据推送到Pushgateway暂存再让Prometheus来抓取。将多个节点数据汇总到 pushgateway, 如果pushgateway挂了多个监控节点会受到影响。通过单个 Pushgateway监控多个实例时 Pushgateway将会成为单点故障和潜在瓶颈。Pushgateway可以持久化推送给它的所有监控数据。 因此即使你的监控已经下线prometheus还会拉取到旧的监控数据因此需要手动清理pushgateway下老旧的数据。2、pushgateway的安装和配置从https://prometheus.io/download/#pushgateway 下载对应版本的pushgateway二进制包即可。安装过程如下[rootdocker-server data]# tar zxvf pushgateway-1.5.1.linux-amd64.tar.gz [rootdocker-server data]# mv pushgateway-1.5.1.linux-amd64 /usr/local/pushgateway [rootdocker-server data]# cd /usr/local/pushgateway [rootdocker-server pushgateway]#./pushgateway --web.listen-address:9091编写service脚本启动pushgateway[rootdocker-server data]# cat /usr/lib/systemd/system/pushgateway.service [Unit] Descriptionprometheus pushgateway Afternetwork.target [Service] Typesimple Userroot Grouproot ExecStart/usr/local/pushgateway/pushgateway --web.listen-address:9091 ExecStop/usr/bin/kill -HUP $MAINPID [Install] WantedBymulti-user.target启动服务[rootdocker-server data]# systemctl daemon-reload [rootdocker-server data]# systemctl start pushgateway.service验证端口监听ss -tulpn | grep 9091接着还需要配置Prometheus在prometheus.yml文件中增加如下内容- job_name: prometheus-gateway honor_labels: true static_configs: - targets: [192.168.38.148:9091]然后reload配置[rootprometheus-server prometheus]# curl -XPOST localhost:9090/-/reload最后浏览器访问IP:9091验证pushgateway页面即可。3、pushgateway的使用1、推送数据格式要推送数据到Pushgateway中可以通过其提供的API接口来添加默认推送URL地址为http://lt;ipgt;:9091/metrics/job/lt;job-namegt;/lt;label-namegt;/lt;label-valuegt;其中job-name是必填项是job标签的值后边可以跟任意数量的标签标签值对一般会添加一个instance/标签来区分指标数据来源。在推送的数据部分格式定义如下## TYPE metric_name type metric_name{lable_namelabel_value,...} value例如推送一个group定义为{job“some_job”}的数据echo some_metric 3.14 | curl --data-binary - http://192.168.38.148:9091/metrics/job/some_jobsome_metric 3.14: 推送的键和值。job/some_job相当于指定job_name为jobsome_job多个标签直接往后添加即可。data-binary以二进制数据格式发送post请求 。推送到Pushgateway之后就可以刷新Pushgateway界面看到对应数据了除了 some_metric外同时还新增了push_time_seconds和push_failure_time_seconds两个指标这两个是 PushGateway 系统自动生成的相关指标。访问192.168.38.148:9091/metrics查看又例如推送一个group定义为{job“some_job”,instance“some_instance”}的数据cat EOF | curl --data-binary - http://192.168.38.148:9091/metrics/job/some_job/instance/192.168.38.148 # TYPE some_metric2 counter some_metric2{labelval1} 100 # TYPE another_metric gauge # HELP another_metric Just an example. another_metric 2398.283 EOF重点/metrics/job/some_job和 /metrics/job/some_job/instance/some_instance它们都属于 some_job但是它们属于两个指标值因为 instance 对二者做了区分。注意Prometheus 会给每个抓取的指标附加一个job和instance的标签job标签来自scrape配置我们这里抓取 Pushgateway 的job标签为jobprometheus gatewayinstance标签的值会自动设置为抓取目标的主机和端口所以所有从 Pushgateway 抓取的指标都会有 Pushgateway 的主机和端口作为instance标签但是这可能会和你附加推送到 Pushgateway 指标上的job和instance标签冲突这个时候 Prometheus 会将这些标签重命名为exported_job和exported_instance。但是在抓取 Pushgateway 时通常不希望出现这种行为。更多的时候你可能更希望保留推送到 Pushgateway 的指标的job和instance标签这个时候我们只需要在 Pushgateway 的抓取配置中设置honor_labels: true即可。2、复杂的数据的推送方法如果一次性推送数据较多可以将要推送的数据写到一个文件中然后推送文件即可# 创建指标文件 cat /data/mydata.txt EOF # TYPE http_request_total counter # HELP http_request_total get interface request count with different code. http_request_total{code200,interface/v1/save} 1398 http_request_total{code404,interface/v1/delete} 1 http_request_total{code500,interface/v1/save} 2 # TYPE http_request_time gauge # HELP http_request_time get core interface http request time. http_request_time{code200,interface/v1/core} 0.201 EOF # 推送文件 curl -XPOST --data-binary /data/mydata.txt http://192.168.38.148:9091/metrics/job/app/instance/app-192.168.38.1483、编写采集脚本推送数据到Pushgateway如果在某些特殊场景下可以自写脚本定时生成监控数据然后推送到Pushgateway例如下面脚本用来收集磁盘状态数据mkdir -p /app/shell cat /app/shell/disk_usage_metris.sh EOF #!/bin/bash hostname\hostname -f | cut -d . -f1\ metrics for line in \df |awk NR1{print \$NF int(\$(NF-1))}\ do disk_name\echo \$line|awk -F {print \$1}\ disk_usage\echo \$line|awk -F {print \$2}\ metrics\$metrics\ndisk_usage{instance\\$hostname\,job\disk\,disk_name\\$disk_name\} \$disk_usage done echo -e # HELP disk_usage Disk usage percentage.\n# TYPE disk_usage gauge\n\$metrics | curl --data-binary - http://192.168.38.148:9091/metrics/job/pushgateway/instance/\$hostname EOF最后将disk_usage_metris.sh脚本放到定时任务中定期执行例如每1分钟推送一次数据编辑crontab -echmod x /app/shell/disk_usage_metris.sh crontab -e * * * * * /bin/bash /app/shell/disk_usage_metris.sh4、删除数据# 删除某个instance下指标 curl -X DELETE http://192.168.38.148:9091/metrics/job/some_job/instance/192.168.38.148 # 删除整个job curl -X DELETE http://192.168.38.148:9091/metrics/job/some_job # 清空所有指标 curl -X PUT http://192.168.38.148:9091/api/v1/admin/wipe说明删除数据是以Group为单位的Group由job name和URL中的label唯一标识。举例中删除{job“some_job”}数据的语句并不会删除{job“some_job”,instance“some_instance”}的数据。因为属于不同的Group。如需要删除{job“some_job”,instance“some_instance”}下的数据需要指定完整标签。这里删除数据是指删除pushgateway中的数据跟promethues没有关系。要删除数据还可以在pushgateway的web界面上完成。5、PushGateway使用的注意事项指标值只能是数字类型非数字类型报错。指标值支持最大长度为 16 位超过16 位后默认置为 0PushGateway 推送及 Prometheus 拉取时间设置 Prometheus 每次从 PushGateway 拉取的数据并不是拉取周期内用户推送上来的所有数据而是用户最后一次 Push 到 PushGateway 上的数据所以建议设置推送时间小于或等于 Prometheus 拉取的时间这样保证每次拉取的数据是最新 Push 上来的。4、PushGateway 数据持久化默认 PushGateway 不做数据持久化操作当 PushGateway 重启或者异常挂掉导致数据的丢失可以通过启动时添加 -persistence.file 和 -persistence.interval 参数来持久化数据。例如[rootdocker-server data]# vi /usr/lib/systemd/system/pushgateway.service [Unit] Descriptionprometheus pushgateway Afternetwork.target [Service] Typesimple Userroot Grouproot ExecStart/usr/local/pushgateway/pushgateway --web.listen-address:9091 --web.enable-admin-api --persistence.file/usr/local/pushgateway/pushgateway_persist_file --persistence.interval2m ExecStop/usr/bin/kill -HUP $MAINPID [Install] WantedBymulti-user.target其中–persistence.file指定持久化文件路径或名称。如果没有指定存储则监控指标仅保存在内存中若出现pushgateway重启或意外故障便会导致数据丢失。默认情况下持久化文件每5分钟写一次。–persistence.interval重新设置写入文件的时间间隔。以上就是基于192.168.38.148 Prometheus环境完整复刻Pushgateway的全部实操步骤从安装部署、配置持久化到指标推送、定时采集和数据删除每一步都可直接复制执行避开了标签冲突、数据丢失、指标异常等常见坑点。Pushgateway作为Prometheus的重要补充完美解决了短周期任务监控、跨网络指标采集的痛点但需注意单点故障风险和旧指标清理问题。如果在实操中遇到端口监听失败、Prometheus拉取异常、脚本执行报错等问题欢迎在评论区留言一起交流排查思路也可以收藏本文后续用到时直接查阅即可。