一、Prometheus 介绍
java
1.数据收集器,它以配置的时间间隔定期通过HTTP提取指标数据。
2.一个时间序列数据库,用于存储所有指标数据。
3.一个简单的用户界面,您可以在其中可视化,查询和监视所有指标。
二、Grafana 介绍
Grafana 是一款采用 go 语言编写的开源应用,允许您从Elasticsearch,Prometheus,Graphite,InfluxDB等各种数据源中获取数据,并通过精美的图形将其可视化。

除了Prometheus的AlertManager 可以发送报警,Grafana 同时也支持告警。Grafana 可以无缝定义告警在数据中的位置,可视化的定义阈值,并可以通过钉钉、email等平台获取告警通知。最重要的是可直观的定义告警规则,不断的评估并发送通知。
由于Grafana alert告警比较弱,大部分告警都是通过Prometheus Alertmanager进行告警.
请注意Prometheus仪表板也具有简单的图形。 但是Grafana的图形化要好得多。
三、Alertmananger
Prometheus 监控平台中除了负责采集数据和存储,还能定制事件规则,但是这些事件规则要实现告警通知的话需要配合Alertmanager 组件来完成。
AlertManager 支持告警分组(将多个告警合并一起发送)、告警抑制以及告警静默(同一个时间段内不发出重复的告警)功能。

四、监控Java 应用
监控模式
目前,监控系统采集指标有两种方式,一种是『推』,另一种就是『拉』:
推的代表有 ElasticSearch,InfluxDB,OpenTSDB 等,需要你从程序中将指标使用 TCP,UDP 等方式推送至相关监控应用,只是使用 TCP 的话,一旦监控应用挂掉或存在瓶颈,容易对应用本身产生影响,而使用 UDP 的话,虽然不用担心监控应用,但是容易丢数据。
拉的代表,主要代表就是 Prometheus,让我们不用担心监控应用本身的状态。而且可以利用 DNS-SRV 或者 Consul 等服务发现功能就可以自动添加监控。
如何监控
Prometheus 监控应用的方式非常简单,只需要进程暴露了一个用于获取当前监控样本数据的 HTTP 访问地址。这样的一个程序称为Exporter,Exporter 的实例称为一个 Target 。Prometheus 通过轮训的方式定时从这些 Target 中获取监控数据样本,对于应用来讲,只需要暴露一个包含监控数据的 HTTP 访问地址即可,当然提供的数据需要满足一定的格式,这个格式就是 Metrics 格式.
text
metric name>{<label name>=<label value>, ...}
主要分为三个部分,各个部分需符合相关的正则表达式
shell
1.metric name:指标的名称,主要反映被监控样本的含义 a-zA-Z_:*_
2.label name: 标签 反映了当前样本的特征维度 [a-zA-Z0-9_]*
3.label value: 各个标签的值,不限制格式
需要注意的是,label value 最好使用枚举值,而不要使用无限制的值,比如用户 ID,Email 等,不然会消耗大量内存,也不符合指标采集的意义。
五、MicroMeter 介绍
前面简述了Prometheus 监控的原理。那么我们的Spring Boot 应用怎么提供这样一个 HTTP 访问地址,提供的数据还得符合上述的 Metrics 格式 ?
还记得吗,在Spring Boot Actuator 模块 详解:健康检查,度量,指标收集和监控中,我有提到过Actuator 模块也可以和一些外部的应用监控系统整合,其中就包括Prometheus 。那么Spring Boot Actuator 怎么让 Spring Boot 应用和Prometheus 这种监控系统结合起来呢?
这个桥梁就是Micrometer。Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。

一、docker 安装prometheus
1.1、创建挂载目录
shell
mkdir -p /opt/prometheus/{etc,data,rules}

1.2、下载指定版本的prometheus镜像
可以直接去 docker hub 上面去下载 prometheus 镜像,我选择的是 v2.45.0版本

shell
docker pull prom/prometheus:v2.45.0

1.3、创建模板配置文件
位置就是我们之前创建的目录 etc 目录下,scrape_configs具体内容可以先不了解,后续我们还是需要修改的,那时会详细说明。
shell
vim /opt/prometheus/etc/prometheus.yml

yaml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
1.4、部署启动
1、分别挂载对应的数据目录
shell
docker run -d -p 32440:9090 --name prometheus \
-v /opt/prometheus/etc/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /opt/prometheus/rules:/etc/prometheus/rules \
-v /opt/prometheus/data:/data/prometheus \
prom/prometheus:v2.45.0 \
--config.file="/etc/prometheus/prometheus.yml" \
--storage.tsdb.path="/data/prometheus" \
--web.listen-address="0.0.0.0:9090"
其中
--config.file 参数是指定 【容器内部的配置文件位置】 ,这样我们再将 【容器内部的配置文件位置】 给映射到外部 即可
--storage.tsdb.path 参数是指定 【容器内部的数据文件位置】 ,这样我们再将 【容器内部的数据文件位置】 给映射到外部 即可

2、启动之后会发现启动失败,我们查看一下日志,可以知道是没有权限创建 /data/prometheus/queries.active文件,我们直接给我们的宿主机的这个数据存储目录权限即可
这个问题分析可以查看该片文章 解决 Docker 安装 Prometheus 启动报 permission denied 的问题

shell
# 修改文件权限
chmod 777 /opt/prometheus/data
# 重启prometheus 即可
docker restart prometheus

1.5、web 访问
访问开发出来的端口即可
java
http://192.168.160.150:32440

二、docker 安装 Grafana
2.1、找到对应需要的版本,拉取镜像
我这里就拉取 9.4.13 版本了。

shell
docker pull grafana/grafana:9.4.13

