一、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
四、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= 可从外部访问Pushgateway 的URL
- - 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
③ 接入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 分组分类,所以这两个参数不可缺少
# 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
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