はじめに

こんにちは。
Aurora PostgreSQLではスロークエリをCloudWatch Logsに出力することが出来ます(※1、※2)。
で、出力したスロークエリをどう検索すればいいの? というのがこの記事の話になります。

※1 https://qiita.com/westhouse_k/items/2c57e0339a7eb0e16a09
※2 https://repost.aws/ja/knowledge-center/rds-postgresql-query-logging

やり方

CloudWatch Logs Insights に移動します。
以下のクエリを実行することでスロークエリを取得可能です。

filter @logStream like /DBインスタンス名/
| filter @message like /duration/
| parse @message "
UTC::LOG: duration: * ms *" as timestamp, clientip , user , duration_ms, sql

注意点

2つあります。

検索対象のログストリーム

/DBインスタンス名*/

と最後の*がついていますが、これは出力されるログストリームが

DBインスタンス名.0
DBインスタンス名.1
DBインスタンス名.2
DBインスタンス名.3

と4つあり、これら全てを対象とするためです。ですので

testdb
testdb-stg

のようなDBインスタンス命名だと両方カウントされてしまうのでご注意ください。
/DBインスタンス名.[0123]/
のようにすればいけるのかもしれませんが、ごめんなさい試してないです。

そもそも何故複数のログストリームがあるのか謎なんですよね。わかる方いれば教えていただきたいです。
時間でローテーションするような動きでもなさそうでしたが、コピーされて重複しているデータもないので謎です。

出力レコード数

もうひとつは、出力レコード数のデフォルトが1000までということです。
出力されている画面の以下の部分をみると1000行こえたかは簡単にわかります。

最大10000行まで出力可能です。10000行出力したい場合は limit 行を追加します。

filter @logStream like /DBインスタンス名/
| filter @message like /duration/
| parse @message "
UTC::LOG: duration: * ms *" as timestamp, clientip , user , duration_ms, sql
| limit 10000

条件を加えて出力行数を減らすことも出来ます。例えば、遅延が10秒以上のクエリをだす場合はこんなかんじです。

filter @logStream like /DBインスタンス名/
| filter @message like /duration/
| parse @message "
UTC::LOG: duration: * ms *" as timestamp, clientip , user , duration_ms, sql
| filter duration_ms > 10000
| limit 10000

ということで幸せなPostgres スロークエリ検索ライフをおたのしみください。
スロークエリが問題になっている時点で幸せな訳がないのはわかって書いてみました。心が荒んでます。

ではでは。