使用场景:mysql数据库开启慢日志,记录1s以上的sql语句,每出现新的慢sql时,发送到钉钉告警
思路:不需要分析指标也不需要图形界面的话,可以直接使用脚本实现:监控慢日志文件的状态,当状态发生改变时,截取最新一条日志,发送到钉钉机器人。
实现过程:
1.首先确认下自己的mysql设置里开启了慢查询:
slow_query_log=1 # 开启慢日志
slow-query-log-file=/www/server/data/mysql-slow.log # 慢日志路径
long_query_time=1 # 慢查询响应时间设置
2.钉钉群添加机器人:
在群设置里面找到机器人,点击添加机器人
添加完成后复制地址
3.脚本实现
mysql-slow.log文件是我们想监测的文件
mysql-slow.log.md5:这是慢日志的MD5文件,用来储存慢日志文件的状态
mon-监测文件.sh:通过监测慢日志的MD5状态,当状态与MD5文件不一致时,说明慢日志发生了变化,执行一次dingdingpush.sh,然后生成当前慢日志的MD5文件覆盖旧的MD5文件,等待下次慢日志变化
dingdingpush.sh:截取慢日志最后一条日志,把它发送到钉钉机器人
mon-监测文件.sh脚本:
#!/bin/bash
# $filename 需要监测的文件
# $fmd5 存放文件md5值,用于判断文件是否更改
# $mingling 文件更新后,需要执行的命令(用''单引号包起来)
# 适用场景,修改某配置文件或更新某文件以后自动处理某些事物
filename=/www/server/data/mysql-slow.log #这个变量就是要监测的慢日志
fmd5=/www/server/data/mysql-slow.log.md5 #这个变量是慢日志的MD5文件
mingling='./dingdingpush.sh' #这个变量是我们要执行的命令语句
# 生成md5验证文件
function creatMd5file() #这里我们定义了一个方法,名为creatMd5file()
{ #每次调用它都会生成当前慢日志状态的MD5文件
md5sum -b $filename > $fmd5 #这里调用了上面的变量,filename和fmd5
}
# 判断被监测文件是否存在MD5文件,若没有就执行方法先创建一个
if [ ! -e $fmd5 ] ; then
creatMd5file $filename $fmd5
fi
# 下面是一个死循环,一直检测
while(true) ; do
# 检测文件是否修改,$?返回1 表示修改, 0表示未修改
md5sum -c $fmd5 --status # 取当前慢日志的MD5状态,对比MD5文件
if [ $? -gt 0 ] ; then
if [ "$mingling" ]; then # 被修改时执行命令,变量命令在上面有定义
$mingling
fi
creatMd5file $filename $fmd5 # 这里覆盖旧的MD5文件
fi
# 每过1秒检测一次
sleep 1
done
dingdingpush.sh脚本:
text=$(tail -n +`grep -n '# Time' mysql-slow.log | tail -1 | awk -F ':' '{print $1}'` mysql-slow.log) #截取最后一条日志sql
data='{"msgtype": "markdown","markdown": {"title":"137数据库","text":"慢查询:'$text' "},"at":{"isAtAll":true}}'
curl --request POST \
--url 'https://oapi.dingtalk.com/robot/send?access_token=a05a33c1bde6676b5a54f2914c39f6a3cc36c602c41dd0e6dd0619eeb0f820fb' \
--header 'content-type: application/json' \
--data "$data"
这里是通过慢日志的格式,取最后一条日志的关键字行号,通过行号截下最新的一条慢日志
把自己的地址和token粘贴上去即可
4.执行
./mon-监测文件.sh &