Prometheus的Pushgateway使用

1、Pushgateway 简介

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

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

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

  • 将多个节点数据汇总到 pushgateway, 如果 pushgateway 挂了,受影响比多个 target 大。
  • Prometheus 拉取状态 up 只针对 pushgateway, 无法做到对每个节点有效。
  • Pushgateway 可以持久化推送给它的所有监控数据。

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

监控数据采集过程

image-20200428172325251

2、Pushgateway 安装和配置

2.1 二进制安装

使用wget下载,解压pushgateway

1
2
3
wget https://github.com/prometheus/pushgateway/releases/download/v1.2.0/pushgateway-1.2.0.linux-amd64.tar.gz
tar xf pushgateway-1.2.0.linux-amd64.tar.gz
cd pushgateway-1.2.0.linux-amd64/

启动pushgateway

使用前可以执行 ./pushgateway -h 查看运行选项,如果看到类似输出,表示启动成功

1
2
3
4
./pushgateway --web.listen-address=":9091" --web.telemetry-path="/metrics"
level=info ts=2020-04-28T01:51:32.553Z caller=main.go:83 msg="starting pushgateway" version="(version=1.2.0,
level=info ts=2020-04-28T01:51:32.553Z caller=main.go:84 build_context="(go=go1.13.8, user=root@0e823ccfff84
level=info ts=2020-04-28T01:51:32.557Z caller=main.go:137 listen_address=:9091

2.2 配置prometheus

1
2
3
4
5
6
7
8
9
10
- job_name: 'prometheus_pushgateway_dev-test'
scrape_interval: 13s
honor_labels: true
metrics_path: '/metrics'
# params:
# 'match[]':
# - '{cluster=~"dev-test*"}'
static_configs:
- targets: ['39.96.27.21:9091']
labels: {cluster: 'dev-test'}

加载或重启prometheus,使其配置生效

1
curl -X POST http://127.0.0.1:9090/-/reload

访问prometheus页面的targets,等待几秒钟,pushgateway状态为UP

image-20200428173903072

3、数据管理

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

{job="some_job"} 添加单条数据:

1
echo "some_metric 3.14" | curl --data-binary @- http://192.168.5.248:9091/metrics/job/some_job

–data-binary 表示发送二进制数据,注意:它是使用POST方式发送的!

添加更多更复杂数据,通常数据会带上 instance, 表示来源位置:

1
2
3
4
5
6
7
cat <<EOF | curl --data-binary @- http://192.168.5.248: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

删除某个组下的某实例的所有数据:

1
curl -X DELETE http://192.168.5.248:9091/metrics/job/some_job/instance/some_instance

删除某个组下的所有数据:

1
curl -X DELETE http://192.168.5.248:9091/metrics/job/some_job

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

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

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

4、业务代码监控埋点

参考:使用Client Java构建Exporter程序官方文档

-------------本文结束感谢您的阅读-------------