Groongaを使っていて問題が起きた時に、問題を再現させるために、問題が起きた時に実行していたクエリーを手元の環境でも実行したくなります。 実行するクエリーが少ない場合(1つか2つくらい)であれば、手作業で実行してもそんなに苦ではありませんが、実行するクエリーが大量にある場合は、手作業では限界があります。
Groongaには、groonga-query-log という便利なツールがあります。 この groonga-query-log には、クエリーログを手軽に再生するスクリプトが含まれています。 このスクリプトを使うことで、クエリーログに記載されているクエリーをログに記録されている順番で再生することができます。つまり、クエリーログさえあれば、簡単にログに記録されているクエリーを実行できます。
Groongaのクエリーログは、以下のようにGroongaを起動する際に--query-log-path
を指定することで、指定されたパスにクエリーログを作成できます。
(以下の例ですと、ホームディレクトリの直下にgroonga.query.log
という名前でクエリーログができます。)
% groonga --query-log-path ~/groonga.query.log ~/db/db
ちなみに、groonga-query-log には、今回紹介するクエリーログを手軽に再生するスクリプトだけではなく、先日このブログで紹介されていた、クラッシュ時のログを解析するスクリプトや スロークエリーを特定するスクリプト、回帰テストを実行するスクリプト等、様々なスクリプトがありますので、興味が湧いたら他の機能についても使ってみて下さい。
クエリーログを再生するスクリプトの使い方は以下の通りです。
事前にRubyをインストールします。Rubyをインストールしたら以下のコマンドで groonga-query-log をインストールします。
% gem install groonga-query-log
次は、再生するクエリーを実行するためにデータベースを準備します。
ログを取得したマシンのデータベースが使える場合は、そちらを使うと新たにデータベースを準備しなくてすみますが、問題が起きたときには問題が発生したデータベースは使えないこともあるので、問題が発生したデータベースのダンプ等から、新しく手元の環境でデータベースを生成するほうが多いかもしれません。
今回の例では、以下のコマンドで、データベースのダンプから、新しくデータベースを作成します。
% groonga --file dump.grn -n ~/testdb/db
次は再生するクエリーを実行するGroongaを起動します。Groongaはサーバーモードで起動します。プロトコルは、gqtp, httpのどちらでも問題ありません。 例えば、httpプロトコルを使用する場合は、以下のように起動します。
% groonga -s --protocol http ~/testdb/db
Groongaをサーバーモードで起動したら、準備完了です。 以下のように、 groonga-query-log-replay コマンドを実行して、クエリーログを再生できます。
% groonga-query-log-replay --n-clients=1 --output-responses=./response.log replay-query.log
--n-clients
はクエリーを実行するクライアント数を設定できます。
--output-responces
は実行したクエリーの結果を保存するファイルを指定します。最後に、再生するクエリーログ(上の例では、replay-query.log)を指定して実行します。
これで、指定したクエリーログに記録されているクエリーが実行され、実行結果が、--output-responses
で指定したファイルに記録されます。
デフォルトでは、localhostの10041ポートに接続しますが、--host
オプションと --port
オプションを使うことで、それぞれ変更することができます。