Prometheus+Grafana构建云原生分布式监控系统(九)_pushgateway的使用

Prometheus+Grafana构建云原生分布式监控系统(八)_监控docker容器https://blog.csdn.net/xiaochenXIHUA/article/details/157330311

Prometheus+Grafana构建云原生分布式监控系统(二)_prometheus的构成与原理https://coffeemilk.blog.csdn.net/article/details/157094525

一、prometheus中pushgateway组件的介绍与安装部署

1.1、pushgateway组件简介

Pushgateway是Prometheus监控系统中的一个重要组件,它采用被动push的方式获取数据(即:由应用主动将数据推送到pushgateway中存储,prometheus再从pushgateway里抓取数据)。**pushgateway可以单独运行在任何节点上,并不一定要运行在被监控的客户端上。**如下图所示:

1.2、pushgateway的使用场景与缺点

|--------|-----------------------------------------------------------------------------------------------|
| 对于【网络只能出不能进】或者【瞬时或批量作业】场景使用pushgateway模式是最佳的。 在如上的特殊场景下,可以通过编写自定义脚本,将需要监控的数据推送(push)到pushgateway中,然后prometheus在从pushgateway中拉取数据,从而实现数据的汇总。 ||
| 序号 | pushgateway的使用场景 |
| 1 | prometheus与需监控的目标(target)由于某些原因网络不能互通,导致prometheus无法直接拉取各个目标(target)数据时,可以经过pushgateway做中转代理。 |
| 2 | 在【作业生命周期较短】【批量任务】等没有足够时间等待prometheus抓取数据时,可以先把数据推送到pushgateway暂存,再让prometheus来抓取。 |
| ||
| 序号 | pushgateway的缺点 |
| 1 | 将多个节点数据汇总到 pushgateway中,若pushgateway挂了,则多个监控节点都会受到影响。 |
| 2 | 通过单个 pushgateway监控多个实例时, pushgateway将会成为单点故障和潜在瓶颈。 |
| 3 | pushgateway可以持久化推送给它的所有监控数据。 因此,即使你的监控已经下线,prometheus还会拉取到旧的监控数据,因此,需要手动清理pushgateway下老旧的数据。 |
[pushgateway的使用场景与缺点]

1.3、pushgateway的安装部署

可在Download | Pushgateway界面下载pushgateway组件的二进制安装包

bash 复制代码
#pushgateway的下载安装
#1-下载pushgateway的二进制安装包
wget https://github.com/prometheus/pushgateway/releases/download/v1.11.2/pushgateway-1.11.2.linux-amd64.tar.gz -c -P /data


#2-解压下载好的pushgateway
cd /data
tar -zxvf pushgateway-1.11.2.linux-amd64.tar.gz -C /usr/local/
cd /usr/local/
mv pushgateway-1.11.2.linux-amd64 pushgateway-1.11.2
cd pushgateway-1.11.2/
ls


#3-编写操作pushgateway的服务
vi /usr/lib/systemd/system/pushgateway.service
#【/usr/lib/systemd/system/pushgateway.service】文件的完整内容如下:
[Unit]
Description=prometheus pushgateway
Documentation=https://github.com/prometheus/pushgateway
After=network.target

