Java 用Prometheus搭建实时监控系统过程详解

上帝之火

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

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

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

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

Prometheus以及时序数据库的基本概念

Prometheus现在在Github有3w多的star,基本上过万星的开源工具,可以认为是社区里绝对的主流,社区也相当活跃,可以有大量的经验可以借鉴。在企业级系统中,可以放心的使用。

Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库。从字面上理解,Prometheus 由两个部分组成,一个是监控报警系统,另一个是自带的时序数据库(TSDB)。

关于时序数据库(TSDB)这里要说下,我们可以简单的理解为一个优化后用来处理时间序列数据的数据库,并且数据中的数组是由时间进行索引的。相比于传统的结构化数据库主要有几个好处:

  • 时间序列数据专注于海量数据的快速摄取。时序数据库视数据的每一次变化为一条新的数据,从而可以去衡量变化:分析过去的变化,监测现在的变化,以及预测未来将如何变化,传统结构化数据在数据量小的时候能做到,在数据量大的时候就需要花费大量的成本。
  • 高精度数据保存时间较短,中等或更低精度的摘要数据保留时间较长。对于实时监控来说,不一定需要每一个精准的数据,而是固定时间段时间数据的摘要。这对于结构化数据库来说就意味着要进行筛选,在保证大量的写入同时还要进行帅选,这是一个超出结构化数据库设计来处理的工作量。
  • 数据库本身必须连续计算来自高精度数据的摘要以进行长期存储。这些计算既包括一些简单的聚合,同时也有一些复杂计算。传统数据库无法承受那么大量的计算。因为必须去实时统计这些聚合和复杂运算。

开始搭建Prometheus

https://prometheus.io/

在Prometheue官网Download标签页进行下载,这里以linux版本为例:

下载好之后,解压,运行

nohup /data/prometheus/prometheus --web.listen-address=0.0.0.0:9090 --config.file=/data/prometheus/prometheus.yml --web.enable-lifecycle --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention.time=15d &

这样,就简单的搭建起来Prometheus服务端了。这时候,我们可以在web上访问

http://127.0.0.1:9090

就可以访问到管理页面

界面上几个标签说明下:

Alert:用来配置告警规则。之后我们会用Grafana自身的告警界面配置来代替这个。

Graph:用来运行PromQL语句的一个控制台,并且可以把运行出来的语句用用图形化进行展示,此块我们后面章节会介绍到。

Status:包含系统信息,系统状态,配置信息,目标节点的状态,服务发现状态等元信息的查看。

Prometheus整体架构以及生态

这张图是官方的整体架构图。米黄色部分是Prometheus自己的组件,绿色的为第三方的中间件和应用。

简单介绍下整个Prometheus的生态架构:

  1. Prometheus获取数据的方式只有一种,就是scrape,也称作pull,意为拉取。Prometheus每隔一段时间会从目标(target)这里以Http协议拉取指标(metrics),这些目标可以是应用,也可以是代理,缓存中间件,数据库等等一些中间件。
  2. 拉取出来的数据Prometheus会存到自己的TSDB数据库。自己的WebUI控制台以及Grafana可以对其数据进行时间范围内的不断查询,绘制成实时图表工展现。
  3. Prometheus 支持例如zookeeper,consul之类的服务发现中间件,用以对目标(target)的自动发现。而不用一个个去配置target了。
  4. alertManager组件支持自定义告警规则,告警渠道也支持很多种

拉取数据

Prometheus主要是通过拉取的方式获取数据,说简单点,就是每隔固定时间去访问配置的target,target就是一个获取数据的url。

现在我们就来模拟一个数据源,并让prometheus去拉取。

新建一个springboot的web项目,pom依赖加上

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
 <groupId>io.micrometer</groupId>
 <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

application.properties里加上

server.port=8080
anagement.endpoints.web.exposure.include=*

启动完毕后,我们就可以在页面上访问如下地址:

http://127.0.0.1:8080/actuator/prometheus

得到如下数据:

