Pushgateway部署

Pushgateway 简介

Pushgateway 是 Prometheus 生态中一个重要工具,使用它的原因主要是:

  • Prometheus 采用pull模式,可能由于不在一个子网或者防火墙原因,导致 Prometheus 无法直接拉取各个 target 数据。
    在监控业务数据的时候,需要将不同数据汇总, 由 Prometheus 统一收集。

由于以上原因,不得不使用pushgateway,但在使用之前,有必要了解一下它的一些弊端:

  • 将多个节点数据汇总到 pushgateway, 如果 pushgateway 挂了,受影响比多个 target 大。
    Prometheus 拉取状态 up 只针对 pushgateway, 无法做到对每个节点有效。

  • Pushgateway可以持久化推送给它的所有监控数据。

因此,即使你的监控已经下线,prometheus 还会拉取到旧的监控数据,需要手动清理 pushgateway 不要的数据。

  • 下载Pushgateway:
cd /opt/prometheus_exporter

# wget https://github.com/prometheus/pushgateway/releases/download/v0.4.0/pushgateway-0.4.0.linux-amd64.tar.gz

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

tar -zxvf pushgateway-1.4.2.linux-amd64.tar.gz

mv pushgateway-1.4.2.linux-amd64 pushgateway_exporter

chown -R prometheus:prometheus /opt/prometheus_exporter/
  • 安装Pushgateway:
chown -R prometheus:prometheus /opt/prometheus_exporter/

# 使用systemd进行管理blackbox_exporter服务
vim /usr/lib/systemd/system/pushgateway.service
[Unit]
Description=pushgateway
After=network.target

[Service]
User=root
Type=simple
ExecStart=/opt/prometheus_exporter/pushgateway_exporter/pushgateway 
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • 启动pushgateway:
# 重新加载并启动
systemctl daemon-reload
systemctl enable pushgateway && systemctl start pushgateway
systemctl status pushgateway

[root@prometheus pushgateway]# netstat -lntp | grep pushgateway
tcp6       0      0 :::9091                 :::*                    LISTEN      16498/blackbox_expo
# 查看日志
journalctl -u pushgateway -fn 200
  • 浏览器访问:
http://XX.XX.XX.XX:9091/metrics
[root@prometheus pushgateway_exporter]# curl http://localhost:9091/metrics | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  602# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
6# TYPE go_gc_duration_seconds summary
 go_gc_duration_seconds{quantile="0"} 2.4241e-05
 go_gc_duration_seconds{quantile="0.25"} 2.4241e-05
 go_gc_duration_seconds{quantile="0.5"} 0.00058479
 go_gc_duration_seconds{quantile="0.75"} 0.00058479
0go_gc_duration_seconds{quantile="1"} 0.00058479
 go_gc_duration_seconds_sum 0.000609031
 go_gc_duration_seconds_count 2
6# HELP go_goroutines Number of goroutines that currently exist.
026    0     0   999k      0 --:--:-- --:--:-- --:--:-- 1176k
(23) Failed writing body
[root@prometheus pushgateway_exporter]#
[root@prometheus pushgateway_exporter]# curl http://localhost:9115/metrics | grep 'pushgateway'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  8520    0  8520    0     0  1571k      0 --:--:-- --:--:-- --:--:-- 1664k

  • 修改prometheus配置,添加pushgateway
vim prometheus.yml
  - job_name: 'pushgateway'
    honor_labels: true   #避免收集数据本身的 job 和 instance被pushgateway实例信息覆盖
    static_configs:
    - targets: ['localhost:9091']
      labels:
        instance: pushgateway
  • 重启prometheus
systemctl restart prometheus
数据管理

正常情况我们会使用 Client SDK 推送数据到 pushgateway, 但是我们还可以通过 API 来管理, 例如:

  • 向 {job="some_job"} 添加单条数据:
echo "some_metric 3.14" | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job
  • 添加更多更复杂数据,通常数据会带上 instance, 表示来源位置:
cat <<EOF | curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/some_job/instance/some_instance
# TYPE some_metric counter
some_metric{label="val1"} 42
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF
  • 删除某个组下的某实例的所有数据:
curl -X DELETE http://pushgateway.example.org:9091/metrics/job/some_job/instance/some_instance
  • 删除某个组下的所有数据:
curl -X DELETE http://pushgateway.example.org:9091/metrics/job/some_job

可以发现 pushgateway 中的数据我们通常按照 job 和 instance 分组分类,所以这两个参数不可缺少。

因为 Prometheus 配置 pushgateway 的时候,也会指定 job 和 instance, 但是它只表示 pushgateway 实例,不能真正表达收集数据的含义。所以在 prometheus 中配置 pushgateway 的时候,需要添加 honor_labels: true 参数,
从而避免收集数据本身的 job 和 instance 被覆盖。

注意,为了防止 pushgateway 重启或意外挂掉,导致数据丢失,我们可以通过 -persistence.file 和 -persistence.interval 参数将数据持久化下来。

上一篇:ERROR : PHP中错误基础


下一篇:2019-04-11-day030-网络编程并发