[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/pushgateway-1.11.2/pushgateway --web.listen-address=:9091 --web.enable-admin-api
ExecStop=/usr/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target


#4-启动pushgateway后并设置开机自启
systemctl daemon-reload
systemctl start pushgateway.service
systemctl status pushgateway.service
ps -ef | grep pushgateway
netstat -antlp | grep pushgateway
systemctl enable pushgateway.service
 
#5-打开浏览器访问【IP:9091】查看(注意:若是没法在浏览器打开访问则需要检查防火墙放开9091端口)
ip a

firewall-cmd --list-port
firewall-cmd --zone=public --add-port=9091/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port

1.4、prometheus中静态添加pushgateway配置

若需要将pushgateway配置为prometheus自动发现可查看《Prometheus+Grafana构建云原生分布式监控系统(七)

bash 复制代码
#prometheus中静态添加pushgateway配置
#1-进入prometheus路径编辑其配置文件【prometheus.yml】
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下添加pushgateway静态节点
scrape_configs:
config.
  - job_name: "prometheus"
 
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
 
    static_configs:
      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
        labels:
          app: "prometheus"
 
  - job_name: "pushgateway"
    static_configs:
      - targets: ["192.168.1.25:9091"]
        labels:
          app: "pushgateway"
 
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
 
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
 
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的【pushgateway】节点及其状态【up】表示在线【down】表示离线。

二、pushgateway的使用

2.1、推送到pushgateway的数据格式

|--------|---------------|------------------------------------------------------------|
| bash #推送到pushgateway的数据格式 http://<ip>:9091/metrics/job/<job-name>/<label-name>/<label-value> |||
| 序号 | 推送的数据格式参数 | 说明 |
| 1 | job-name | 是job标签的值,后面可以跟上任意数量的标签及其标签键值对;一般会添加一个instance/标签来区分指标数据来源。 |
| |||
| 3 | | |
| bash #推送数据的格式 metric_name{lable_name="label_value",...} value #推送数据示例1(如:推送的键是【ck_testjob】值是【26.126】的数据且属于cktest组【 #但是这样推送的instance对应的值是不对的(用了pushgateway所在主机的IP)】) echo "ck_testjob 26.126" | curl --data-binary @- http://192.168.1.25:9091/metrics/job/cktest 《1》"ck_testjob 26.126" 表示推送的键【ck_testjob】和值【26.126】; 《2》job/cktest 表示job_name是【job=cktest】,多个标签值则直接往后添加即可; 《3》data-binary 表示以二进制格式发送post请求。 注意:除【ck_testjob】指标外,同时还新增了【push_time_seconds】和【push_failure_time_seconds】两个指标,这两个是 PushGateway 系统自动生成的相关指标。 |||
| bash #推送数据示例2(如:推送的键是【ck_testjob】值是【26.126】的数据且属于{job="cktest",instance="192.168.1.9"}组 #一次发送多条数据到{job="cktest",instance="192.168.1.9"}组中 cat <<EOF | curl --data-binary @- http://192.168.1.25:9091/metrics/job/cktest/instance/192.168.1.9 # TYPE some_metric counter ck_test2{label="val1"} 2626 # TYPE another_metric gauge # HELP another_metric Just an example. ck_metrics 2026.126 EOF 注意:【/metrics/job/cktest】和【/metrics/job/cktest/instance/192.168.1.9】它们都属于【cktest】,但是它们属于两个指标值,因为 instance 对二者做了区分。 |||
[推送到pushgateway的数据格式]

注意: Prometheus 会给每个抓取的指标附加一个 jobinstance 的标签,job 标签来自 scrape 配置,我们这里抓取 Pushgateway 的 job 标签为 job="prometheus gateway"instance 标签的值会自动设置为抓取目标的主机和端口,所以所有从 Pushgateway 抓取的指标都会有 Pushgateway 的主机和端口作为 instance 标签,但是这可能会和你附加推送到 Pushgateway 指标上的 jobinstance 标签冲突,这个时候 Prometheus 会将这些标签重命名为 exported_jobexported_instance。但是,在抓取 Pushgateway 时,通常不希望出现这种行为。更多的时候你可能更希望保留推送到 Pushgateway 的指标的 jobinstance 标签,这个时候我们只需要在 Pushgateway 的抓取配置中设置 honor_labels: true 即可。

bash 复制代码
#解决prometheus中抓取的pushgateway里面的数据直接使用现有的instance值
#prometheus中静态添加的pushgateway配置里新增【honor_labels: true】
#1-进入prometheus路径编辑其配置文件【prometheus.yml】
cd /usr/local/prometheus-3.5.0/
vi prometheus.yml
#【prometheus.yml】的最后【scrape_configs】下修改pushgateway静态节点
scrape_configs:
config.
  - job_name: "prometheus"
 
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
 
    static_configs:
      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
        labels:
          app: "prometheus"
 
  - job_name: "pushgateway"
    honor_labels: true
    static_configs:
      - targets: ["192.168.1.25:9091"]
        labels:
          app: "pushgateway"
 
#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
./promtool check config prometheus.yml
 
#验证prometheus.yml文件中的语法正确后热重载让配置生效
curl -XPOST localhost:9090/-/reload
 
#然后打开浏览器进入Prometheus Server的Web界面【IP:9090】查看【Status-->Target health】即可看到添加的【pushgateway】节点及其状态【up】表示在线【down】表示离线。

2.2、复杂数据推送到pushgateway

如果一次性推送数据较多,可以将要推送的数据写到一个文件中,然后推送文件即可:

bash 复制代码
#复杂数据的推送示例

#1-将需推送的数据写入文件中
vi cktestdata.txt
#【cktestdata.txt】文件的完整内容如下:
# TYPE http_request_total counter
# HELP http_request_total get interface request count with different code.
http_request_total{code="200",interface="/v1/save"} 1679
http_request_total{code="404",interface="/v1/delete"} 6
http_request_total{code="500",interface="/v1/save"} 3
# TYPE http_request_time gauge
# HELP http_request_time get core interface http request time.
http_request_time{code="200",interface="/v1/core"} 0.362


#2-将数据文件推送到pushgateway中
curl -XPOST --data-binary @cktestdata.txt http://192.168.1.25:9091/metrics/job/app/instance/app-192.168.1.9


#3-在pushgateway【192.168.1.25:9091】的metrics下可以查看到对应的app组及其相关数据内容

2.3、编写采集脚本定时推送数据到pushgateway

shell脚本编程(九)_awkhttps://coffeemilk.blog.csdn.net/article/details/156954391shell脚本编程(七)-列表for循环https://coffeemilk.blog.csdn.net/article/details/156889172linux的定时任务https://blog.csdn.net/xiaochenXIHUA/article/details/149882125

在一些场景下,可以自定义一些脚本采集数据,然后推送到pushgateway。

bash 复制代码
#编写采集脚本定时推送数据到pushgateway
#示例:实现获取Linux主机的磁盘使用状态数据定时推送到pushgateway

#1-编写获取Linux主机磁盘使用状态数据的shell脚本
vi disk-usage-status.sh
#【disk-usage-status.sh】文件的完整内容如下:
#!/bin/bash
#filename=disk-usage-status.sh

hostname=`hostname -f | cut -d '.' -f1`

metrics=""
for line in `df |awk 'NR>1{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 "#Get the disk usage of a Linux host.\n$metrics" | curl --data-binary @- http://192.168.1.25:9091/metrics/job/pushgateway/instance/$hostname


#2-先手动执行一次查看效果
bash /data/shell/disk-usage-status.sh


#3-手动执行成功后在将这个脚本放到定时任务中,定期执行(如实现每分钟执行1次)
crontab -e
* * * * *  /bin/bash /data/shell/disk-usage-status.sh
#查看定时任务的最新执行日志
tail -f /var/log/cron

2.4、删除pushgateway中的数据

|--------|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | 删除pushgateway中的数据 | 说明 |
| 1 | 删除指定组数据 | 直接在pushgateway的web界面【ip:9091】的Metrics下选中需删除的组点击【Delete Group】按钮删除即可,如下图所示: |
| 1 | 删除指定组数据 | bash #直接调用接口删除指定组 #示例1:删除job="cktest"命令 curl -X DELETE http://192.168.1.25:9091/metrics/job/cktest #2-示例2:删除job="cktest" instance="192.168.1.9"命令 curl -X DELETE http://192.168.1.25:9091/metrics/job/cktest/instance/192.168.1.9 |
| 2 | 删除所有group下的 所有metrics数据 | 注意:在删除所有group下的所有metrics数据前需要给pushgateway在启动时需添加上【--web.enable-admin-api 】参数,并重启该pushgateway服务。 bash #删除所有group下的所有metrics数据命令 curl -X PUT http://192.168.1.25:9091/api/v1/admin/wipe |
| 说明: 《1》删除数据是以组(Group)为单位的,Group由job name和URL中的label唯一标识; 《2》如上删除示例中的删除{job="cktest"}数据的语句并不会删除{job="cktest",instance="192.168.1.9"}的数据。因为属于不同的Group。如需要删除{job="cktest",instance="192.168.1.9"}下的数据,需要指定完整标签。 《3》这里删除数据是指删除pushgateway中的数据,跟promethues没有关系。 |||
[删除pushgateway中的数据]

2.5、pushgateway使用的注意事项

|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 序号 | pushgateway使用的注意事项 |
| 1 | 指标值只能是数字类型,非数字类型报错。 |
| 2 | 指标值支持最大长度为 16 位,超过16 位后默认置为 0 |
| 3 | pushgateway 推送及 prometheus 拉取时间:设置 Prometheus 每次从 PushGateway 拉取的数据,并不是拉取周期内用户推送上来的所有数据,而是用户最后一次 Push 到 PushGateway 上的数据; 所以建议设置推送时间小于或等于 Prometheus 拉取的时间,这样保证每次拉取的数据是最新 Push 上来的。 《1》修改定时任务的时间: 《2》修改prometheus.yml里面关于pushgateway的job_name节点下的拉取间隔时间【添加( scrape_interval: 120s)参数后重启服务】 |
[pushgateway使用的注意事项]

三、pushgateway的数据持久化

pushgateway 默认是不做数据持久化操作的,这样当 pushgateway 重启或者异常挂掉,就会导致数据的丢失;不过可以通过 pushgateway 启动时添加【 --persistence.file 】和 【--persistence.interval】参数来持久化数据。

《1》【--persistence.file】参数是:指定持久化文件路径或名称。若没有指定存储,则监控指标仅保存在内存中,若出现pushgateway重启或意外故障,便会导致数据丢失。默认情况下,持久化文件每5分钟写一次。

《2》【--persistence.interval】参数是:重新设置写入文件的时间间隔(可以自定义时间)。

bash 复制代码
#pushgateway的数据持久化

#1-修改pushgateway.service文件的中pushgateway启动时内容添加持久化参数
vi /usr/lib/systemd/system/pushgateway.service

#【/usr/lib/systemd/system/pushgateway.service】文件的完整内容如下:
[Unit]
Description=prometheus pushgateway
Documentation=https://github.com/prometheus/pushgateway
After=network.target

[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/pushgateway-1.11.2/pushgateway --web.listen-address=:9091 --web.enable-admin-api --persistence.file=/usr/local/pushgateway-1.11.2/pushgateway_persist_file --persistence.interval=2m
ExecStop=/usr/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target


#2-重启pushgateway服务
systemctl daemon-reload
systemctl restart pushgateway.service

#3-最后可以到指定的目录【/usr/local/pushgateway-1.11.2】查看在时间间隔内是否有持久化文件【pushgateway_persist_file】生成
相关推荐
2401_840192273 小时前
ZooKeeper 单机部署指南
分布式·zookeeper·云原生
江畔何人初3 小时前
Linux 重要目录:/boot、/dev、/etc、/home
linux·运维·云原生
cyber_两只龙宝6 小时前
LVS-DR模式实验配置及原理详解
linux·网络·云原生·智能路由器·lvs·dr模式
水上冰石1 天前
Kubernetes Ingress + TLS 故障排查全流程
云原生·容器·kubernetes
岁岁种桃花儿1 天前
K8s核心流量管理:Ingress与Service深度解析及实战对比
云原生·容器·kubernetes
晚霞的不甘1 天前
Flutter for OpenHarmony 进阶实战:打造 60FPS 流畅的物理切水果游戏
javascript·flutter·游戏·云原生·正则表达式
市安1 天前
docker命令知识点1
运维·docker·云原生·容器·eureka
天才奇男子1 天前
LVS原理及部署
linux·运维·云原生·wpf·lvs·linux chrony
fo安方1 天前
软考~系统规划与管理师考试——真题篇——章节——第10章 云原生系统规划——解析版
云原生·项目管理·系统·软考·pmp·规划