mysqldumpslowの結果をslackに投げてみた
概要
以前、mysqlのslow query数をslackに投稿させていましたが、数だけでなく質も見ないとダメだなということで、今回はmysqldumpslowによる統計結果を投稿させるようにしました。
mysqldumpslow
MySQLに付属しているツールで、スロークエリログを集計してくれます。
mysqldumpslow実行
例)
mysqldumpslow -s t mysql-slow.log
mysqldumpslow実行結果
回数、平均実行時間などを総消費時間数順に表示してくれます。
Reading mysql slow query log from mysql-slow.log Count: 1179 Time=1.88s (2222s) Lock=0.00s (0s) Rows=10.0 (11790), naked[naked]@33hosts SELECT `timeline_threads`.* FROM `timeline_threads` INNER JOIN `naked_friends` ON `naked_friends`.`naked_id` = N and `naked_friends`.`friend_naked_id` = `timeline_threads`.`naked_id` WHERE `timeline_threads`.`deleted_at` IS NULL ORDER BY `timeline_threads`.`created_at` DESC, `timeline_threads`.`id` DESC LIMIT N Count: 88 Time=17.08s (1502s) Lock=0.00s (0s) Rows=1.0 (88), naked[naked]@24hosts SELECT COUNT(DISTINCT `naked_items`.`id`) FROM `naked_items` INNER JOIN `naked_item_countries` ON `naked_item_countries`.`naked_item_id` = `naked_items`.`id` LEFT OUTER JOIN `nakeds` ON `nakeds`.`id` = `naked_items`.`naked_id` WHERE `naked_item_countries`.`country_id` = 'S' AND `nakeds`.`banned_at` IS NULL AND `nakeds`.`deleted_at` IS NULL AND `naked_items`.`target_type` != 'S' AND (`naked_items`.deleted_at IS NULL) Count: 76 Time=9.09s (690s) Lock=0.00s (0s) Rows=0.8 (59), naked[naked]@[10.10.0.4] SELECT `nakeds`.* FROM `nakeds` WHERE `nakeds`.`reset_password_token` = 'S' LIMIT N ・ ・ ・ ・ ・
slack.sh
mysqldumpslowの結果を全部送ると見切れないので上から3つまでの結果をmessageに入れて投稿するシェルスクリプトを作りました。
#!/bin/bash date=`date '+%Y-%m-%d'` server_name=`hostname` url="https://hooks.slack.com/services/zzzzzzz/xxxxxx/123456789aaa?parse=full" num=`mysqldumpslow -s t /var/log/mysql/mysql-slow.log | head -8` message="($date) $server_name のslow-query top3は\n \`\`\` $num \`\`\` です。" payload="payload={\"text\": \"${message}\", \"username\": \"naked\"}" curl --data "${payload}" ${url}
定期実行
cronで定期実行します。
# # m h dom mon dow command 30 6 * * * /root/work/slack.sh
あとがき
この仕組みで今度こそ他のメンバーの興味を引ければと考えています。。。