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