2.2、创建存储目录,运行镜像
shell
# 创建存储目录
mkdir /opt/grafana
# 运行 grafana 镜像
docker run -d -p 32540:3000 --name=grafana -v /opt/grafana:/var/lib/grafana grafana/grafana:9.4.13

1、会发现启动时失败,查看日志,了解和前面创建 prometheus 一样,都是数据挂载目录的权限问题,我们直接修改文件权限即可

shell
# 修改文件权限
chmod 777 /opt/grafana
# 重启prometheus 即可
docker restart grafana
2.3、访问web
1、访问32540端口,即可
2、账号密码,默认 admin admin ,登录成功后,会需要你修改密码

2.4、创建数据源
1、这里的数据源选择我们创建的 prometheus

2、选择 prometheus

3、这里的prometheus的地址,写宿主机的地址和docker 暴露出来的端口
下面还有具体的其它配置,比如你的
prometheus配置了http的账号密码,你都可以选择去配置。

4、滑动滚轮到最下面,有一个 保存测试的按钮,我们点击,会弹出数据源正在工作,即证明我们配置成功.

5、这个时候,我们的数据源列表,就存在了刚刚配置的 prometheus的数据源了.

2.5、配置视图
1、点击我们的prometheus数据源,去配置画板,我么选择 2.0的数据展示画板

2、查看我们的画板,点击进去,就能看到一部分的数据了。


2.6、grafana好用免费的官方模板地址

三、展示服务器监控数据 ( 使用Node Exporter采集主机运行数据 )
1、目前我们已经搭建好了 prometheus 和 grafana,那么现在我们先去展示服务器监控数据
2、因为我们我们知道 prometheus需要被监控的服务提供一个暴露的http的检测数据接口,prometheus才能去定时拉取暴露的数据,所以我们现在想要监控,服务器,那我们也需要为服务器指标信息来提供 http的接口,这个已经有了对应的插件,我们可以直接来 运行,挂载到 宿主机的指定目录,这里它就会暴露出对应的指标http接口
3.1、选择镜像版本,拉取
我这里就选择 v1.6.0 版本了
shell
docker pull prom/node-exporter:v1.6.0


3.2、运行镜像
1、这里要说明一点就是,对于 linux 服务器的性能参数,其实都会以文件的形式存在在本地,所以我们只需要挂载对应的目录即可
大家可以去了解一下 netdata 的镜像部署,对应挂载的目录都是linux的性能数据目录,会比较的多
shell
# 其中的参数 ro 是说明 在挂载命令中指定读写(read-write,rw)或只读(read-only,ro)权限,所以目前挂载的数据目录只能读取,保证安全性
docker run -d -p 32640:9100 --name=node-exporter -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter:v1.6.0

3.3、访问web
访问 32640 端口即可

3.4、配置监控信息
1、修改 prometheus 的配置文件,并重启

2、修改内容如下

3、最后展示如下,我们可以看到,已经有两个我们刚刚配置的实力信息了。

3.4、配置监控信息在 grafana 面板中展示
1、对于 node-exporter ,grafana 的画板库里面已经有了很多基础的,我们直接使用导入一个模板就行,就和前面观察prometheus 一样,

2、直接选择 8919 这个模板的 ID 模板即可


3、配置基础信息,修改完成,点击 import 按钮

4、数据信息如下

四、展示 springBoot 项目监控数据
4.1、内置监控数据
4.1.1、引入依赖
shell
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
4.1.2、yml配置
1、主要是 management 部分的,该部分的配置是 spring-boot-starter-actuator 依赖提供的
如下配置,就暴露出了 127.0.0.1:50000/actuator/prometheus 接口,可以让prometheus 来获取
yaml
server:
port: 9063
management:
server:
#address: 127.0.0.1 # 启动额外ip,默认使用项目ip调用
port: 50000 # 启用独立运维端口,默认使用项目端口调用
endpoints:
web:
base-path: /actuator # 指定上下文路径,启用相应端点,后续相关请求需要加上该前缀,你看下面的请求url就知道了
exposure:
# /actuator/prometheus 调用方式如下:
# curl -X GET 127.0.0.1:50000/actuator/prometheus
include: ["prometheus"] # 这里是一个set集合
2、 其中配置 include: ["prometheus"],spring-boot-starter-actuator 依赖其实包含了很多,prometheus 只是其中一个指标,比如 include: ["shutdown"] ,那么会暴露出 127.0.0.1:50000/actuator/prometheus/shutdown 接口,这个是用做 springboot 关机的接口,当然大家可以写成 include: ["*"] 那就会暴露出所有的接口,如下



具体可以参考 文章 Spring Boot之 Actuator监控(各个接口介绍)
3、启动项目,我们访问该接口,就可以看到 spring-boot-starter-actuator 依赖提供的暴露信息

4.1.3、修改prometheus,增加我们的项目接口
1、找到 prometheus 的配置文件,将我们上面暴露出来的接口添加进去

2、其中地址我写成我win的ip了,这样方便一些,不用把项目再部署到linux中,大家记得改成自己对应的ip即可,还有增加了参数 metrics_path

3、重启 prometheus项目

4、查看web ,已经正式上去了

4.1.4、增加 grafana 图表展示
1、这里就是去找模板了,和前面差不多
但是你也可以直接写自己想要展示的数据规则不使用现成的模板,后面自定义的时候会说

2、这里可以选择 输入4701 或 12271 [推荐] ,这两个模板,都还ok



4.2、自定义埋点上报监控数据
1、todo ,抽空补上
五、Docker Prometheus AlertManager webhook 报警
1、todo ,抽空补上
5.1、部署
1、todo ,抽空补上
5.2、配置钉钉机器人
1、todo ,抽空补上
六、总结
最后所有的画板都在
