本文使用docker安装 下载文件安装也是同一种思路
1.必须要有的镜像
node-exporter:
image: quay.io/prometheus/node-exporter
container_name: node-exporter
hostname: node-exporter
restart: always
ports:
- "9100:9100"
networks:
- monitor
exporter:
container_name: mysql-exporter
image: prom/mysqld-exporter
restart: always
ports:
- "9104:9104"
networks:
- monitor
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- DATA_SOURCE_NAME=账号:密码@(host.docker.internal:3306)/
prometheus:
container_name: prometheus
image: prom/prometheus
networks:
- monitor
ports:
- "9090:9090"
volumes:
- /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
container_name: grafana
image: grafana/grafana
networks:
- monitor
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
ports:
- "13000:3000"
volumes:
- /opt/Grafana:/var/lib/grafana
networks:
monitor:
node-exporter 获取监控机器系统数据
mysql-exporter 获取mysql数据
prometheus 普罗米修斯数据库
grafana 数据展示
上面四个镜像一个都不能少,特别是node-exporter,下面讲原因
prometheus yml
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
labels:
appname: 'Prometheus'
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- target: ['mysql-exporter:9100']
labels:
instance: 'mysql-export_3306'
- job_name: 'mysql'
scrape_interval: 10s
static_configs:
- targets: ['mysql-exporter:9104']
labels:
instance: 'mysql-export_3306'
appname: 'mysql'
我使用的自定义网络所以 ip直接写成服务名
上面三个节点一个都不能少 与上面的镜像对应
注意instance 两个实例名称一定要保持一致
现在解析上面为什么要有4个镜像,下面为什么有三个节点,以及为什么instance名称要保持一致
如果你的镜像没有 “node-exporter 获取监控机器系统数据” 这个镜像,buffer pool size of total将一直显示无数据,因为这个数据没有采集,而采集这个数据需要“node-exporter ”这个镜像,所以一定要需要这个镜像,整个mysql监控,只有buffer pool size of total这个属性需要node-exporter这个节点采集的信息,所以监控显示只有buffer pool size of total这个属性nodata,其它都是正常显示
现在来看下buffer pool size of total这个属性的采集公式
(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和node_memory_MemTotal_bytes
mysql_global_variables_innodb_buffer_pool_size这个属性需要prom/mysqld-exporter这个镜像采集,而node_memory_MemTotal_bytes这个属性则需要node-exporter这个镜像采集,综上所述
为什么需要四个镜像和三个节点的原因解释清楚了。
如果这个时候你去启动应用你会发现 buffer pool size of total 仍然显示是nodata
原因如下这个采集公式中
(mysql_global_variables_innodb_buffer_pool_size{instance="$host"} * 100) / on (instance) node_memory_MemTotal_bytes{instance="$host"}
instance实例默认使用的是'$host',也就是mysqlexporter节点
你的应该是ip加端口号,或者是服务名加端口号
注意 上面说过 buffer pool size of total 这个属性需要两部分数据
mysql_global_variables_innodb_buffer_pool_size(由mysqlexporter提供)和node_memory_MemTotal_bytes(nodeexporter提供)
而此时的实例名称是myqlexporter 所以只显示了mysql_global_variables_innodb_buffer_pool_size的值,而node_memory_MemTotal_bytes查找不到这个属性 任何数字除以一个未定义的字段显示的必然是 未定义也就是nodata
此时你可能会想,我可以把instance这个实例换掉
(mysql_global_variables_innodb_buffer_pool_size{instance="$host"} * 100) / on (instance) node_memory_MemTotal_bytes{instance="$host"}
上面的除数 用mysqlexporter节点,而下面的被除数用nodeexport节点,
写成如下格式
(mysql_global_variables_innodb_buffer_pool_size{instance="mysql-exporter:端口号} * 100) / on (instance) node_memory_MemTotal_bytes{instance="node-exporter:端口号"}
想法是美好的,但是现实很残酷,不行,仍然是nodata,
目前不支持这种双实例的写法 ,然后研究发现有一种动态实例的写法
只需把(mysql_global_variables_innodb_buffer_pool_size{instance="$host"} * 100) / on (instance) node_memory_MemTotal_bytes{instance="$host"}
换成如下写法即可
(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", "(.*):.*"))
换成这种写法有的人可以,有的人不可以,可以的人 用的ip+端口号去采集数据,不可以的人用的是:服务名+端口号,为什么前者可以而后者不可以,原因是上面的替换公式用的是正则匹配“(.*):.*")”,这个结果匹配下来是前面ip不变而端口号变了,所以达到动态instance的效果,而用服务名+端口号 也用这个正则去匹配的话,是匹配不成功的,因为前面的ip变成了服务名,而服务名是不可能相同的,也就永远不肯匹配成功。
用ip+port这种形式的buffer pool size of total 这个属性 到这里已经成功返回值了,而用服务名的则不行,那用服务名+端口这种形式应该怎么办
给mysql监控配置和主机监控配置指定同样的instance标签
这样同一个实例下就会有两个节点,发现 node-exporter和mysql-exporter两个服务,也就可以获取
mysql_global_variables_innodb_buffer_pool_size和 node_memory_MemTotal_bytes两个属性
此时host会显示一个mysql1,如下
如果出现了,则buffer pool size of total ram 一定正常显示了!
至此大功告成!!!