see https://tech.kanmu.co.jp/entry/2022/12/04/131536
クエリログ
log_statement=all
を設定するとpostgresql.logにクエリログされる。
$ cat postgresql.log 2022-05-30 04:59:41 UTC:10.0.3.147(57382):postgres@postgres:[12768]:LOG: statement: select now(); 2022-05-30 04:59:46 UTC:10.0.3.147(57382):postgres@postgres:[12768]:LOG: statement: begin; 2022-05-30 04:59:48 UTC:10.0.3.147(57382):postgres@postgres:[12768]:LOG: statement: insert into hello values (1); 2022-05-30 04:59:50 UTC:10.0.3.147(57382):postgres@postgres:[12768]:LOG: statement: commit; ...
これを自作のツールposlogでndjsonに変換。
log_min_duration_statement
で出力されたログもパースできた…はず。
$ poslog postgresql.log > data.jsonl $ cat data.jsonl {"Timestamp":"2022-05-30 04:59:41 UTC","Host":"10.0.3.147","Port":"57382","User":"postgres","Database":"postgres","Pid":"[12768]","MessageType":"LOG","Duration":"","Statement":" select now();"} {"Timestamp":"2022-05-30 04:59:46 UTC","Host":"10.0.3.147","Port":"57382","User":"postgres","Database":"postgres","Pid":"[12768]","MessageType":"LOG","Duration":"","Statement":" begin;"} {"Timestamp":"2022-05-30 04:59:48 UTC","Host":"10.0.3.147","Port":"57382","User":"postgres","Database":"postgres","Pid":"[12768]","MessageType":"LOG","Duration":"","Statement":" insert into hello values (1);"} {"Timestamp":"2022-05-30 04:59:50 UTC","Host":"10.0.3.147","Port":"57382","User":"postgres","Database":"postgres","Pid":"[12768]","MessageType":"LOG","Duration":"","Statement":" commit;"} ...
-fingerprint
オプションを付けるとpt-fingerprintのようなinsert into hello values(?+);
という感じのFingerprintフィールドも付与される。
「SELECTだけ」みたいなテストデータのフィルタリングに使えると思う。
あとは、似たようなクエリの集計とか。
また、-fill-params
を付けるとStatementフィールドのプレースホルダー $1
$2
…が実際の値で置換される。*1
負荷テスト
自作のツール qrn を使って、上記ndjsonをテストデータとした負荷テストを実行できる。
https://github.com/winebarrel/qrn
こんな感じ。
qrn -dsn "postgres://pgx_md5:secret@localhost:5432/pgx_test" \ -data data.jsonl -rate 5 -time 300 -nagents 10
上の場合、5エージェント(ユーザー)で5分間、エージェントごとに5 qpsでDBに負荷を与える。
トランザクション
テストデータを複数与えるとエージェントごとに異なるテストデータを実行できるが、簡易化のために -commit-rate
というオプションを用意していて、エージェントがNクエリ実行するごとにcommit; begin
を実行して新しいトランザクションを開始することができるようにしている。