Skip to main content

lib/http/web_socket/telemetry.ex

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

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

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

  @spec connect_exception(URI.t(), term(), non_neg_integer()) :: :ok
  def connect_exception(url, error, duration) do
    :telemetry.execute([:http_web_socket, :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(), non_neg_integer()) :: :ok
  def message_received(url, opcode, bytes) do
    :telemetry.execute([:http_web_socket, :message, :received], %{bytes: bytes}, %{
      url: url,
      opcode: opcode
    })
  end

  @spec message_sent(URI.t(), String.t(), non_neg_integer(), non_neg_integer()) :: :ok
  def message_sent(url, opcode, bytes, buffered_amount) do
    :telemetry.execute(
      [:http_web_socket, :message, :sent],
      %{bytes: bytes, buffered_amount: buffered_amount},
      %{url: url, opcode: opcode}
    )
  end

  @spec close_start(URI.t(), non_neg_integer() | nil) :: :ok
  def close_start(url, code) do
    :telemetry.execute([:http_web_socket, :close, :start], %{start_time: now()}, %{
      url: url,
      close_code: code
    })
  end

  @spec close_stop(URI.t(), non_neg_integer() | nil, boolean()) :: :ok
  def close_stop(url, code, was_clean) do
    :telemetry.execute([:http_web_socket, :close, :stop], %{}, %{
      url: url,
      close_code: code,
      was_clean: was_clean
    })
  end

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