Skip to main content

lib/http/event_source/telemetry.ex

defmodule HTTP.EventSource.Telemetry do
  @moduledoc """
  Telemetry helpers for EventSource lifecycle and message events.
  """

  @spec connect_start(URI.t()) :: :ok
  def connect_start(url) do
    :telemetry.execute([:http_event_source, :connect, :start], %{start_time: now()}, %{
      url: url,
      scheme: url.scheme,
      host: url.host,
      port: url.port
    })
  end

  @spec connect_stop(URI.t(), non_neg_integer(), non_neg_integer()) :: :ok
  def connect_stop(url, status, duration) do
    :telemetry.execute([:http_event_source, :connect, :stop], %{duration: duration}, %{
      url: url,
      scheme: url.scheme,
      host: url.host,
      port: url.port,
      status: status
    })
  end

  @spec connect_exception(URI.t(), term(), non_neg_integer()) :: :ok
  def connect_exception(url, error, duration) do
    :telemetry.execute([:http_event_source, :connect, :exception], %{duration: duration}, %{
      url: url,
      scheme: url.scheme,
      host: url.host,
      port: url.port,
      error: error
    })
  end

  @spec message_received(URI.t(), String.t(), String.t(), non_neg_integer()) :: :ok
  def message_received(url, event_type, last_event_id, bytes) do
    :telemetry.execute([:http_event_source, :message, :received], %{bytes: bytes}, %{
      url: url,
      event_type: event_type,
      last_event_id: last_event_id
    })
  end

  @spec reconnect_start(URI.t(), term(), non_neg_integer(), non_neg_integer()) :: :ok
  def reconnect_start(url, reason, reconnect_time, attempt) do
    :telemetry.execute(
      [:http_event_source, :reconnect, :start],
      %{reconnect_time: reconnect_time, attempt: attempt},
      %{url: url, error: reason}
    )
  end

  @spec reconnect_stop(URI.t(), non_neg_integer()) :: :ok
  def reconnect_stop(url, attempt) do
    :telemetry.execute([:http_event_source, :reconnect, :stop], %{attempt: attempt}, %{
      url: url
    })
  end

  @spec close_stop(URI.t(), term()) :: :ok
  def close_stop(url, reason) do
    :telemetry.execute([:http_event_source, :close, :stop], %{}, %{
      url: url,
      error: reason
    })
  end

  defp now, do: System.system_time(:microsecond)
end