云原生之深入解析Prometheus Pushgetway的原理分析和实战操作

一、Pushgetway 简介

  • Pushgateway 是 Prometheus 的一个组件,Prometheus server 默认是通过 Exporter 主动获取数据(默认采取 pull 拉取数据),Pushgateway 则是通过 exporter 主动方式推送数据到 Pushgateway,再由 Prometheus 主动去拉取 Pushgateway 数据,用户可以写一些自定义的监控脚本把需要监控的数据发送给 Pushgateway。从 Prometheus server 角度看,都是由 Prometheus server 主动去拉取各个数据源(如 Exporter 和 Pushgateway)的数据。
  • Pushgateway 的优点:
    • Prometheus 默认采用定时 pull 模式拉取 targets 数据,但是如果不在一个子网或者防火墙,Prometheus 就拉取不到 targets 数据,因此可以采用各个 target 往 pushgateway 上 push 数据,然后 Prometheus 去 Pushgateway 上定时 pull 数据;
    • 在监控业务数据的时候,需要将不同数据汇总,汇总之后的数据可以由 Pushgateway 统一收集,然后由 Prometheus 统一拉取,起到给 Prometheus 减压的作用;
    • 自定义采集指标简单。
  • Pushgateway 的缺点:
    • Prometheus 拉取状态只针对 Pushgateway,不能对每个节点都有效;
    • Pushgateway 出现问题,整个采集到的数据都会出现问题;
    • Pushgateway 可以持久化推送给它的所有监控数据,因此即使监控已经下线,Prometheus 还会拉取到旧的监控数据,需要手动清理 Pushgateway 不要的数据。
  • Prometheus 的深入学习请参考:
  • 关于 Prometheus 整体分析,可以参考我之前的博客:云原生之深入解析Prometheus的安装部署和原理分析

在这里插入图片描述

二、Pushgateway 架构

  • Pushgateway 就是个数据中转站,提供 API,支持数据生产者随时将数据推送过来。
  • Pushgateway 提供 exporter 功能,在 Promethus server 拉取数据时,将自己保存的数据反馈给 Promethus server 端。

在这里插入图片描述

三、Prometheus server 安装

① 下载

  • Prometheus 基于 Golang 编写,编译后的软件包,不依赖于任何的第三方依赖,只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启 Prometheus Server:(下载地址:Prometheus server):
wget https://github.com/prometheus/prometheus/releases/download/v2.40.6/prometheus-2.40.6.linux-amd64.tar.gz

tar -xf prometheus-2.40.6.linux-amd64.tar.gz

② 配置

  • 解压后当前目录会包含默认的 Prometheus 配置文件 promethes.yml,如下配置文件做下简略的解析:
# 全局配置
global:
  scrape_interval:     15s # 设置抓取间隔,默认为1分钟
  evaluation_interval: 15s #估算规则的默认周期,每15秒计算一次规则。默认1分钟
  # scrape_timeout  #默认抓取超时,默认为10s

# Alertmanager相关配置
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# 规则文件列表,使用'evaluation_interval' 参数去抓取
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

#  抓取配置列表
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

③ 启动服务

# 查看帮助
./prometheus -h

# 直接启动服务,但是不提倡这种,因为退出控制台服务也就退出了,虽然可以加nohup启动,但是也不是特别友好,下面将配置prometheus.server启动
# 默认端口是:9090,如需要修改默认端口,可以使用--web.listen-address=:9099,还可以指定配置文件--config.file=prometheus.yml
./prometheus
  • 配置 prometheus.service 启动脚本:
cat >/usr/lib/systemd/system/prometheus.service<<EOF
[Unit]
Description=Prometheus
After=network.target
[Service]
Type=simple
ExecStart=/opt/prometheus/prometheus_server/prometheus-2.40.6.linux-amd64/prometheus --config.file=/opt/prometheus/prometheus_server/prometheus-2.40.6.linux-amd64/prometheus.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
  • 启动服务:
# 执行 systemctl daemon-reload 命令重新加载systemd
systemctl daemon-reload
# 启动
systemctl start prometheus
# 检查
systemctl status prometheus
netstat -tnlp|grep :9090
ps -ef|grep prometheus

在这里插入图片描述

  • web 访问 http://ip:9090:

在这里插入图片描述

四、Pushgateway 安装

① 下载

wget https://github.com/prometheus/pushgateway/releases/download/v1.5.1/pushgateway-1.5.1.linux-amd64.tar.gz

② 启动服务

# 查看帮助
./pushgateway  -h

# 启动服务,这里也不使用直接启动的方式,配置pushgateway.service启动
./pushgateway
  • 默认监听的是 9091 端口,可以通过以下配置进行更改:
