前言

本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台。

本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念也会精炼出提及下。系列主要分为以下几块

  • Prometheus各个概念介绍和搭建,如何抓取数据
  • 如何推送数据至Prometheus,推送和拉取分别用于什么样的场景(本次分享内容)
  • Prometheus数据的结构以及查询语言PromQL的使用
  • Java应用如何和Prometheus集成,如何启用服务发现,如果自定义业务指标
  • Prometheus如何和Grafana可视化套件进行集成和设置告警
  • 教你如何手写一个集成了监控Dubbo各个指标的java套件
  • 实际案例分享,如何做各个业务端和系统端的监控大盘

抓取和推送

拉取模式:

Prometheus获取数据的方式只有拉取(PULL),即Prometheus会以固定频率去请求每个target所提供的http url来获取数据。这就需要每个服务端点提供http的接口来获取实时的数据。

推送模式:

Prometheus也变相的实现了推送数据的方式。

为什么说是变相呢。因为Prometheus获取数据的方式一直是拉取方式,官方并没有提供推送数据的功能。但是官方为了兼容推送这种方式,增加了一个PushGateway组件。

这个组件相当于一个代理服务,独立部署。它没有数据抓取功能,只能被动的等待数据推送。应用把数据推送到PushGateway后,Prometheus再从PushGateway抓取。

推送模式要注意的点

即便客户端推了全量的数据到了PushGatewayPrometheus也不是每次拉取这个期间用户推上来的所有数据。

事实上Prometheus只拉取用户最后一次push上来的数据。

在这个系列一的时候,曾经提到过Prometheus其实并不需要每一个精确的数据,长期保存的是中等或者低精度的数据。它每次只抓取一个数据,在固定的频率下。也能形成某种数据的趋势。

如果客户端一直没有推送新的指标到PushGateway,那么Prometheus将始终拉取最后推送上的数据,直到指标消失,默认是5分钟。

Pushgateway本意是不会存储指标的,但是为了让pushgateway意外重启一类的故障之后能够重新读取到原来的指标,添加了一个将指标暂时存储到本地的功能,参数--persistence.interval=5m就是默认保持5分钟,5分钟后,本地存储的指标会删除。可以通过调节这个值来修正发现异常的时间。

通过单个Pushgateway监控多个实例时,Pushgateway有可能成为单点故障和潜在瓶颈

如果要用Pushgateway的话,建议多点部署。然后前面通过nginx进行反向代理多个节点,进行负载均衡。

推送模式适用的场景

  • Prometheus 采用定时拉取模式,可能由于子网络或者防火墙的原因,不能直接拉取各个Target的指标数据,此时可以采用各个TargetPushGateway上推送数据,然后PrometheusPushGateway上定时拉取
  • 在监控各个业务数据时,需要将各个不同的业务数据进行统一汇总,此时也可以采用PushGateway来统一收集,然后Prometheus来统一拉取

搭建

Pushgatewaydocker安装和普通安装两种,这里才用普通安装

先上prometheus的github release主页

https://github.com/prometheus/pushgateway/releases

按照需要下载对应的包,我这里是需要部署在linux服务器上,所以下载这个

下载好,解压。运行:

nohup ./pushgateway &

启动起来后,默认端口为9091

在浏览器上根据ip+port可以访问到如下页面,就算启动成功了:

除此之外还要在Prometheus的配置文件里设置Target:

- job_name: 'pushgateway'
scrape_interval: 10s # 每过10秒拉取一次
honor_labels: true
static_configs:
- targets: ['localhost:9091']
labels:
instance: pushgateway

设置完毕后重启Prometheus,然后会在Target选项卡里看到状态为UPPushgateway

设置阶段就完成了。

URL推送测试

我这里用postman软件进行推送测试,推送url的格式为:/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}

这个测试用例为意思是,推送一个指标aaa,标签为bbb=BBB,ccc=CCC,值为111.1到一个组上,这个组为job=pushgateway,instance=demo

其实你可以简单的理解为这个指标aaa带有4个标签:job,instance,bbb,ccc。只是job和instance是属于组上的标签。

同一个组里的相同的指标,Prometheus每次只取最新的,不同组内可以有相同的指标。

关于数据结构和标签结构系列的下一篇文章会详细介绍。

总之,你提交这个POST请求后,可以在http://ip:9091上看到如下数据:

可以看到,aaa这个标签已经成功的被提交到Pushgateway里了。

接下来,我们在Prometheus里查询这个指标:

可以看到,Prometheus也成功的拉取到了这个指标。

Java端利用SDK进行推送

虽然我们在java服务端也能利用httpclient等工具进行提交,但是需要自行组装很多请求体。Prometheus官方提供了一个SDK。

首先在Maven中引入依赖包:

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
<version>0.9.0</version>
</dependency>

Gauge,Timer,Counter,Summary四种常见的指标进行推送示例:

