defmodule QuackDB.Telemetry do @moduledoc false @default_prefix [:quackdb] @operations [:query, :append, :fetch] @spec default_prefix() :: [atom()] def default_prefix, do: @default_prefix @spec span([atom()], atom(), map(), (-> term())) :: term() def span(prefix, operation, metadata, fun) when operation in @operations and is_function(fun, 0) do :telemetry.span(event(prefix, operation), metadata, fun) end @spec event([atom()], atom()) :: [atom()] def event(prefix, operation) when operation in @operations do append_operation(prefix, operation) end defp append_operation([], operation), do: [operation] defp append_operation([head | tail], operation), do: [head | append_operation(tail, operation)] end