Copy & Paste Engineer

【Elixir】Ecto V3以上でTelemetryを使ってSQLログを出力する方法

【Elixir】Ecto V3以上でTelemetryを使ってSQLログを出力する方法

ElixirのEcto V3以上でTelemetryを使用してSQLログを出力する方法について説明します。 Telemetryは、ErlangおよびElixirアプリケーションのメトリック、トレース、およびログを収集するためのライブラリです。 これにより、アプリケーションのパフォーマンスを監視し、問題の特定やデバッグが容易になります。

環境

telemetry のインストール

まず、telemetrytelemetry_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クエリとその実行時間がログに表示されます。

参考