本文主要内容搭建springboot以及mysql运行的状态监控,主要涉及以下内容:
- Prometheus:从需要我们监控的地方获取数据
- Grafana:大屏展示Prometheus中的监控指标
- Node_exporter:主机监控相关指标
- MySQL_exporter:mysql运行时的相关指标
全程干货无废话。
整体架构:可以看到prometheus抓取数据,通过grafana的dashborad展示:
prometheus + grafana + springboot
安装prometheus
首先在宿主机的目录下(这里的目录需要和启动命令中的-v参数的目录保持一致)创建prometheus.yml文件、这个文件用于配置后续要从哪些地方收集数据、配置如下:
global:
scrape_interval: 15s
evaluation_interval: 15s
# 报警配置
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'
static_configs:
- targets: ['localhost:9090']
### 以下内容为springboot的配置,主要是这个地方
- job_name: 'springboot_promethues'
scrape_interval: 5s
metrics_path: '/actuator/prometheus'
static_configs:
# 容器的ip地址、不能写localhost、不能写127.0.0.1
- targets: ['192.168.1.4:7777']
这里需要注意的地方在于在写target时、需要分清楚ip地址、我们一般是把容器的某个端口映射到主机上、那么写的ip是宿主机的ip+端口号,因为我们这里是以容器的方式启动prometheus的、如果是macos可通过此命令获取ifconfig | grep 192.168,如下图所示:
配置文件编写无误后、通过如下命令启动prometheus:
sudo docker run -d --name=springboot-prometheus --network springboot-monitor-system-network -v /opt/docker/prometheus-grafana/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -p 9090:9090 bitnami/prometheus:2.47.2
在浏览器输入localhost:9090可以看到如下页面:
点击【status】===》【targets】 就可以看到当前配置文件中我们监听的服务、图中圈出来的就是我们最终要的效果。正常启动后、进行下一步。
启动springboot项目
第一部分搭建一个springboot应用、需要在springboot项目中引入如下依赖:
<!-- spring-boot-actuator依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- prometheus依赖 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
在配置文件中添加如下配置:
spring:
application:
name: springboot-prometheus
#对外暴露哪些指标
management:
endpoints:
web:
exposure:
include: "*"
#激活promethues并转换为对应的promethues数据
endpoint:
prometheus:
enabled: true
health:
show-details: always
#允许对应的数据指标被导出
metrics:
export:
prometheus:
enabled: true
添加一个bean配置
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String name) {
return registry -> registry.config().commonTags("application", name);
}
启动项目,在浏览器输入localhost:7777/actuator,就可以看到相关的监控指标:
圈出来的这一部分和prometheus.yml中的配置项是不是一致的?此时从浏览器就可以看到我们需要的springboot服务。
安装grafana
执行如下命令、安装并运行grafana:
docker run -d --name=grafana-prometheus -p 3000:3000 grafana/grafana:10.2.0
运行成功后输入localhost:3000,在浏览器可以看到登录界面:默认的账户名和密码是admin/admin
- 如果忘了:可以通过此命令修改
grafana-cli admin reset-admin-password yourNewPassword,需要进入到container容器中!
点击侧边栏如下图:
接着如下配置:
点击最下方的test/save即可。接着创建dashboard:
点击import dashboard,在搜索栏输入4701,点击load,就可以看到提供的配置,当然你也可以自己写配置文件进行自定监控。4701是已经写好的一个配置文件项目。
最终的配置如下,记得选择数据源。
点击import,就可以看到如下的页面:
到这里就完成了对springboot服务的监控。
mysql_exporter + node_exporter
mysql_exporter:用于提供mysql运行时相关的数据node_exporter:用于提供宿主机的数据、是宿主机不是容器!
安装mysql_exporter
通过docker-compose.yml安装mysql_exporter:
version: '3.8'
services:
mysql_exporter:
image: prom/mysqld-exporter:latest
container_name: mysql_exporter
ports:
- "9104:9104"
# - '--collect.perf_schema.events_statements'
command:
- '--collect.engine_innodb_status'
- '--collect.info_schema.processlist'
- '--collect.info_schema.tables'
- '--collect.info_schema.query_response_time'
- '--collect.perf_schema.file_events'
- '--collect.perf_schema.eventsstatements'
- '--collect.perf_schema.indexiowaits'
- '--collect.global_status'
# - '--ignore-tables="^(information_schema|performance_schema|mysql)"'
- '--config.my-cnf=/etc/mysql/.my.cnf'
volumes:
- /opt/docker/prometheus-grafana/mysqlexport/.my.cnf:/etc/mysql/.my.cnf
environment:
- DATA_SOURCE_NAME=root:root123!@(192.168.1.4:3306)/
# restart: always
-
注意yml文件中的
DATA_SOURCE_NAME=root:root123!@(192.168.1.4:3306)/:需要换成你自己的宿主电脑的ip,你数据库的登录账户和密码。 -
注意
volumes,在宿主机的mysqlexport创建.my.cnf(yml文件和它在同一个目录【非必需】,只需要和volumes配置项的配置保持一致即可。):
[client]
host=192.168.1.4
port=3306
user=root
password=root123!
修改prometheus.yml文件:
- job_name: 'mysql_exporter'
static_configs:
- targets: ['192.168.1.4:9104']
# node_export的配置一起拿过来了
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.1.4:9100']
通过docker-compose up -d启动服务。在grafana的dashboard里面通过import在搜索栏输入7362点击load,并配置数据源点import。
(这里因为我之前创建了一个同名的,所以报错,您们第一次是不会的)
就可以看到如下界面:
注意Buffer Pool Size of Total RAM这一项、这一项的计算公式【点击此tab右上角三个点、点击edit即可看到】:
(mysql_global_variables_innodb_buffer_pool_size{instance="$host"} * 100) / on (instance) node_memory_MemTotal_bytes{instance="$host"}
mysql_global_variables_innodb_buffer_pool_size{instance="$host"} * 100):mysql点innodb buffer pool的大小node_memory_MemTotal_bytes:宿主机内存大小【由node_exporter提供,还没安装】所以分母为0 所以显示no data
安装node_exporter
安装node_exporter,通过docker-compose安装,配置文件如下:
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
# network_mode: host
environment:
- TZ=Asia/Shanghai
ports:
- 9100:9100
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
通过docker-compose up -d 运行修改tabbar公式:
原公式修改为如下:图中的是没改的
- 如果是通过prometheus的配置文件是【域名:Port】收集的数据、请参看最后一个参考文章。
(label_replace(mysql_global_variables_innodb_buffer_pool_size{instance="$host"}, "nodename", "$1", "instance", "(.*):.*") * 100) / on(nodename) (label_replace(node_memory_MemTotal_bytes, "nodename", "$1", "instance", "(.*):.*"))
公式解释:以下内容来自于GPT
mysql_global_variables_innodb_buffer_pool_size{instance="$host"}:
- 这是 MySQL 服务器
InnoDB缓冲池的大小。{instance="$host"}是一个过滤器,表示只选择与$host变量匹配的实例(即特定的 MySQL 服务器)。
label_replace(mysql_global_variables_innodb_buffer_pool_size{instance="$host"}, "nodename", "$1", "instance", "(.*):.*"):
label_replace是 PromQL 中的一个函数,用于替换或创建新的标签。- 该函数的作用是从
instance标签中提取主机名(即冒号:之前的部分),并将其作为新标签nodename的值。例如,如果instance的值是host123:3306,那么nodename的值将是host123。
(label_replace(...) * 100):
- 这个部分计算
InnoDB缓冲池大小的百分比,因此将innodb_buffer_pool_size乘以 100。
on(nodename):
- 这个部分用于在不同指标之间匹配标签。
on(nodename)表示接下来的运算将在nodename这个标签上进行匹配。
label_replace(node_memory_MemTotal_bytes, "nodename", "$1", "instance", "(.*):.*"):
- 这个表达式提取服务器总内存(
MemTotal),并类似地将instance标签转换为nodename标签。node_memory_MemTotal_bytes是服务器总内存的指标。
(label_replace(...) * 100) / on(nodename) (label_replace(...)):
- 最终的计算是在
nodename上匹配两个转换后的指标:InnoDB缓冲池的大小和服务器总内存。- 这个表达式的最终结果是
InnoDB缓冲池占服务器总内存的百分比。【
修改后就可以看到有数据了。
参考文章: