运维管理
MrDoc 速记插件
Docker 安装 mrdoc (开源版)
Docker-compose 安装 mrdoc
Linux之smartctl命令磁盘检测运维
Nginx配置服务并开机启动
yum安装与卸载软件常见命令「建议收藏」
yum 命令使用讲解
Nginx 映射本地静态文件
CentOS7.9 Docker部署Leanote
Nginx配置中的log_format
修改或者隐藏Nginx的版本号
centos编译安装方式升级snmpwalk命令到5.9.1从而支持SHA-512鉴权协议测试
PVE的local和local-lvm
markdown之群晖自建图床
Wireshark介绍及抓包分析
自定义数据推送到pushgateway及推送数据的注意事项
Prometheus监控实战系列十四:Pushgateway
使用 PushGateway 进行数据上报采集
RHEL6.0 yum安装报warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY错误-CSDN博客
烂泥:openvpn配置文件详解-烂泥行天下
RHEL系统以FTP服务器搭建yum源_rhel9 安装 ftp yum
详解用Navicat工具将Excel中的数据导入Mysql中 - Steven* - 博客园
Linux禁止ping以及开启ping的方法 - chenshoubiao - 博客园
MobaXterm设置无密码登录丨Pro Linux 基础篇
CentOS 安装 MySQL8,超详细!
percona-xtrabackup备份及恢复mysql操作
教你玩转MySQL8物理备份利器Xtrabackup
PVE浏览器中文设置
2024年PVE8最新安装使用指南|新手入门|安装|优化|Proxmox VE 8.1__什么值得买
sendmail发邮件注意事项
如何使用sqlite将db文件转成txt文件
一文让你学会,开源WAF雷池SafeLine
iptables按照指定国家屏蔽(GEOIP模块的安装与使用)
py3 容器适配conda24.3.0
CentOS7 配置 nginx 和 php 方案
Sakura Panel搭建教程-搭建属于自己的FRP管理面板
markdown之群晖自建图床
Debian12安装教程(保姆级)
CentOS 6.9密码修改
CentOS7如果忘记密码,密码重置详细步骤,保姆级教程。
利用CertBot实现免费SSL证书的自动签发与续签
证书3月一换很麻烦?一行命令让你解放双手
阿里云域名自动签发泛域名证书配置(最新篇)
Certimate证书自动续签
Auto-SSL
ubuntu忘记密码问题解决
Ubantu启动失败,提示“Started GNOME Display Manager”
kali网络配置(及配置ssh远程连接)
SSL证书--Let’s Encrypt和TrustAsia哪个好
PVE安装ikuai、openwrt以及lxc容器安装docker
Fail2Ban安全配置与应用
本文档使用 MrDoc 发布
-
+
首页
使用 PushGateway 进行数据上报采集
转载自:[https://cloud.tencent.com/developer/article/1531821](https://cloud.tencent.com/developer/article/1531821) ## 1、PushGateway 介绍 > Prometheus 是一套开源的系统监控、报警、时间序列数据库的组合,最初有 SoundCloud 开发的,后来随着越来越多公司使用,于是便独立成开源项目。Prometheus 基本原理是通过 Http 协议周期性抓取被监控组件的状态,而输出这些被监控的组件的 Http 接口为 Exporter。PushGateway 作为 Prometheus 生态中的一个重要一员,它允许任何客户端向其 Push 符合规范的自定义监控指标,在结合 Prometheus 统一收集监控。 PushGateway 使用场景: - Prometheus 采用定时 Pull 模式,可能由于子网络或者防火墙的原因,不能直接拉取各个 Target 的指标数据,此时可以采用各个 Target 往 PushGateway 上 Push 数据,然后 Prometheus 去 PushGateway 上定时 pull。 - 其次在监控各个业务数据时,需要将各个不同的业务数据进行统一汇总,此时也可以采用 PushGateway 来统一收集,然后 Prometheus 来统一拉取。 ## 2、环境、软件准备 本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本: - **Oracle VirtualBox**: 5.1.20 r114628 (Qt5.6.2) - **System**: CentOS Linux release 7.3.1611 (Core) - **Docker**: 18.06.1-ce - **Prometheus**: v2.11.1 - **PushGateway**: 1.0.0 注意:这里为了快速方便启动 Prometheus、PushGateway 服务,我使用 Docker 方式启动,所以本机需要安装好 Docker 环境,这里忽略 Docker 的安装过程。其中 Prometheus 安装配置,可以参照之前文章 [Prometheus 监控报警系统 AlertManager 之邮件告警](https://cloud.tencent.com/developer/article/1486483?from=10680),这里着重介绍一下如何启动并配置 PushGateway 并配置数据上报到 Prometheus。 ## 3、PushGateway 安装配置 PushGateway 安装很简单,可以使用二进制包解压安装服务,也可以使用 Docker 启动服务。 ### 3.1、二进制包安装 二进制包安装方式,直接从 [官方 Github](https://github.com/Prometheus/pushgateway) 下载最新二进制安装包,解压即可。 ```javascript $ wget https://github.com/prometheus/pushgateway/releases/download/v1.0.0/pushgateway-1.0.0.linux-amd64.tar.gz $ tar xzvf pushgateway-1.0.0.linux-amd64.tar.gz $ mv pushgateway-1.0.0.linux-amd64 /usr/local/pushgateway ``` 使用命令 `./pushgateway` 命令即可启动服务,此时浏览器访问 `http://<ip>:9091` 即可访问 UI 页面,只不过默认 Metrics 上没有任何数据展示,那是因为我们还没有往 PushGateway 上推送任何数据。  不过,PushGateway 服务本身是带了一些 Metrics 的,可以通过访问 `http://<ip>:9091/metrics` 地址来获取,可以看到里边包含了 go、process 等相关的一些监控指标。  ### 3.2、Docker 安装 使用 Docker 方式安装启动就更简单了,直接获取最新版官方镜像 `prom/pushgateway:latest` 启动命令如下: ```javascript $ docker run -d -p 9091:9091 prom/PushGateway ``` 启动完毕后,同上方法验证是否启动成功。这里为了方便演示,我采用 Docker 方式启动 PushGateway。 OK,现在 PushGateway 服务已经启动完毕,但是还没有跟 Prometheus 关联起来,我们需要的是通过 PushGateway 来上传自定义监控数据,然后通过 Prometheus 采集这些数据来进行监控。那么就需要将 PushGateway 添加到 Prometheus 目标任务中去,增加 `prometheus.yml` 配置如下: ```javascript ... - job_name: 'pushgateway' static_configs: - targets: ['172.30.12.167:9091'] labels: instance: pushgateway ``` 说明一下,这里采用 `static_configs` 静态配置方式,因为目前就一个 PushGateway,如果有多个可以考虑其他服务发现方式,来方便动态加载,具体可以参考 [这里](https://prometheus.io/docs/Prometheus/latest/configuration/configuration/#scrape_config)。配置完毕后,重启 Prometheus 服务,此时可以通过 Prometheus UI 页面的 Targets 下查看是否配置成功。  ## 4、API 方式 Push 数据到 PushGateway 接下来,我们要 Push 数据到 PushGateway 中,可以通过其提供的 API 标准接口来添加,默认 URL 地址为:`http://<ip>:9091/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}`,其中 `<JOBNAME>` 是必填项,为 job 标签值,后边可以跟任意数量的标签对,一般我们会添加一个 `instance/<INSTANCE_NAME>` 实例名称标签,来方便区分各个指标。 接下来,可以 Push 一个简单的指标数据到 PushGateway 中测试一下。 ```javascript $ echo "test_metric 123456" | curl --data-binary @- http://172.30.12.167:9091/metrics/job/test_job ``` 执行完毕,刷新一下 PushGateway UI 页面,此时就能看到刚添加的 `test_metric` 指标数据了。  不过我们会发现,除了 `test_metric` 外,同时还新增了 `push_time_seconds` 和 `push_failure_time_seconds` 两个指标,这两个是 PushGateway 系统自动生成的相关指标。此时,我们在 Prometheus UI 页面上 Graph 页面可以查询的到该指标了。  这里要着重提一下的是,上图中 `test_metric` 我们查询出来的结果为 `test_metric{exported_job="test_job",instance="pushgateway",job="pushgateway"}` ,眼尖的会发现这里头好像不太对劲,刚刚提交的指标所属 job 名称为 `test_job` ,为啥显示的为 `exported_job="test_job"` ,而 job 显示为 `job="pushgateway"` ,这显然不太正确,那这是因为啥?其实是因为 Prometheus 配置中的一个参数 `honor_labels` (默认为 `false`)决定的,我们不妨再 Push 一个数据,来演示下添加 `honor_labels: true` 参数前后的变化。 这次,我们 Push 一个复杂一些的,一次写入多个指标,而且每个指标添加 `TYPE` 及 `HELP` 说明。 ```javascript $ cat <<EOF | curl --data-binary @- http://172.30.12.167:9091/metrics/job/test_job/instance/test_instance # TYPE test_metrics counter test_metrics{label="app1",name="demo"} 100.00 # TYPE another_test_metrics gauge # HELP another_test_metrics Just an example. another_test_metrics 123.45 EOF ``` 添加完毕,再刷新一下 PushGateway UI 页面,可以看到添加的数据了。  从上图可以看出,`/metrics/job/test_job` 和 `metrics/job/test_job/instance/test_instance` 虽然它们都属于 `test_job`,但是它们属于两个指标值,因为 instance 对二者做了区分。此时我们访问 Prometheus UI 页面上 Graph 页面查询该指标。  依旧有问题,那么修改一下 `prometheus.yaml`,增加 `honor_labels: true` 参数配置如下: ```javascript ... - job_name: 'pushgateway' honor_labels: true static_configs: - targets: ['172.30.12.167:9091'] labels: instance: pushgateway ``` 重启 Prometheus,稍等一会,等到 Prometheus 采集到数据后,我们再访问 Prometheus UI 页面上 Graph 页面查询该指标。  此时,可以看到能够正确匹配到 Push 的指标值对应到 job 和 instance 上了。这里说明一下 `honor_labels` 的作用:因为 Prometheus 配置 PushGateway 的时候,也会指定 job 和 instance,但是它只表示 PushGateway 实例本身,不能真正表达收集数据的含义。所以配置 PushGateway 需要添加 `honor_labels:true` 参数,避免收集数据本身的 job 和 instance 被覆盖。详细可参考 [这里](https://prometheus.io/docs/Prometheus/latest/configuration/configuration/#scrape_config) 官网文档对该参数的说明。 上边我们 Push 指标数据是通过命令行追加方式,少量数据还凑合,如果需要 Push 的数据比较大时,就不太方便了,这里我们也可以通过将指标数据写入到文件,然后将文件内容提交,也可以正常添加到 PushGateway。新建一个指标数据文件 `pgdata.txt` 如下: ```javascript $ vim pgdata.txt # TYPE http_request_total counter # HELP http_request_total get interface request count with different code. http_request_total{code="200",interface="/v1/save"} 276 http_request_total{code="404",interface="/v1/delete"} 0 http_request_total{code="500",interface="/v1/save"} 1 # TYPE http_request_time gauge # HELP http_request_time get core interface http request time. http_request_time{code="200",interface="/v1/core"} 0.122 ``` 然后执行如下命令,将数据 Push 上去。 ```javascript curl -XPOST --data-binary @pgdata.txt http://172.30.12.167:9091/metrics/job/app/instance/app-172.30.0.0 ``` 执行完毕,在 PushGateway UI 页面同样能够查询的到。  最后,如果要删除某一个指标,同样可以通过 API 方式触发删除。例如删除 `job="test_job"` 组下的所有指标值,可以执行如下命令: ```javascript $ curl -X DELETE http://172.30.12.167:9091/metrics/job/test_job ``` 注意:删除 `job="test_job"` 组下的所有指标值,不包括 `{job="test_job", instance="test_instance"}` 中的指标值,虽然它们的 job 名称都为 `test_job`。如果想删除该指标值,那么需要执行如下命令: ```javascript curl -X DELETE http://172.30.12.167:9091/metrics/job/test_job/instance/test_instance ``` 同样,我们也可以在 PushGateway UI 页面指定指标记录后边,点击 `Delete Group` 按钮来删除,这里就不在演示了。 ## 5、用 Client SDK Push 数据到 Pushgateway 示例 通过 Client SDK 推送 metric 信息到 PushGateway,官方示例中支持 python、java、go 等不同语言类型 client,这里我以 java 语言为例,来演示下如何 Push 数据到 Pushgateway 中。 首先,`pom.xml` 中添加 `simpleclient_pushgateway` 依赖包。 ```javascript <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_pushgateway</artifactId> <version>0.7.0</version> </dependency> ``` 编写一个简单 demo 如下: ```javascript public static void main(String[] args) { try{ String url = "172.30.12.167:9091"; CollectorRegistry registry = new CollectorRegistry(); Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").create(); guage.set(23.12); guage.register(registry); PushGateway pg = new PushGateway(url); Map<String, String> groupingKey = new HashMap<String, String>(); groupingKey.put("instance", "my_instance"); pg.pushAdd(registry, "my_job", groupingKey); } catch (Exception e){ e.printStackTrace(); } } ``` 执行完毕后,访问一下 Pushgateway UI 页面,能够查询的到该指标。  上边列子比较简单,咱们在来一个稍微负载一些的,指定多个 label 标签组的指标。 ```javascript public static void main(String[] args) { try{ String url = "172.30.12.167:9091"; CollectorRegistry registry = new CollectorRegistry(); Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.").labelNames("app", "date").create(); String date = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date()); guage.labels("my-pushgateway-test-0", date).set(25); guage.labels("my-pushgateway-test-1", date).dec(); guage.labels("my-pushgateway-test-2", date).dec(2); guage.labels("my-pushgateway-test-3", date).inc(); guage.labels("my-pushgateway-test-4", date).inc(5); guage.register(registry); PushGateway pg = new PushGateway(url); Map<String, String> groupingKey = new HashMap<String, String>(); groupingKey.put("instance", "my_instance"); pg.pushAdd(registry, "my_job", groupingKey); } catch (Exception e){ e.printStackTrace(); } } ``` 同样,在 Pushgateway UI 页面,也能够查询的到该指标。  ## 6、使用 PushGateway 注意事项 - 指标值只能是数字类型,非数字类型报错。 $ echo "test\_metric 12.34.56ff" | curl --data-binary @- [http://172.30.12.167:9091/metrics/job/test\_job\_1](http://172.30.12.167:9091/metrics/job/test_job_1) text format parsing error in line 1: expected float as value, got "12.34.56ff" - 指标值支持最大长度为 16 位,超过16 位后默认置为 0 $ echo "test\_metric 1234567898765432123456789" | curl --data-binary @- [http://172.30.12.167:9091/metrics/job/test\_job\_2](http://172.30.12.167:9091/metrics/job/test_job_2) # 实际获取值 test\_metric{job="test\_job\_2"} 1234567898765432200000000 - PushGateway 数据持久化操作 默认 PushGateway 不做数据持久化操作,当 PushGateway 重启或者异常挂掉,导致数据的丢失,我们可以通过启动时添加 `-persistence.file` 和 `-persistence.interval` 参数来持久化数据。`-persistence.file` 表示本地持久化的文件,将 Push 的指标数据持久化保存到指定文件,`-persistence.interval` 表示本地持久化的指标数据保留时间,若设置为 5m,则表示 5 分钟后将删除存储的指标数据。 $ docker run -d -p 9091:9091 prom/pushgateway "-persistence.file=pg\_file –persistence.interval=5m" - PushGateway 推送及 Prometheus 拉取时间设置 Prometheus 每次从 PushGateway 拉取的数据,并不是拉取周期内用户推送上来的所有数据,而是最后一次 Push 到 PushGateway 上的数据,所以推荐设置推送时间小于或等于 Prometheus 拉取的时间,这样保证每次拉取的数据是最新 Push 上来的。 **参考资料** - [Github PushGateway](https://github.com/prometheus/pushgateway) - [Github PushGateway client-java](https://github.com/prometheus/client_java#exporting-to-a-pushgateway) - [Prometheus Docs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)
adouk
2024年7月29日 09:22
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码