grafana mysql overviewer面板值缺失的处理

mysql

https://grafana.com/grafana/dashboards/?search=mysql+overview

mysql 是 5.7

7362

ID: 7362

By: nasskach

Last update: 2018-08-07T09:26:18

Downloads: 1,439,710

reviews: 11

导入如图面板

导入后以下几个指标是拿不到数据的

  • BufferPool Size of Total RAM
  • Process States
  • Top Process States Hourly
  • System Charts

BufferPool Size of Total RAM

具体原因参考这篇文章:https://blog.csdn.net/m0_63163813/article/details/128141727

14934

ID: 14934

By: guaiguaile

Last update: 2021-08-27T07:32:25

Downloads: 219

reviews: 0

这两个mysql的面板,有的有值,有的没有值,总结起来2个原因

hostname 和 instance 标签不一样

  • 7362 使用的host

  • 14934 使用的host

提问通义千问:

问:node_exporter 和mysqldexporter的内置标签都有哪些

答:

node_exportermysqld_exporter 分别提供了丰富的内置指标,它们都具有多种标签以便区分不同的监控对象和上下文。以下是它们各自一些典型的内置标签:

node_exporter 内置标签:

node_exporter 会暴露许多关于操作系统和硬件资源的指标,下面是一些常见的标签:

  • instance : 指标实例的唯一标识符,通常是Exporter监听的IP地址和端口,例如 localhost:9100
  • job: 在Prometheus配置中定义的作业名称,用于标识一组相同类型的Exporter。
  • cpu: 表示CPU核心编号,用于区分不同CPU核心的指标。
  • device: 对于磁盘、网络接口等指标,表示具体的设备名称。
  • interface: 对于网络流量相关的指标,表示网络接口名称。
  • mode: 在某些情况下,如CPU模式(guest、idle、iowait等)。
  • filesystem: 文件系统的名称,用于标识不同磁盘分区或挂载点。
  • fstype: 文件系统的类型,如ext4、xfs等。

mysqld_exporter 内置标签:

mysqld_exporter 主要关注MySQL数据库服务器的性能指标,以下是一些可能的标签:

  • instance: 类似于node_exporter,标识MySQL服务器的地址和端口。
  • job: 作业名称,同样标识一组MySQL服务器。
  • schema: 数据库Schema名称。
  • user: 连接到数据库的用户。
  • host: 连接MySQL服务器的客户端主机名或IP。
  • query_type: 查询类型的标签,用于区分不同类型的MySQL查询(如select、update、insert等)。

每个Exporter的具体指标及其对应的标签因版本而异,建议查看各自项目的文档以获取最新和详尽的指标列表以及标签信息:

请注意,上述标签列表并不全面,实际使用时请结合具体情况进行分析。

解决

​ 使用hostname变量的dashboard。需要在node_exportermysqld_exporter中增加标签hostname即可,或者直接重命名label。我这里使用的是重命名

  - job_name: 'node'
    basic_auth:
      username: admin
      password: 123456
    relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):(\d+)'  # 匹配IP:port格式
        replacement: '${1}'
        target_label: hostname  # 把instance标签的内容复制到hostname标签
        action: replace
    file_sd_configs:
    - files:
      - 'node.yml'
  - job_name: mysql # To get metrics about the mysql exporter's targets
    basic_auth:
      username: admin
      password: Mon2024##
    relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):(\d+)'  # 匹配IP:port格式 
        replacement: '${1}'
        target_label: hostname  # 把instance标签的内容复制到hostname标签
        action: replace
    file_sd_configs:
    - files:
      - 'mysql.yml'

除数为0

读延迟

sum((rate(node_disk_read_time_seconds_total{device!~"dm-.+", hostname="$host"}[$interval]) / rate(node_disk_reads_completed_total{device!~"dm-.+", hostname="$host"}[$interval])) or (irate(node_disk_read_time_seconds_total{device!~"dm-.+", hostname="$host"}[5m]) / irate(node_disk_reads_completed_total{device!~"dm-.+", hostname="$host"}[5m])) or avg_over_time(aws_rds_read_latency_average{hostname="$host"}[$interval]) or avg_over_time(aws_rds_read_latency_average{hostname="$host"}[5m]))

写延迟

sum((rate(node_disk_write_time_seconds_total{device!~"dm-.+", hostname="$host"}[$interval]) / rate(node_disk_writes_completed_total{device!~"dm-.+", hostname="$host"}[$interval])) or (irate(node_disk_write_time_seconds_total{device!~"dm-.+", hostname="$host"}[5m]) / irate(node_disk_writes_completed_total{device!~"dm-.+", hostname="$host"}[5m])) or avg_over_time(aws_rds_write_latency_average{hostname="$host"}[$interval]) or avg_over_time(aws_rds_write_latency_average{hostname="$host"}[5m]))

看AI的解释

这段PromQL表达式用于监控特定主机(hostname="$host")的磁盘写入性能,同时也兼容AWS RDS数据库的写入延迟指标。这里假设$host$interval是预先定义好的变量,$host代表待监控的主机名,$interval是一个可变的时间间隔。