public void run(String... args) throws Exception {
Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.")
.labelNames("aaa","bbb").register();
Gauge.Child child = guage.labels("AAA","BBB");
child.set(334.5); Gauge timerGauge = Gauge.build("my_timer_metric","this is my timer metric.").register();
Gauge.Timer timer = timerGauge.startTimer();
Thread.sleep(3000L); Counter counter = Counter.build("my_count_metric","this is my count metric.").register();
counter.inc();
counter.inc(); Summary summary = Summary.build("my_summary_metric","this is my summary metric.").register();
summary.observe(45.6);
summary.observe(54.5); String url = "xxx.xxx.xxx.xxx:9091";
PushGateway pg = new PushGateway(url);
Map<String, String> groupingKey = new HashMap<>();
groupingKey.put("instance", "my_instance");
pg.pushAdd(CollectorRegistry.defaultRegistry, "my_job", groupingKey);
}

这段代码演示了4个指标批量提交的场景。通过注册到CollectorRegistry.defaultRegistry里,最后一起pushAdd

我们可以在Pushgateway里查询到提交的指标:

同样在Prometheus里也能查询到这4个指标,具体图示就不贴了。可以自己尝试下。

最后

这个系列旨在利用实战操作教你一步步搭建自己系统和业务监控大盘。后面会继续更新。下一个章节将分析:Prometheus中的数据格式分析以及PromQL的使用。

关注作者

如果你喜欢作者的文章,欢迎微信公众号关注 「元人部落」,一个只做原创的技术科技分享号

关注后回复“资料”获取50G的技术资料

一步步教你用Prometheus搭建实时监控系统系列(二)——详细分析拉取和推送两种不同模式的更多相关文章

  1. 一步步教你用Prometheus搭建实时监控系统系列(一)——上帝之火,普罗米修斯的崛起

    上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本 ...

  2. Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql

    Telegraf+InfluxDB+Grafana快速搭建实时监控系统  监控postgresql

  3. 搭建前端监控系统(二)JS错误监控篇

    ===================================================================== 前端性能监控系统: DEMO地址    GIT代码仓库地址 ...

  4. 搭建前端监控系统(三)NodeJs服务器部署篇

    ===================================================================== 监控系统预览地址: DEMO地址    GIT代码仓库地址 ...

  5. 从零开始搭建前端监控系统(三)——实现控制iframe前进后退

    前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://gith ...

  6. 转: 透过CAT,来看分布式实时监控系统的设计与实现

    评注: 开源的分布式监控系统 转:http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-syste ...

  7. 搭建前端监控系统(四)Js截图上报篇

    ===================================================================== 前端监控系统: DEMO地址  GIT代码仓库地址 ==== ...

  8. 透过CAT,来看分布式实时监控系统的设计与实现

    2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...

  9. 搭建前端监控系统(六)JS截屏和录屏篇

    怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...

随机推荐

  1. apache frpClien操作报错解决

    #打开配置文件vim /etc/vsftpd/vsftpd.conf #修改配置100行chroot_local_user=NO

  2. 整合Lettuce Redis

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  3. 部署LNMP环境——Yum安装(113资讯网)

    Yum安装优点:安装东西,方便快捷,特别是不用考虑包依赖 教程(Centos做演示,其他系统大同小异): 1.更换国内Yum源: [root@root xx ]# rm -rf /etc/yum.re ...

  4. python编程从入门到实践笔记

    我的第一个hello world 程序 print("hello python world") print("hello python world"*3) 打印 ...

  5. 灵魂代码分享HTML元素标签语义化及使用场景实用到爆

    灵魂三问: 标签语义化是什么?为什么要标签语义化?标签语义化使用场景有哪些? 下面让我们跟着这三个问题来展开一下本文的内容. 一.标签语义化是什么? 标签语义化就是让元素标签做适当的事情.例如 p 标 ...

  6. Java实现 第十一届蓝桥杯——超级胶水(渴望有题目的大佬能给小编提供一下题目,讨论群:99979568)

    PS: 好久没写过算法题了,总感觉自己写的思路没问题,但是结果就是不对,希望哪位大佬有时间能给找找问题 超级胶水 小明有n颗石子,按顺序摆成一排,他准备用胶水将这些石子黏在一起. 梅克什字有自己的重量 ...

  7. 【区间DP】低价回文

    [区间DP]低价回文 标签(空格分隔): 区间DP 回文词 [题目描述] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身上安装了一个电子身份标签,当奶牛通过扫描器的时 ...

  8. python学习笔记之装饰器、生成器、内置函数、json(五)

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...

  9. python读取EXCEL是去掉空白行和表头全部重命名

    当读取进来的表格如图所示,转换成图2. import pandas as pd # header:指定作为列名的行,默认0,即取第一行的值为列名.数据为列名行以下的数据:若数据不含列名, # 则设定 ...

  10. drf路由与认证

    目录 一.路由 1 没有继承视图集的视图类 2 继承了视图集的视图类 3 继承自ModelViewSet的路由写法(自动生成) 二.认证 1 drf认证的源码分析 2 自定义认证类的使用 一.路由 三 ...