1.问题描述
1)问题现象
通过prometheus监控mysql实例和服务器,使用grafana做可视化展示,grafana 中添加 7362 号dashboard 作为mysql看板,添加 11074 号dashboard 作为主机看板。但是添加后查看 MySQL Overview 看板发现 Buffer Pool Size of Total RAM 这个panel 显示 No data,截图如下:
2) prometheus 中关于mysql实例和主机监控配置方式如下:
prometheus 配置文件中指定了mysql监控任务及mysql服务器监控任务
下面我们来看一下具体的mysql实例及对应的mysql服务器监控怎么配置的
- 先看服务器监控配置文件
- vi prd_host.yml
- - targets: ['172.25.xx.xxx:9100']
- labels:
- instance: '172.25.xx.xxx'
- env: 'xxx mysql 服务器'
- group: 'xxx'
-
- 再看mysql实例监控配置文件
- vi prd_mysql.json
- [{
- "targets": [ "172.25.xx.xxx:9104" ],
- "labels": {
- "instance": "172.25.xx.xxx:3306",
- "env": "xxx mysql",
- "job": "mysqld"
- }
- }
- ]
像上面这样一通配置下来,最终导致MySQL Overview 看板的 Buffer Pool Size of Total RAM 这个panel 显示 No data。
2.问题分析
我们先看一下Buffer Pool Size of Total RAM 这个panel的计算公式:
(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监控和node监控所有的收集值
curl http://127.0.0.1:9104/metrics >mysql_metrics.txt
curl 127.0.0.1:9100/metrics >node_metrics.txt
检查发现mysql_global_variables_innodb_buffer_pool_size 这个值是mysql监控收集的,但是node_memory_MemTotal_bytes 这个值是node监控收集的。
所以上面的查询是在一个计算公式中即使用了node_export收集的值又使用mysqld_exprot使用的值。以上面的公式为例,我们怎么让他能够同时获取两个不同监控客户的的信息呢?我们看到上面的公式中根据 instance 来识别和获取监控值,如果我们在配置文件中不显示指定instance 标签的话,默认使用target指定值作为instance值,比如上面的主机监控如果没有指定 instance 值,那么默认的instance值即为172.25.xx.xxx:9100。如果在target 下显示指定了 instance 标签那么instance值即为标签指定值172.25.xx.xxx。
所以如果我们给172.25.xx.xxx 它的服务器监控和mysql实例监控都指定同样的instance标签,就可以同时获取到不同监控客户端的值了。
NOTE:有个疑问,如果两个监控客户端都收集了同样的信息比如node_memory_MemTotal_bytes,我们指定同样的instance 标签会出现什么问题呢?
3.问题处理
给mysql监控配置和主机监控配置指定同样的instance标签,这再观察Buffer Pool Size of Total RAM 这个panel,就会正常显示数据了。
例如:
- 先看服务器监控配置文件
- vi prd_host.yml
- - targets: ['172.25.xx.xxx:9100']
- labels:
- instance: '172.25.xx.xxx_3306'
- env: 'xxx mysql 服务器'
- group: 'xxx'
-
- 再看mysql实例监控配置文件
- vi prd_mysql.json
- [{
- "targets": [ "172.25.xx.xxx:9104" ],
- "labels": {
- "instance": "172.25.xx.xxx_3306",
- "env": "xxx mysql",
- "job": "mysqld"
- }
- }
- ]