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_exporter
和mysqld_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的具体指标及其对应的标签因版本而异,建议查看各自项目的文档以获取最新和详尽的指标列表以及标签信息:
- node_exporter: 可以查阅 Prometheus Node Exporter官方文档
- mysqld_exporter: 查阅 Prometheus mysqld_exporter官方文档
请注意,上述标签列表并不全面,实际使用时请结合具体情况进行分析。
解决
使用hostname变量的dashboard。需要在node_exporter
和mysqld_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
是一个可变的时间间隔。表达式分为四部分:
- 第一部分:
Promql
promqlsum( (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_total
和node_disk_writes_completed_total
的速率进行计算并相除得出平均每秒的写入时间。
- 第二部分:
Promql
promqlor ( 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分钟内磁盘写入的平均响应时间。
- 第三部分:
Promql
promqlor avg_over_time(aws_rds_write_latency_average{hostname="$host"}[$interval])
如果目标主机同时也是AWS RDS实例,这部分会计算过去
$interval
时间内RDS实例的平均写入延迟(aws_rds_write_latency_average
)。
- 第四部分:
Promql
promqlor 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监控较好,开箱即用