mita2 database life

主にMySQLに関するメモです

スロークエリログをDataDogで可視化するLambda Function を作った

MySQL 徹底入門 第4版が出ましたね! 著者の方々にサインをもらいたいところですが、Stay Homeな昨今なかなかチャンスがありそうにありません。


基本、オンプレ職人なのですが、最近、ちょっとだけ、AWS Auroraを触ったりしています。

Datadog で AWS Aurora のスロークエリログを可視化する Lambda Function を作りました。 Lamda 上でクエリを正規化してから、Datadog に送信しています。

正規化して、どのクエリが多くスロークエリログに出力されているか集計しやすくしています。pt-query-digest がやってるのと同じことです。

SELECT id, name FROM tbl WHERE id = "1000"` 
=> `SELECT id, name FROM tbl WHERE id = ?

SELECT id, name FROM tbl WHERE id IN (10, 20, 30)`
=> `SELECT id, name FROM tbl WHERE id IN (?+)

使い方

zipファイルをlamdaに登録して、Lambdaの環境変数にDatadogのAPIキーを設定するだけで使えます。簡単。 詳しくは、README をご覧ください。

github.com

こんな感じで、スロークエリに頻出しているランキングのグラフが作れます。

f:id:mita2db:20200712135136p:plain
datadog
f:id:mita2db:20200712140252p:plain
datadog

グラフを作るには、Datadog のGrok parser に以下を指定して、スロークエリログから Query_timeRows_examined 等の値をメトリックとして切り出す必要があります。いろいろなケースのログをもれなくパースできるよう、Grok parser を書くのにすごく時間がかかりました・・・

SlowLogRule ^(\# Time: (%{date("yyMMdd  H:mm:ss"):date}|%{date("yyMMdd HH:mm:ss"):date})\n+)?\# User@Host: %{notSpace: user1}\[%{notSpace: user2}\] @ (%{notSpace: host}| ) *\[%{regex("[0-9.]*"): ip}\]  Id:[\x20\t]+%{number: id}\n+\# Query_time: %{number: query_time} *Lock_time: %{number: lock_time} *Rows_sent: %{number: rows_sent} *Rows_examined: %{number: rows_examined}\n(SET timestamp=%{number: timestamp};\n+)?%{regex("[a-zA-Z].*"):query}.

Performance Insights じゃダメなのか

Performance Insights は、待機イベントの多いクエリを見ることはできます。 「何も待機イベントが発生していないけど、遅いクエリ」はPerformance Insights のトップSQLには掲載されてない。 実際、スロークエリログにたくさん出力されているにも関わらず、Performance Insights のトップSQLに掲載されないものがありました。