【Elixir】Ecto V3以上でTelemetryを使ってSQLログを出力する方法
【Elixir】Ecto V3以上でTelemetryを使ってSQLログを出力する方法
ElixirのEcto V3以上でTelemetryを使用してSQLログを出力する方法について説明します。 Telemetryは、ErlangおよびElixirアプリケーションのメトリック、トレース、およびログを収集するためのライブラリです。 これにより、アプリケーションのパフォーマンスを監視し、問題の特定やデバッグが容易になります。
環境
- Elixir 1.14.2
- Ecto 3.9.4
telemetry のインストール
まず、telemetry と telemetry_poller をプロジェクトの依存関係に追加してください。
これらは、Telemetryイベントを収集し、リアルタイムでログ出力を可能にします。
mix.exs ファイル内の deps 関数に次のように追加します。
defp deps do
[
{:telemetry, "~> 1.0"},
{:telemetry_poller, "~> 1.0"},
# 他の依存関係
]
end
追記が完了したら依存関係をインストール & コンパイルします。
$ mix deps.get
$ mix deps.compile
ログモジュールを作成
Telemetryイベントハンドラを設定します。
プロジェクト内の任意のファイル(例えば lib/my_app/telemetry.ex)にTelemetryハンドラを作成してください。
defmodule MyApp.Telemetry do
require Logger
def handle_event([:my_app, :repo, :query], measurements, metadata, _config) do
# ログにメッセージを出力
query = metadata[:query]
source = metadata[:source]
result = metadata[:result]
duration = measurements[:duration]
Logger.info("[#{source}] #{query} - #{duration} ms - result: #{result}")
end
end
イベントの設定
lib/my_app/application.ex ファイル内の start/2 関数内で、次のようにハンドラをアタッチします。
def start(_type, _args) do
# Telemetryハンドラをアタッチ
:ok = :telemetry.attach("my-app-query-logger", [:my_app, :repo, :query], &MyApp.Telemetry.handle_event/4, nil)
# その他のアプリケーション設定
end
これで、アプリケーションがTelemetryを使用してSQLログを出力するように設定されました。 アプリケーションを実行すると、SQLクエリとその実行時間がログに表示されます。