使⽤PushGateway进⾏数据上报采集
转载⾃:
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 relea 7.3.1611 (Core)
Docker: 18.06.1-ce
Prometheus: v2.11.1
PushGateway: 1.0.0
注意:这⾥为了快速⽅便启动 Prometheus、PushGateway 服务,我使⽤ Docker ⽅式启动,所以本机需要安装好 Docker 环境,这⾥忽略Docker 的安装过程。其中 Prometheus 安装配置,可以参照之前⽂章,这⾥着重介绍⼀下如何启动并配置 PushGateway 并配置数据上报到 Prometheus。
3、PushGateway 安装配置
成语千什么万什么
PushGateway 安装很简单,可以使⽤⼆进制包解压安装服务,也可以使⽤ Docker 启动服务。
3.1、⼆进制包安装
⼆进制包安装⽅式,直接从下载最新⼆进制安装包,解压即可。
$ wget /prometheus/pushgateway/releas/download/v1.0.0/pushgateway-1.0.0.
$ tar xzvf pushgateway-1.0.0.
$ mv pushgateway-1.0.0.linux-amd64 /usr/local/pushgateway
使⽤命令./pushgateway命令即可启动服务,此时浏览器访问<ip>:9091即可访问 UI 页⾯,只不过默认 Metrics 上没有任何数据展⽰,那是因为我们还没有往 PushGateway 上推送任何数据。
不过,PushGateway 服务本⾝是带了⼀些 Metrics 的,可以通过访问<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 ⽬标任务中去,增加l 配置如下:
...
- 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 地址
一战德国战败原因
为:<ip>:9091/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>},其中<JOBNAME>是必填项,为 job 标签值,后边可以跟任意数量的标签对,⼀般我们会添加⼀个instance/<INSTANCE_NAME>实例名称标签,来⽅便区分各个指标。
接下来,可以 Push ⼀个简单的指标数据到 PushGateway 中测试⼀下。
$ echo "test_metric 123456" | curl --data-binary @- 172.30.12.167:9091/metrics/job/test_job
执⾏完毕,刷新⼀下 PushGateway UI 页⾯,此时就能看到刚添加的test_metric指标数据了。
不过我们会发现,除了test_metric外,同时还新增了push_time_conds和push_failure_time_conds两个指标,这两个是 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(默认为fal)决定的,我们不妨再 Push ⼀个数据,来演⽰下添加honor_labels: true参数前后的变化。
这次,我们 Push ⼀个复杂⼀些的,⼀次写⼊多个指标,⽽且每个指标添加TYPE及HELP说明。
$ cat <<EOF | curl --data-binary @- 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。新建⼀个指标数据⽂件如下:
$
# 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 @ 172.30.12.167:9091/metrics/job/app/instance/app-172.30.0.0
执⾏完毕,在 PushGateway UI 页⾯同样能够查询的到。
最后,如果要删除某⼀个指标,同样可以通过 API ⽅式触发删除。例如删除job="test_job"组下的所有指标值,可以执⾏如下命令:
$ curl -X DELETE 172.30.12.167:9091/metrics/job/test_job
注意:删除job="test_job"组下的所有指标值,不包括{job="test_job", instance="test_instance"}中的指标值,虽然它们的 job 名称都为test_job。如果想删除该指标值,那么需要执⾏如下命令:
curl -X DELETE 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 中。
⾸先,l中添加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.t(23.12);
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).t(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);
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 @- 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 @- #实际获取值 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 上来的。
参考资料