首页 > 数据库 >使用node_exporter方式采集MySQL慢SQL信息在grafana面板显示

使用node_exporter方式采集MySQL慢SQL信息在grafana面板显示

时间:2023-08-14 10:34:20浏览次数:73  
标签:node slow mysql xxx exporter SQL query

【背景说明】

因为要集成监控数据,需要把MySQL的慢SQL日志信息显示在grafana,其他方法抓取慢日志然后显示到面板需要安装挺多插件,是简单的脚本采集数据,这里使用node_exporter方式实现。

说明:看实际情况,方便的采集MySQL慢日志的话可以直接使用PMM来监控就行

【步骤】

前提:安装好prometheus跟grafana跟MySQL

1,在MySQL主机上面安装好node_exporter

node_exporter配置指定需要扫描的文件路径参数 --collector.textfile.directory=,这里指定的是/root/soft/prometheus_exporter/node_exporter-1.3.1/slow/slowlog目录:

cat  /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus_exporter.io/
After=network.target
[Service]
ExecStart=/root/soft/prometheus_exporter/node_exporter-1.3.1/node_exporter --collector.textfile.directory=/root/soft/prometheus_exporter/node_exporter-1.3.1/slow/slowlog
Restart=on-failure
[Install]
WantedBy=multi-user.target

 

2,创建生成prometheus能识别的格式日志SHELL脚本

定义临时慢日志文件名称logfile变量,定义Prometheus读取prometheus_directory目录变量,然后采集各个指标

cd /root/soft/prometheus_exporter/node_exporter-1.3.1/slow
vim mysql_slow.sh #!/bin/bash # 输入日志文件路径 logfile="mysql01_slow.log" # 指标名称 metric_name="mysql_slow_query_duration_seconds" # 指定Prometheus读取目录 prometheus_directory="/root/soft/prometheus_exporter/node_exporter-1.3.1/slow" cd ${prometheus_directory} rm -rf mysqlslow.prom echo "# HELP mysql_slow_query_text">>mysqlslow.prom echo "# TYPE mysql_slow_query_text gauge">>mysqlslow.prom # 逐行读取日志文件并处理每个日志条目 while IFS= read -r line || [[ -n "$line" ]]; do if [[ $line == "# Time:"* ]]; then # 如果是新的日志条目的开头,初始化指标值 query_time="" lock_time="" rows_sent="" rows_examined="" query="" timestamp="" vdate=$(echo "$line" |awk '{print $3}') username="" elif [[ $line == "# User@Host:"* ]]; then #定义用户信息字段 username=$(echo "$line" |awk '{print $3}') elif [[ $line == "SET timestamp="* ]]; then # 在日志条目末尾,生成Prometheus格式数据并输出到文件 timestamp=$(echo "$line" | awk '{print $2}') elif [[ $line == "# Query_time:"* ]]; then # 提取指标值 query_time=$(echo "$line" | awk '{print $3}') lock_time=$(echo "$line" | awk '{print $5}') rows_sent=$(echo "$line" | awk '{print $7}') rows_examined=$(echo "$line" | awk '{print $9}') elif [[ $line != "# "* ]]; then # 提取SQL查询语句 #query=$line query+=" $line" printf "mysql_slow_query_text{query_time=\"%s\",lock_time=\"%s\",rows_sent=\"%s\",rows_examined=\"%s\",query=\"%s\",username=\"%s\",vdate=\"%s\"} %s\n" \ "$query_time" "$lock_time" "$rows_sent" "$rows_examined" "$query" "$username" "$vdate" "$query_time" >> mysqlslow.prom fi done < "${prometheus_directory}/$logfile"
#拷贝文件到Prometheus读取目录 mv mysqlslow.prom "${prometheus_directory}/slowlog"

执行生成prometheus能识别的格式日志SHELL脚本,能正常采集数据格式如下即可:

有指标头信息跟具体采集的mysql_slow_query_text指标值信息,格式一定要准确