关于actuator如何监控应用指标以及自定义指标我会在之后的系列里单独分析,这里只要理解成我们启动了一个服务,提供了一个url能列出一些kv形式的指标就行了。

例如jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 2.863661056E9这个指标,前面是key,后面为value。

其中key上又分key name和key labels,key name就是``jvm_memory_max_bytes,key labels有2个。

这个指标提供了jvm的最大内存,其中area为heap,表明这是堆内存区域,id为PS Old Gen,表明这是老年代。综合起来看,这个指标就是jvm中老年代的最大值。数值类型是byte,换算下来大概是286M左右。

我们有指标的数据源后,再在prometheus 的根目录下编辑prometheus.yml文件,添加如下配置:

- job_name: 'test'
 scrape_interval: 5s
 metrics_path: '/actuator/prometheus'
 static_configs:
 - targets: ['localhost:8080']
  labels:
   instance: demo

这个配置表示:prometheue每隔5秒钟从http://localhost:8080/actuator/prometheus这个url拉取指标,并且为每个指标添加instance这个标签。

添加完毕后,重启prometheus。进入web页面中的targets页面。如果前面步骤没问题的话,会看到:

状态为UP表明prometheue已经成功获取到了这个target 的数据。

在查询页面上输入刚才那个指标的key:

这里每个value都是prometheus最近一次抓取的数据。你每执行一次,数据都会变。

这里为什么会有多条数据呢,是因为每个指标他们的标签不一样。完全一样的标签会被归为一种指标。

点Graph这标签可以看到在时间序列下,某个指标的变化趋势

上图展示了系统cpu指标的变化图。

最后

如今微服务盛行,小规模的企业的微服务节点也快上百了,Prometheus生态能够用最小的代价使所有的数据实时可视化。这对于开发和运维来说,意义在于,所有的数据不再是黑盒了,至少我个人觉得所有的数据能够被观测和分析,是具有安全感的。

这个系列旨在利用实战操作教你一步步搭建自己系统和业务监控大盘。后面会继续更新。下一个章节将分析:搭建pushgateway去push数据到prometheus,以及2种不同的数据获取方式分别用于什么样的场景。

