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