使用 PushGateway 进行数据上报采集
转载自: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 之邮件告警,这里着重介绍一下如何启动并配置 PushGateway 并配置数据上报到 Prometheus。
3、PushGateway 安装配置
PushGateway 安装很简单,可以使用二进制包解压安装服务,也可以使用 Docker 启动服务。
3.1、二进制包安装
二进制包安装方式,直接从 官方 Github 下载最新二进制安装包,解压即可。
$ 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
启动命令如下:
$ docker run -d -p 9091:9091 prom/PushGateway
启动完毕后,同上方法验证是否启动成功。这里为了方便演示,我采用 Docker 方式启动 PushGateway。
OK,现在 PushGateway 服务已经启动完毕,但是还没有跟 Prometheus 关联起来,我们需要的是通过 PushGateway 来上传自定义监控数据,然后通过 Prometheus 采集这些数据来进行监控。那么就需要将 PushGateway 添加到 Prometheus 目标任务中去,增加 prometheus.yml
配置如下:
...
- job_name: 'pushgateway'
static_configs:
- targets: ['172.30.12.167:9091']
labels:
instance: pushgateway
说明一下,这里采用 static_configs
静态配置方式,因为目前就一个 PushGateway,如果有多个可以考虑其他服务发现方式,来方便动态加载,具体可以参考 这里。配置完毕后,重启 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 中测试一下。
$ 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
说明。
$ 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
参数配置如下:
...
- 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 被覆盖。详细可参考 这里 官网文档对该参数的说明。
上边我们 Push 指标数据是通过命令行追加方式,少量数据还凑合,如果需要 Push 的数据比较大时,就不太方便了,这里我们也可以通过将指标数据写入到文件,然后将文件内容提交,也可以正常添加到 PushGateway。新建一个指标数据文件 pgdata.txt
如下:
$ 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 上去。
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"
组下的所有指标值,可以执行如下命令:
$ 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
。如果想删除该指标值,那么需要执行如下命令:
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
依赖包。
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
<version>0.7.0</version>
</dependency>
编写一个简单 demo 如下:
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 标签组的指标。
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 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 # 实际获取值 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 上来的。
参考资料
使用 PushGateway 进行数据上报采集的更多相关文章
- C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
- Python数据网络采集5--处理Javascript和重定向
Python数据网络采集5--处理Javascript和重定向 到目前为止,我们和网站服务器通信的唯一方式,就是发出HTTP请求获取页面.有些网页,我们不需要单独请求,就可以和网络服务器交互(收发信息 ...
- 0415关于通过FILEBEAT,LOGSTASH,ES,KIBNA实现数据的采集
如何通过FILEBEAT,LOGSTASH,ES,KIBNA实现数据的采集总体参考网址:https://www.olinux.org.cn/elk/1157.html官方网址:https://www. ...
- Linux input系统数据上报流程【转】
转自:https://segmentfault.com/a/1190000017255939 作为鸡生蛋系列文章,这里主要关注Linux input系统,主要为触摸事件上报流程. 读该文章最好有对li ...
- 大数据学习——采集文件到HDFS
采集需求:比如业务系统使用log4j生成的日志,日志内容不断增加,需要把追加到日志文件中的数据实时采集到hdfs 根据需求,首先定义以下3大要素 l 采集源,即source——监控文件内容更新 : ...
- (转) 基于Arcgis for Js的web GIS数据在线采集简介
http://blog.csdn.net/gisshixisheng/article/details/44310765 在前一篇博文“Arcgis for js之WKT和geometry转换”中实现了 ...
- Flume和Kafka完成实时数据的采集
Flume和Kafka完成实时数据的采集 写在前面 Flume和Kafka在生产环境中,一般都是结合起来使用的.可以使用它们两者结合起来收集实时产生日志信息,这一点是很重要的.如果,你不了解flume ...
- html5统计数据上报API:SendBeacon
公司为了精准的了解自己产品的用户使用情况,通常会对用户数据进行统计分析,获取pv.uv.页面留存率.访问设备等信息.与之相关的就是客户端的数据采集,然后上报的服务端.为了保证数据的准确性,就需要保证数 ...
- 埋点 & 数据上报 & 数据异常处理
埋点 & 数据上报 & 数据异常处理 如何在用户关闭浏览器前面,发送请求 beforeunload unload https://developer.mozilla.org/en-US ...
随机推荐
- APISpace万券齐发,API采购大放价
Eolink APISpace 是 Eolink 旗下专业的API 数据交易平台,上面拥有海量的API,开发者可以根据需求自由选择. 环境天气 全国天气预报,支持全国以及全球多个城市的天气查询,包含国 ...
- Kubernetes组件介绍
一.api-server 基本概念 该端口默认值为6443,可通过启动参数"--secure-port"的值来修改默认值. 默认IP地址为非本地(Non-Localhost)网 ...
- 7.5 The Morning after Halloween
本题主要是存储的问题,在存储上笔者原先的代码占用了大量的内存空间 这边笔者采用暴力的思想直接硬开所有情况的16^6的数组来存储该问题,当然这在时间上是十分浪费的,因为初始化实在太慢了,剩下的就是状态转 ...
- Mysql 数据恢复流程 基于binlog redolog undolog
注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...
- 简短截说阐述redis中事务的使用
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_127 我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操 ...
- SQL及常见的三种类型注释
SQL(Structure Query Language)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下:1974年-----由Boyce和Chamberlin提出,当时称 ...
- EPLAN 中的符号、元件、部件与设备之间的区别
符号(Symbol):电气符号是电器设备(Electrical equipment)的一种图形表达,符号存放在符号库中,是广大电气工程师之间的交流语言,用来传递系统控制的设计思维的.将设计思维体现出来 ...
- [原创] RestartPC64-中文版v1.0.0.9
原来发布的RestartPC-中文版和英文版v1.0.0.5,在PE64下无效.所以重新编译了64位版的RestartPC64-中文版v1.0.0.9,可以在PE64下面.正常Win64系统下面重启关 ...
- Excel 运算符(一):算术运算符
算术运算符用于最基本的加.减.乘.除运算. 运算符 含义 实例 结果 + 加法运算 =2+3 5 - 减法运算 =5-2 3 * 乘法运算 =5*2 10 / 除法运算 =4/2 2 % 百分数 =5 ...
- 理想汽车 x JuiceFS:从 Hadoop 到云原生的演进与思考
理想汽车在 Hadoop 时代的技术架构 首先简单回顾下大数据技术的发展,基于我个人的理解,将大数据的发展分了4个时期: 第一个时期: 2006 年到 2008 年.2008 年左右,Hadoop 成 ...