表达式分为四部分:

  1. 第一部分

Promql

promql 复制代码
sum(
  (rate(node_disk_write_time_seconds_total{device!~"dm-.+", hostname="$host"}[$interval]) /
   rate(node_disk_writes_completed_total{device!~"dm-.+", hostname="$host"}[$interval]))
)

这段代码计算的是过去$interval时间内非逻辑卷设备(device!~"dm-.+")的磁盘写入平均响应时间。它通过对node_disk_write_time_seconds_totalnode_disk_writes_completed_total的速率进行计算并相除得出平均每秒的写入时间。

  1. 第二部分

Promql

promql 复制代码
or (
  irate(node_disk_write_time_seconds_total{device!~"dm-.+", hostname="$host"}[5m]) /
  irate(node_disk_writes_completed_total{device!~"dm-.+", hostname="$host"}[5m])
)

如果在$interval间隔内没有足够的样本点进行计算,这部分提供了一个备选方案,即计算过去5分钟内磁盘写入的平均响应时间。

  1. 第三部分

Promql

promql 复制代码
or avg_over_time(aws_rds_write_latency_average{hostname="$host"}[$interval])

如果目标主机同时也是AWS RDS实例,这部分会计算过去$interval时间内RDS实例的平均写入延迟(aws_rds_write_latency_average)。

  1. 第四部分

Promql

promql 复制代码
or avg_over_time(aws_rds_write_latency_average{hostname="$host"}[5m])

如果在$interval间隔内RDS写入延迟指标的数据不足,这部分提供了一个备选方案,即计算过去5分钟内的平均写入延迟。

整个表达式通过 sum() 函数汇总以上四个计算结果,但实际上,sum() 在这里可能并不适用,因为这里涉及的是多个不同类型且无直接累加关系的指标。通常,你会独立监控每个条件,而不是将它们求和。如果目标是为了获取最新的磁盘写入平均响应时间,应分别查看各部分的结果。

  • 监控值

    node_disk_write_time_seconds_total{device="sda",hostname="192.168.1.175"}[5m]
    node_disk_writes_completed_total{device="sda",hostname="192.168.1.175"}[5m]
    
  • 监控都是有值的

  • 通过inspect拿到PromQL表达式

    sum((rate(node_disk_read_time_seconds_total{device=~"sd.+", hostname="192.168.1.175"}[5s]) / rate(node_disk_reads_completed_total{device=~"sd.+", hostname="192.168.1.175"}[5s])) or (irate(node_disk_read_time_seconds_total{device!~"dm-.+", hostname="192.168.1.175"}[5m]) / irate(node_disk_reads_completed_total{device!~"dm-.+", hostname="192.168.1.175"}[5m]))
    or avg_over_time(aws_rds_read_latency_average{hostname="192.168.1.175"}[5s]) or avg_over_time(aws_rds_read_latency_average{hostname="192.168.1.175"}[5m]))
    
  • 在标签data中已经可以发现拿到的值是NaN

  • 执行得到同样的结果
  • 第一部分的值为空(device=可以换其他的盘,2分钟采集一次,5s内大概率没获取到值)

    rate(node_disk_read_time_seconds_total{device=~"sd.+", hostname="192.168.1.175"}[5s]) / rate(node_disk_reads_completed_total{device=~"sd.+", hostname="192.168.1.175"}[5s])

  • 第二部分就是NaN了

    irate(node_disk_read_time_seconds_total{device=~"sd.+", hostname="192.168.1.175"}[5m]) / irate(node_disk_reads_completed_total{device!="sda.+", hostname="192.168.1.175"}[5m])

  • 再拆发现除数为0

    irate(node_disk_reads_completed_total{device!="sda.+", hostname="192.168.1.175"}[5m])

解决

本地测试只保留了sd磁盘

rate(node_disk_read_time_seconds_total{device=~"sd.+", hostname="$host"}[$interval]) / rate(node_disk_reads_completed_total{device=~"sd.+", hostname="$host"}[$interval])

rate(node_disk_write_time_seconds_total{device=~"sd.+", hostname="$host"}[$interval]) / rate(node_disk_writes_completed_total{device=~"sd.+", hostname="$host"}[$interval])

可以看到还是有NaN的值,说明除数还有可能是0


​ 其他没有数据的面板按照这两种方法应该都能解决,不过数据库类的监控,还是使用现成的PMM监控较好,开箱即用

相关推荐
Python之栈4 分钟前
【无标题】
数据库·python·mysql
亦世凡华、32 分钟前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
White_Mountain11 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
老王笔记11 小时前
GTID下复制问题和解决
mysql
Lojarro12 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
TianyaOAO12 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong13 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
W215514 小时前
Liunx下MySQL:表的约束
数据库·mysql
nbsaas-boot16 小时前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
奥顺16 小时前
PHPUnit使用指南:编写高效的单元测试
大数据·mysql·开源·php