到此这篇关于用Prometheus搭建实时监控系统过程详解之上帝之火,普罗米修斯的崛起的文章就介绍到这了,更多相关用Prometheus搭建实时监控系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实时监控日志文件并输出的方法详解

    前言 最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增加的,通过查看JDK 的帮助文档, java.io.RandomAccessFile可以解决这个问题.为了模拟这个问题,编写LogSvr和 LogView类,LogSvr不断向mock.log日志文件写数据,而 LogView则实时输出日志变化部分的数据. 代码1:日志产生类 package

  • java实时监控文件行尾内容的实现

    今天讲一下怎样用Java实现实时的监控文件行尾的追加内容,类似Linux命令 tail -f 在之前的面试中遇到过一个问题,就是用Java实现tail功能,之前的做法是做一个定时任务每隔1秒去读取一次文件,去判断内容是否有追加,如果有则输出新追加的内容,这个做法虽然能勉强实现功能,但是有点太low,今天采用另外一种实现方式,基于事件通知. 1.WatchService 首先介绍一下WatchService类,WatchService可以监控某一个目录下的文件的变动(新增,修改,删除)并以事件的形

  • Java实现实时监控目录下文件变化的方法

    一.commons-io方法 1.使用Commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的 (1)可以监控文件夹的创建.删除和修改 (2)可以监控文件的创建.删除和修改 (3)采用的是观察者模式来实现的 (4)采用线程去定时去刷新检测文件的变化情况 2.引入commons-io包,需要2.0以上. <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <depend

  • Java 用Prometheus搭建实时监控系统过程详解

    上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念也会精炼出提及下.系列主要分为以下几块 Prometheus各个概念介绍和搭建,如何抓取数据(本次分享内容)

  • java使用xfire搭建webservice服务的过程详解

    前言 以前用的都是 apache 的cxf来搞webservice,今天做项目发现这个项目用的是 xfire,于是搭一个,写个demo用一下,在此记录一下过程. 搭建过程 本文使用的是maven形式的web工程.不知道如何搭建web工程的看上一篇博文. 引入xfire的依赖 <dependency> <groupId>org.codehaus.xfire</groupId> <artifactId>xfire-all</artifactId> &

  • 分布式监控系统之Zabbix主动、被动及web监控的过程详解

    前文我们了解了zabbix的网络发现功能,以及结合action实现自动发现主机并将主机添加到zabbix hosts中,链接指定模板进行监控:回顾请参考https://www.jb51.net/article/200678.htm:今天我们来了解下zabbix的主动监控.被动监控以及web监控相关话题: 1.什么是主动监控?什么是被动监控? 我们知道获取数据的方式有两种,一种是get,一种是push:在zabbix中描述主动监控和被动监控都是站在agent的一方来描述的:我们把agent主动将数

  • Springcould多模块搭建Eureka服务器端口过程详解

    这篇文章主要介绍了Springcould多模块搭建Eureka服务器端口过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1创建一个普通父maven 在pom修改为因为spring could依赖spring boot所以首先在父maven <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star

  • 使用vue cli4.x搭建vue项目的过程详解

    cli-4.x已经发布好久了,斟酌了好久,还是决定将原来的cli-2.x升级到4.x,详细的升级过程可以戳这里 1.创建项目 vue create vuetest 2.选择配置方式 ? Please pick a preset: (Use arrow keys) ☜(使用箭头键) > default (babel, eslint) ☜(使用默认的配置,会安装babel和eslint) Manually select features ☜(手动配置) 这里我选择的是手动配置(使用↑ ↓箭头切换,E

  • 使用Webpack 搭建 Vue3 开发环境过程详解

    从零开始使用 Webpack 搭建 Vue3 开发环境 创建项目 首先需要创建一个空目录,在该目录打开命令行,执行 npm init 命令创建一个项目,这个过程会提示输入一些内容,完成后会自动生成一个 package.json 文件 Webpack 的配置文件 project project-name + |- index.html |- package.json + |- webpack.config.js + |- /src + |- index.js webpack.config.js '

  • Java Apollo环境搭建以及集成SpringBoot案例详解

    环境搭建 下载Quick Start安装包 从Github下载:checkout或下载apollo-build-scripts项目 手动打包Quick Start安装包 修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin 在根目录下执行mvn clean package -pl apollo-assembly -am

  • JavaScript代码异常监控实现过程详解

    这篇文章主要介绍了JavaScript代码异常监控实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JavaScript异常一般有两方面:语法错误和运行时错误.两种错误的捕获和处理方式不同,从而影响具体的方案选型.通常来说,处理JS异常的方案有两种:try...catch捕获 和 window.onerror捕获.以下就两种方案分别分析各自的优劣. 虽然语法错误本应该在开发构建阶段使用测试工具避免,但难免会有马失前蹄部署到线上的时候.

  • Java使用Cipher类实现加密的过程详解

    一.先看一个简单加密,解密实现 1.1 加密 /** * content: 加密内容 * slatKey: 加密的盐,16位字符串 * vectorKey: 加密的向量,16位字符串 */ public String encrypt(String content, String slatKey, String vectorKey) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

  • Java实战之实现物流配送系统示例详解

    目录 介绍 效果图展示 主要实现代码 介绍 系统分普通用户.企业.超级管理员等角色,除基础脚手架外,实现的功能有: 超级管理员:系统管理.用户管理.企业用户管理.普通用户管理.货物类型管理.车辆管理.公告管理.使用帮助等. 普通用户:注册登录.个人信息管理(个人资料.密码修改.充值.订单管理等).货物浏览.公告查看.下单等. 企业用户:注册登录.修改密码.充值.订单管理.货物管理.车辆管理.安排车辆等. 运行环境:windows/Linux均可.jdk1.8.mysql5.7.redis3.0.

随机推荐