lib/plaid/telemetry.ex

defmodule Plaid.Telemetry do
  @moduledoc """
  Custom implementation of `telemetry` using Tesla Middleware.
  """

  @moduledoc deprecated: "Use Tesla.Middleware.Telemetry instead"

  @events_prefix [:plaid, :request]

  @behaviour Tesla.Middleware

  @impl Tesla.Middleware
  @deprecated "Use Tesla.Middleware.Telemetry instead"
  def call(env, next, _opts) do
    metadata = env.opts[:metadata] || %{}
    start_time = System.monotonic_time()

    :telemetry.execute(@events_prefix ++ [:start], %{system_time: start_time}, metadata)

    try do
      Tesla.run(env, next)
    rescue
      exception ->
        :telemetry.execute(
          @events_prefix ++ [:exception],
          %{duration: System.monotonic_time() - start_time},
          Map.put(metadata, :exception, exception)
        )

        reraise exception, __STACKTRACE__
    else
      {:ok, env} = result ->
        :telemetry.execute(
          @events_prefix ++ [:stop],
          %{duration: System.monotonic_time() - start_time},
          Map.merge(metadata, %{result: result, status: env.status})
        )

        result

      {:error, reason} = result ->
        :telemetry.execute(
          @events_prefix ++ [:stop],
          %{duration: System.monotonic_time() - start_time},
          Map.merge(metadata, %{result: result, reason: reason})
        )

        result
    end
  end
end