Pushgateway为Prometheus整体监控方案的功能组件之一,并做为一个独立的工具存在。它主要用于Prometheus无法直接拿到监控指标的场景,如监控源位于防火墙之后,Prometheus无法穿透防火墙;目标服务没有可抓取监控数据的端点等多种情况。在类似场景中,可通过部署Pushgateway的方式解决问题。
当部署该组件后,监控源通过主动发送监控数据到Pushgateway,再由Prometheus定时获取信息,实现资源的状态监控。
工作流程:
下载安装包
wget https://github.com/prometheus/pushgateway/releases/download/v1.4.3/pushgateway-1.4.3.linux-amd64.tar.gz
tar zxvf pushgateway-1.4.3.linux-amd64.tar.gz -C /usr/local/
cp /usr/local/pushgateway-1.4.3.linux-amd64/pushgateway /usr/local/bin/
查看版本号验证是否正常
修改配置
scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['192.168.75.160:9091']
labels:
instance: pushgatewayCopy
重启Prometheus,启动服务,默认端口为9091
,可通过--web.listen-address
更改监听端口
pushgateway &
docker pull prom/pushgateway
docker run -d --name=pushgateway -p 9091:9091 prom/pushgateway
部署完成后,在浏览器输入http://192.168.75.160:9091/# 即可看到程序界面
pushgateway
的数据推送支持两种方式,Prometheus Client SDK
推送和API推送。
Prometheus本身提供了支持多种语言的SDK,可通过SDK的方式,生成相关的数据,并推送到pushgateway,这也是官方推荐的方案。
目前的SDK覆盖语言有官方的:
也有许多第三方的,详情可参见此链接:https://prometheus.io/docs/instrumenting/clientlibs/,https://www.172173.com/2022/04/01/Prometheus-Pushgateway/
在其他机器上提交数据测试
echo "some_metric 3.14" | curl --data-binary @- http://192.168.75.160:9091/metrics/job/some_job
本示例以python为例,讲解SDK的使用,复制以下代码到vscode中,并安装prometheus_client,pip install prometheus_client
[root@grafana ~]# cat push.py
from prometheus_client import Counter,Gauge,push_to_gateway
from prometheus_client.core import CollectorRegistry
registry = CollectorRegistry()
data1 = Gauge('gauge_test_metric','This is a gauge-test-metric',['method','path','instance'],registry=registry)
data1.labels(method='get',path='/aaa',instance='instance1').inc(3)
push_to_gateway('192.168.75.160:9091', job='test-job',registry=registry)
第一、二行代码:引入Python的Prometheus SDK;
第五行代码:创建相关的指标,类型为Gauge。其中“gauge_test_metric”为指标名称,'This is a gauge-test-metric’为指标注释,[‘method’,‘path’,‘instance’] 为指标相关的label。
第六行代码:添加相关的label信息和指标value 值。
第七行代码:push数据到pushgateway,'192.168.75.161:9091’为发送地址,job指定该任务名称。
以上代码产生的指标数据等同如下 :
# HELP gauge_test_metric This is a gauge-test-metric
# TYPE gauge_test_metric gauge
gauge_test_metric{instance="instance1",method="get",path="/aaa"} 3.0
通过调用pushgateway API的方式实现数据的推送。
请求格式:
/metrics/job/<jobname>{/instance/instance_name}
将用作Job标签的值,然后是其他指定的标签。
示例:
本例中定义了两个标签 job=pushget-job和instance=instance1,并推送了指标 http_request_total 及其value值,192.168.75.161 为pushgateway地址。
echo 'http_request_total 12' |curl --data-binary @- http://192.168.75.160:9091/metrics/job/pushget-job/instance/instance1
复杂数据发送:
cat <<EOF | curl --data-binary @- http://192.168.75.160:9091/metrics/job/pushgettest/instance/192.168.75.161
# TYPE http_request_total1 counter
http_request_total1{code="200",path="/aaa"} 46
http_request_total1{code="200",path="/bbb"} 15
EOF
假如需要删除pushgateway上面存储的指标信息,可通过如下方式操作:
删除某个组下某个实例的所有数据
curl -X DELETE http://192.168.75.160:9091/metrics/job/pushgettest/instance/192.168.75.161
curl -X DELETE http://192.168.75.160:9091/metrics/job/some_job
- job_name: 'pushgateway'
static_configs:
- targets: ['192.168.75.160:9091']
labels:
instance: pushgatewayCopy
通过Pushgateway方式,Prometheus无法直接检测到监控源服务的状态,故此种方式不适用于监控服务的存活状态等场景。
Pushgateway属于静态代理,它接收的指标不存在过期时间,故会一直保留直到该指标被更新或删除。此种情况下,不再使用的指标可能存在于网关中。
如上所言,Pushgateway并不算是完美的解决方案,在监控中更多做为辅助方案存在,用于解决Prometheus无法直接获取数据的场景。
上一篇:Prometheus监控实战系列十三:告警管理
下一篇:Prometheus监控实战系列十五:Exporter详解