JavaScriptを有効にしてください

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

 ·  ☕ 2 分で読めます

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

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

環境

  • Elixir 1.14.2
  • Ecto 3.9.4

telemetry のインストール

まず、telemetrytelemetry_poller をプロジェクトの依存関係に追加してください。
これらは、Telemetryイベントを収集し、リアルタイムでログ出力を可能にします。
mix.exs ファイル内の deps 関数に次のように追加します。

1
2
3
4
5
6
7
  defp deps do
    [
      {:telemetry, "~> 1.0"},
      {:telemetry_poller, "~> 1.0"},
      # 他の依存関係
    ]
  end

追記が完了したら依存関係をインストール & コンパイルします。

$ mix deps.get
$ mix deps.compile

ログモジュールを作成

Telemetryイベントハンドラを設定します。
プロジェクト内の任意のファイル(例えば lib/my_app/telemetry.ex)にTelemetryハンドラを作成してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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 関数内で、次のようにハンドラをアタッチします。

1
2
3
4
5
6
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クエリとその実行時間がログに表示されます。

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer