defmodule Anthropic.Telemetry do @moduledoc """ Telemetry integration for the Anthropic client. All events are prefixed with `[:anthropic]`. ## Events - `[:anthropic, :request, :start]` — before an API request - `[:anthropic, :request, :stop]` — after a successful API request - `[:anthropic, :request, :exception]` — on request failure - `[:anthropic, :rate_limited]` — when a 429 triggers a retry """ @doc """ Executes a `:start` telemetry event and returns the monotonic start time. `event` is a list of atoms appended to `[:anthropic]` (e.g. `[:request]`). `meta` is the metadata map forwarded to `:telemetry.execute/3`. `extra_measurements` are merged with the `:system_time` measurement. """ @spec start(list(atom()) | atom(), map(), map()) :: integer() def start(event, meta \\ %{}, extra_measurements \\ %{}) do start_time = System.monotonic_time() :telemetry.execute( build_event_prefix(event, :start), Map.put(extra_measurements, :system_time, System.system_time()), meta ) start_time end @doc """ Executes a `:stop` telemetry event, measuring duration since `start_time`. `start_time` should be the value returned by `start/3`. `extra_measurements` are merged with the computed `:duration`. """ @spec stop(list(atom()) | atom(), integer(), map(), map()) :: :ok def stop(event, start_time, meta \\ %{}, extra_measurements \\ %{}) do end_time = System.monotonic_time() measurements = Map.put(extra_measurements, :duration, end_time - start_time) :telemetry.execute( build_event_prefix(event, :stop), measurements, meta ) end @doc """ Executes a point-in-time telemetry event (no start/stop pairing). `event` is a list of atoms appended to `[:anthropic]`. """ @spec event(list(atom()) | atom(), map(), map()) :: :ok def event(event, measurements, meta) do :telemetry.execute(build_event_prefix(event), measurements, meta) end defp build_event_prefix(event, type \\ nil) defp build_event_prefix(event, nil) when is_list(event) do [:anthropic | event] end defp build_event_prefix(event, type) when is_list(event) do [:anthropic | event] ++ [type] end defp build_event_prefix(event, type) do build_event_prefix([event], type) end end