%%% -*- erlang -*- %%% %%% This file is part of metrics released under the BSD license. %%% See the LICENSE for more information. %%% -module('metrics'). %% API exports -export([init/1]). -export([ new/3, delete/2, increment_counter/2, increment_counter/3, decrement_counter/2, decrement_counter/3, update_histogram/3, update_gauge/3, update_meter/3]). -record(metrics_ng, {mod}). -type metrics_engine() :: #metrics_ng{}. -type metric() :: counter | histogram | gauge | meter. -export_types([metrics_engine/0, metric/0]). %%==================================================================== %% API functions %%==================================================================== %% @doc set the module to use for metrics. %% Types are: counter, histograme, gauge, meter %% %% modules supported are: %% -spec init(Mod :: atom()) -> metrics_engine(). init(Mod) -> %% check the module _ = code:ensure_loaded(Mod), case erlang:function_exported(Mod, new, 2) of false -> error(badarg); true -> ok end, #metrics_ng{mod=Mod}. %% @doc create a new metric -spec new(metrics_engine(), metric(), any()) -> ok | {error, term()}. new(#metrics_ng{mod=Mod}, Type, Name) -> Mod:new(Type, Name). %% @doc delete a metric -spec delete(metrics_engine(), any()) -> ok. delete(#metrics_ng{mod=Mod}, Name) -> Mod:delete(Name). %% @doc increment a counter with 1 -spec increment_counter(metrics_engine(), any()) -> ok | {error, term()}. increment_counter(#metrics_ng{mod=Mod}, Name) -> Mod:increment_counter(Name). %% @doc increment a counter with Value -spec increment_counter(metrics_engine(), any(), pos_integer()) -> ok | {error, term()}. increment_counter(#metrics_ng{mod=Mod}, Name, Value) -> Mod:increment_counter(Name, Value). %% @doc decrement a counter with 1 -spec decrement_counter(metrics_engine(), any()) -> ok | {error, term()}. decrement_counter(#metrics_ng{mod=Mod}, Name) -> Mod:decrement_counter(Name). %% @doc decrement a counter with value -spec decrement_counter(metrics_engine(), any(), pos_integer()) -> ok | {error, term()}. decrement_counter(#metrics_ng{mod=Mod}, Name, Value) -> Mod:decrement_counter(Name, Value). %% @doc update an histogram with a value or the duration of a function. When %% passing a function the result will be returned once the metric have been %% updated with the duration. -spec update_histogram (metrics_engine(), any(), number()) -> ok | {error, term()}; (metrics_engine(), any(), function()) -> ok | {error, term()}. update_histogram(#metrics_ng{mod=Mod}, Name, ValueOrFun) -> Mod:update_histogram(Name, ValueOrFun). %% @doc update a gauge with a value -spec update_gauge(metrics_engine(), any(), number()) -> ok | {error, term()}. update_gauge(#metrics_ng{mod=Mod}, Name, Value) -> Mod:update_gauge(Name, Value). %% @doc update a meter with a valyue -spec update_meter(metrics_engine(), any(), number()) -> ok | {error, term()}. update_meter(#metrics_ng{mod=Mod}, Name, Value) -> Mod:update_meter(Name, Value).