cat slowlog/mysqlslow.prom 
# HELP mysql_slow_query_text
# TYPE mysql_slow_query_text gauge
mysql_slow_query_text{query_time="0.002526",lock_time="0.000147",rows_sent="513",rows_examined="513",query=" SELECT /*replication-manager*/ UPPER(Variable_name) AS variable_name, UPPER(Variable_Value) AS value FROM performance_schema.global_variables;",username="dbadmin[dbadmin]",vdate="2023-08-13T11:19:05.213554+08:00"} 0.002526
mysql_slow_query_text{query_time="0.002886",lock_time="0.000121",rows_sent="513",rows_examined="513",query=" SELECT /*replication-manager*/ UPPER(Variable_name) AS variable_name, UPPER(Variable_Value) AS value FROM performance_schema.global_variables;",username="dbadmin[dbadmin]",vdate="2023-08-13T11:19:07.365838+08:00"} 0.002886
mysql_slow_query_text{query_time="0.002561",lock_time="0.000176",rows_sent="513",rows_examined="513",query=" SELECT /*replication-manager*/ UPPER(Variable_name) AS variable_name, UPPER(Variable_Value) AS value FROM performance_schema.global_variables;",username="dbadmin[dbadmin]",vdate="2023-08-13T11:19:09.477784+08:00"} 0.002561

 

3,查看是否能正常采集到数据到curl

重启一下node_exporter,服务状态没有报错即可,访问一下采集信息,采集正常即可

systemctl  restart node_exporter
systemctl  status node_exporter
http://xxx.xxx.xxx.xxx:9100/metrics

 

3,创建增量采集日志SHELL的脚本

cd /root/soft/prometheus_exporter/node_exporter-1.3.1/slow

注意先定义一下自己实际的变量,定义60秒自动扫描MySQL慢日志interval,MySQL本身的慢日志信息slowlog_path,定义存处理后的慢日志文件路径v_node_exporter_slow_path

vim cut_mysql_slowlog.sh
#!/bin/bash

# 定时运行的频率(以秒为单位)
interval=60

# 慢查询日志文件路径
slowlog_path=/db/mysql/mysql01_slow.log
v_node_exporter_slow_path=/root/soft/prometheus_exporter/node_exporter-1.3.1/slow
v_lastpos_files="${v_node_exporter_slow_path}/last_pos"
v_mysql_slow_log=mysql01_slow.log

# 检查文件是否存在
if [ -e "$v_lastpos_files" ]; then
  # 读取文件内容并将其赋给变量
  last_pos=$(cat "$v_lastpos_files")
else
  # 如果文件不存在,则创建文件并赋空值给变量
  echo $(wc -c < "$slowlog_path") > "$v_lastpos_files"
  last_pos=$(cat "$v_lastpos_files")
fi

# 循环运行
while true; do
  # 获取当前日志文件大小
  current_file_size=$(wc -c < "$slowlog_path")
  
  # 如果文件有更新
  if [ "$current_file_size" -gt "$last_pos" ]; then
    # 从上一次位置开始提取增量数据
    tail -c $((current_file_size-last_pos)) "$slowlog_path"  > ${v_node_exporter_slow_path}/mysql01_slow.log
    sh ${v_node_exporter_slow_path}/mysql_slow.sh
    # 更新上一次位置为当前文件大小
    last_pos=$current_file_size
    echo "$last_pos" > ${v_node_exporter_slow_path}/last_pos
  else
    echo ""> ${v_node_exporter_slow_path}/mysql01_slow.log
    sh ${v_node_exporter_slow_path}/mysql_slow.sh
  fi
  
  # 等待一段时间后再次检查
  sleep "$interval"
done

执行增量采集MySQL的SHELL脚本,观察v_node_exporter_slow_path路径下的mysql01_slow.log文件内容是增量的,则采集正常,同时查看node_exporter状态跟slowlog/mysqlslow.prom信息是最新的即可。

nohup sh cut_mysql_slowlog.sh &

 

【面板显示】

配置好监控配置文件,这里有node_exporter跟mysqld-exporter信息,mysqld-exporter自行安装,主要将监控面板放到MySQL里面去

  - job_name: linux_187
    static_configs:
      - targets: ['xxx.xxx.xxx.xxx:9100']
        labels:
          instance: xxx.xxx.xxx.xxx
  - job_name: mysql_187
    static_configs:
      - targets: ['xxx.xxx.xxx.xxx:9104']
        labels:
          instance: xxx.xxx.xxx.xxx

 导入两个面板后,能查看到具体的监控信息,然后再MySQL面板新建一个面板,面板视图为table,添加监控的指标

 根据实际情况过滤数据或者修改字段的名称及排版样式

 最终效果

 