usage: pushgateway [<flags>]
Flags:
      --web.listen-address=":9091"  		监听Web界面,API和遥测的地址
      --web.telemetry-path="/metrics"  		公开metrics的路径
      --web.external-url=        			可从外部访问PushgatewayURL
      --web.route-prefix=""      			Web端点内部路由的前缀。 默认为--web.external-url的路径
      --persistence.file=""      			归档以保留metrics。 如果为空,则metrics仅保留在内存中
      --persistence.interval=5m  			写入持久性文件的最小间隔
      --log.level="info"         			仅记录具有给定严重性或更高严重性的消息。 有效级别:[debug, info, warn, error, fatal]
      --log.format="logger:stderr"  		设置日志目标和格式,示例:“ logger:syslog?appname = bob&local = 7”或“ logger:stdout?json = true--version                  			显示应用程序版本
  • 配置 pushgateway.service 启动脚本:
cat >/usr/lib/systemd/system/pushgateway.service<<EOF
[Unit]
Description=Pushgetway
After=network.target
[Service]
Type=simple
ExecStart=/opt/prometheus/pushgateway/pushgateway-1.5.1.linux-amd64/pushgateway
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
  • 启动服务:
# 执行 systemctl daemon-reload 命令重新加载systemd
systemctl daemon-reload
# 启动
systemctl start pushgateway
# 检查
systemctl status pushgateway
netstat -tnlp|grep :9091
ps -ef|grep pushgateway

在这里插入图片描述

  • web 访问 ip:9091/metrics:

在这里插入图片描述

③ 接入Prometheus

  • 更改 prometheus 配置文件,增加如下内容:
  - job_name: 'pushgateway_name' 
    scrape_interval: 30s 
    honor_labels: true  #加上此配置,exporter节点上传数据中的一些标签将不会被pushgateway节点的相同标签覆盖 
    static_configs: 
        - targets: ["192.168.182.110:9091"] 
          labels: 
              instance: pushgateway_instance               
# pushgateway 中的数据我们通常按照 job 和 instance 分组分类,所以这两个参数不可缺少
  • 重启 Prometheus 服务,或进行热加载:
# curl -X POST http://192.168.182.110:9090/-/reload
systemctl restatus prometheus
  • 再查看 prometheus web 界面 http://ip:9090/targets:

在这里插入图片描述

五、实战操作演示

① 推送数据

  • 推送路径的 URL 部分定义为(其中 job 是必须参数,label_name 部分是可选的,URL 中的 job 和 label 组合唯一标识 pushgateway 中的 Group):
/metrics/job/<JOB_NAME>{
    
    /<LABEL_NAME>/<LABEL_VALUE>}
  • 在推送的数据部分,格式定义如下:
## TYPE metric_name type
metric_name{
    
    lable_name="label_value",...}  value
  • 推送一个 group 定义为 {job=“some_job”} 的数据:
echo "some_metric 3.14" | curl --data-binary @- http://192.168.182.110:9091/metrics/job/some_job
  • 推送一个 group 定义为 {job=“some_job”,instance=“some_instance”} 的数据:
#  --data-binary 表示发送二进制数据,注意:它是使用POST方式发送的!
cat <<EOF | curl --data-binary @- http://192.168.182.110:9091/metrics/job/some_job/instance/some_instance
  # TYPE some_metric counter
  some_metric2{
    
    label="val1"} 42
  # TYPE another_metric gauge
  # HELP another_metric Just an example.
  another_metric 2398.283
EOF

② 删除数据

  • 删除 group 定义为 {job=“some_job”} 下的所有数据:
curl -X DELETE http://192.168.182.110:9091/metrics/job/some_job/instance/some_instance
  • 删除所有 group 下的所有 metrics (启动 pushgateway 时需加上命令行参数–web.enable-admin-api):
curl -X PUT http://192.168.182.110: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 采集

  • 模版如下:
cat <<EOF | curl --data-binary @- http://192.168.182.110:9091/metrics/job/some_job/instance/some_instance
# A histogram, which has a pretty complex representation in the text format:
# HELP http_request_duration_seconds A histogram of the request duration.
# TYPE http_request_duration_seconds histogram
disk_usage{
    
    instance="local-168-182-110",job="disk",disk_name="/run/user/0"} 11
disk_usage{
    
    instance="local-168-182-110",job="disk",disk_name="/run/user/1"} 22
disk_usage{
    
    instance="local-168-182-110",job="disk",disk_name="/run/user/2"} 33
disk_usage{
    
    instance="local-168-182-110",job="disk",disk_name="/run/user/3"} 44
disk_usage{
    
    instance="local-168-182-110",job="disk",disk_name="/run/user/4"} 55
EOF
  • 编写采集脚本推送数据到 Pushgateway:
cat >disk_usage_metris.sh<<EOF
#!/bin/bash

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 "# A histogram, which has a pretty complex representation in the text format:\n# HELP http_request_duration_seconds A histogram of the request duration.\n# TYPE http_request_duration_seconds histogram\n$metrics" | curl --data-binary @- http://192.168.182.110:9091/metrics/job/pushgateway/instance/disk_usage
EOF
  • 查看 Pushgetway web:

在这里插入图片描述

  • 查看 Prometheus web:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Forever_wj/article/details/131865621