defmodule Instruments.StatsReporter do
  @moduledoc """
  A behavoiur for reporters.

  Reporters emit values back to the underlying reporting system.
  Out of the box, Instruments provides `Instruments.Statix`, `Instruments.StatsReporter.Logger`,
  and `Instruments.StatsReporter.Null`reporters.
  """

  @type key :: String.t()
  @type stats_return :: :ok | {:error, term}

  @doc """
  Connect to the reporter.
  This function is called by the system prior to using the reporter,
  any connections should be established in this function.
  """
  @callback connect() :: :ok

  @doc """
  Increment a key by the specified value
  """
  @callback increment(key, integer, keyword) :: stats_return

  @doc """
  Decrement a key by the specified value
  """
  @callback decrement(key, integer, keyword) :: stats_return

  @doc """
  Set the value of the key to the specified value
  """
  @callback gauge(key, integer, keyword) :: stats_return

  @doc """
  Include the value in the histogram defined by `key`
  """
  @callback histogram(key, integer, keyword) :: stats_return

  @doc """
  Include the timing in the `key`
  """
  @callback timing(key, integer, keyword) :: stats_return

  @doc """
  Measure the execution time of the provided function and
  include it in the metric defined by `key`
  """
  @callback measure(key, keyword, (() -> any)) :: any

  @doc """
  Write the value into the set defined by `key`
  """
  @callback set(key, integer, keyword) :: stats_return
end