【说明】

当前是使用shell脚本60秒采集一下数据的,面板数据会延迟60秒,时间字段数据是从慢日志文件中提取,时间信息精确。

标签:node,slow,mysql,xxx,exporter,SQL,query
From: https://www.cnblogs.com/zetanchen/p/17626398.html

相关文章

  • 探索MySQL 8的事务数据字典:数据库对象信息存储
    MySQL8带来了重大的架构变革,用事务数据字典(TDD)这种更高效、更可靠的方法取代了传统的基于MyISAM引擎的系统表。这一升级极大地改进了元数据的管理和存储,从而提高了各种数据库对象的可靠性和可扩展性。本文将通过实际案例探讨MySQL8事务数据字典的复杂性、优势及其在现实生活中......
  • 技术分享 | kill掉mysqld_safe进程会影响mysqld进程?
    1、背景公司内部看到一则问题1、kill-9mysqld_safe进程2、systemd检测到mysqld_safe进程不存在后,重新拉起mysqld_safe进程3、mysqld_safe进程启动后,发现mysqld进程也被重启期望:启、停mysqld_safe进程,不会影响mysqld进程2、systemd服务启动2.1、复现问题......
  • 面试官:为什么MySQL不建议使用NULL作为列默认值?(转)
    原文:https://mp.weixin.qq.com/s/4aWKVvGTjG4Hiv2ULxQiAg来源:微信公众号“Java充电社”今天来分享一道美团高频面试题,5分钟搞懂“为什么MySQL不建议使用NULL作为列默认值?”。对于这个问题,通常能听到的答案是 使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你......
  • PostgreSQL 15 源码安装一安装包依赖
    PostgreSQL15源码安装简单安装流程:./configuremakesumakeinstalladduserpostgresmkdir-p/usr/local/pgsql/datachownpostgres/usr/local/pgsql/datasu-postgres/usr/local/pgsql/bin/initdb-D/usr/local/pgsql/data/usr/local/pgsql/bin/pg_ctl-D/usr/local/pgsql......
  • 开源数据库Mysql_DBA运维实战 (修改root密码)
    本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password('新密码');例子:mysql>setpasswordforroot@localh......
  • 17.Sql Monitor RePort
    1.SqlMonitor's监控的前提条件SqlMonitor是监控一条Sql是怎样执行的,当启用SQLMonitor功能时,当满足以下任何条件时,数据库会自动监控简单的数据库操作:ASQLstatementorPL/SQLsubprogramhasconsumedatleast5secondsofCPUorI/Otimeinasingleexecution.(cp......
  • sql日期表
    sethive.execution.engine=tez;withdatesas(selectdate_add("2000-01-01",a.pos)asdfrom(selectposexplode(split(repeat("o",datediff("2023-12-31","2000-01-01")),"o")))a)--insertoverwritetable......
  • nacos 使用 MySQL8.x 出现 Nacos No DataSource set异常解决
    http://www.taodudu.cc/news/show-6345954.html?action=onClick nacos使用MySQL8.x出现NacosNoDataSourceset异常解决注:当前版本nacos2.1.0 1、nacos默认室mysql5.7当链接mysql8.x,会出现异常【NacosNoDataSourceset】解决:在nacos安装目录下新建plugins/mysql文......
  • #yyds干货盘点#node 封装 http请求
    varhttp=require("http");varurlUtil=require('url');varfile=require("./file");varquerystring=require('querystring');varHttpUtil={//get提交url,返回html数据get:function(url,success,error){......
  • mysql添加非 root 级别用户
    进入mysql容器内部dockerexec-itCOMMAND/bash输入密码登录MySQL回车输入密码passwordroot@94c490e7da78:/#mysql-pEnterpassword:添加数据库先使用root用户添加数据库:--进入sql服务后首先查看有哪些数据库showdatabases;--若没有新建一个CREATE......