Skip to main content

lib/quack_db/telemetry.ex

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