buffer pool size of total ram no data 亲测有效

时间:2022-12-04 08:53:05

本文使用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节点

buffer pool size of total ram no data 亲测有效

你的应该是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标签

buffer pool size of total ram no data 亲测有效

这样同一个实例下就会有两个节点,发现 node-exporter和mysql-exporter两个服务,也就可以获取

mysql_global_variables_innodb_buffer_pool_size和 node_memory_MemTotal_bytes两个属性

此时host会显示一个mysql1,如下

buffer pool size of total ram no data 亲测有效

如果出现了,则buffer pool size of total ram 一定正常显示了!

至此大功告成!!!