目录:
1、为什么需要监控中心
2、监控中心对比选型
3、集成Prometheus
4、Prometheus原理
在我们开发完一个系统部署上线后,经常会遇到机器的CPU、内存、磁盘、IO、网络等资源负载过高的问题。那我们总不能说天天对着这些机器,通过一些命令去观察这些机器资源使用的情况。所以我们就需要一个这样的控制中心用来监控我们机器和系统的资源使用情况,通过图形化的界面来直观的去观察这些信息,同时也能设置一些阈值,当资源使用率达到阈值时能进行自动预警。
目前比较主流的监控中心就是zabbix和prometheus。
zabbix起源比prometheus早,在传统监控系统中,尤其是在服务器相关监控方面,占据优势,但是对容器监控支持的比较差。zabbix采集的数据存储在关系型数据库,像MySQL、PostgreSQL、Oracle等。
prometheus相对于zabbix来说优点就在于能支持容器监控,并且采集的数据是存储在时序数据库,可以达到每秒千万级别的数据存储。
下面基于Prometheus+grafana部署一套可视化监控中心。
1、拉取Prometheus镜像
docker pull prom/prometheus
2、启动Prometheus容器
首先创建一个Prometheus的配置文件 prometheus.yml
cd /usr/local/
mkdir prometheus
cd prometheus
vi prometheus.yml
加上如下内容
global:
scrape_interval: 60s
evaluation_interval: 60s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
执行下面命令,启动容器
docker run -d -p 9090:9090 -v /usr/local/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
容器启动后,在浏览器输入192.168.1.5:9090,看到如下界面就说明prometheus部署成功了
但是这个时候这里还看不到什么监控的数据,接下来安装一个linux的node-exporter,用来监控linux系统的信息,然后prometheus会定期的从node-exporter中拉取监控信息。
1、拉取node-exporter镜像
docker pull prom/node-exporter
2、启动prom/node-exporter容器
docker run -d -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter
3、到之前添加的prometheus.yml文件里加上这个node-exporter的地址,表示要从node-exporter这里拉取监控信息。添加配置如下
- job_name: linux
static_configs:
- targets: ['192.168.1.5:9100']
labels:
instance: 192.168.1.5
最终prometheus.yml配置
重启prometheus,再次到浏览器输入prometheus地址192.168.1.5:9090,到/targets下面,就能看到已经可以收集linux系统的信息了。
只从prometheus的界面看到的信息不是那么直观,所以需要用grafana来展示收集到的这些信息。
1、拉取grafana镜像
docker pull grafana/grafana
2、启动grafana容器
docker run -d -p 3000:3000 --name=grafana -v /usr/local/grafana/grafana-storage:/var/lib/grafana grafana/grafana
3、在浏览器输入http://192.168.1.5:3000/login,看到登录界面表示grafana部署成功。用户名/密码都是 admin
4、添加一个 Data Source,选择prometheus,输入prometheus部署的地址和端口号,进行保存。
5、添加看板,直接选择Import进行导入。
6、到 https://grafana.com/grafana/dashboards 这个地址下找你想要的看板。
我这边选择的是10180这个看板。
7、看板导入grafana,直接输入10180进行导入,或是通过 JSON 进行导入。
8、最后就能看到下图的看板了
1、在java应用中引入pom.xml依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>io.github.mweirauch</groupId>
<artifactId>micrometer-jvm-extras</artifactId>
<version>0.2.1</version>
</dependency>
2、在java应用中添加配置。
management:
endpoints:
web:
exposure:
include: 'prometheus' # 暴露/actuator/prometheus
metrics:
tags:
application: ${spring.application.name}
3、在prometheus的prometheus.yml添加获取java应用监控信息的配置。targets里是java应用的地址和端口号。
- job_name: "java-jvm"
metrics_path: "/actuator/prometheus"
static_configs:
-targets: ['192.168.1.5:8084']
4、重启prometheus,在浏览器输入prometheus的地址192.168.1.5:9090,到/targets下面,此时能看到java应用已经能监控到了。
5、在grafana中添加看板,添加看板的过程与上面一致,去grafana的官网找到自己想要的看板,然后进行添加即可。我这边找的是12856这个看板。
6、最终看板效果
在上面使用的实例中我们可以看到,要想让Prometheus监控服务器或是应用的信息,就需要对外暴露一些接口。像要监控linux系统的信息,就需要安装一个node-exporter,这个node-exporter会收集服务器的信息,然后对外暴露HTTP接口,让Prometheus server能够通过HTTP的方式去访问这些暴露的接口,来获取服务的信息。整体的流程如下图:
Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端可以更加方便的水平扩展。
如果监控数据达到告警阈值Prometheus Server会通过HTTP将告警发送到告警模块alertmanger,通过告警的抑制后触发邮件或者webhook。
PromDash负责展示监控信息,Prometheus支持PromQL提供多维度数据模型和灵活的查询,将监控数据进行任意维度的组合以及聚合,展示到PromDash中。