defmodule Instruments.CustomFunctions do @moduledoc """ Creates custom prefixed functions Often, a module will have functions that all have a common prefix. It's somewhat tedious to have to put this prefix in every call to every metric function. Using this module can help somewhat. When you `use` this module, it defines custom, module-specific metrics functions that include your prefix. For example: ``` defmodule Prefixed do use Instruments.CustomFunctions, prefix: "my.module" def do_something() do increment("do_something_counts") do_another_thing() end def long_running() do measure("timed_fn", &compute/0) end defp compute(), do: Process.sleep(10_000) defp do_another_thing, do: 3 end ``` In the above example, we increment `do_something_counts` and `timed_fn`, yet the metrics emitted are `my.module.do_something_counts` and `my.module.timed_fn`. """ defmacro __using__(opts) do prefix = case Keyword.fetch!(opts, :prefix) do prefix_string when is_bitstring(prefix_string) -> prefix_string ast -> {computed_prefix, _} = Code.eval_quoted(ast) computed_prefix end prefix_with_dot = "#{prefix}." quote do use Instruments def increment(key, value \\ 1, options \\ []) do Instruments.increment([unquote(prefix_with_dot), key], value, options) end def decrement(key, value \\ 1, options \\ []) do Instruments.decrement([unquote(prefix_with_dot), key], value, options) end def gauge(key, value, options \\ []) do Instruments.gauge([unquote(prefix_with_dot), key], value, options) end def histogram(key, value, options \\ []) do Instruments.histogram([unquote(prefix_with_dot), key], value, options) end def timing(key, value, options \\ []) do Instruments.timing([unquote(prefix_with_dot), key], value, options) end def set(key, value, options \\ []) do Instruments.set([unquote(prefix_with_dot), key], value, options) end def measure(key, options \\ [], func) do Instruments.measure([unquote(prefix_with_dot), key], options, func) end end end end