75 lines
2.1 KiB
Erlang
75 lines
2.1 KiB
Erlang
%% -*- mode: erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*-
|
|
%% @doc Statistics API for the mnesia_rocksdb plugin
|
|
%%
|
|
%% Some counters are maintained for each active alias. Currently, the following
|
|
%% counters are supported:
|
|
%% * inner_retries
|
|
%% * outer_retries
|
|
%%
|
|
-module(mrdb_stats).
|
|
|
|
-export([new/0]).
|
|
|
|
-export([incr/3,
|
|
get/1,
|
|
get/2]).
|
|
|
|
-type alias() :: mnesia_rocksdb:alias().
|
|
-type db_ref() :: mrdb:db_ref().
|
|
-type counter() :: atom().
|
|
-type increment() :: integer().
|
|
|
|
-type counters() :: #{ counter() := integer() }.
|
|
|
|
new() ->
|
|
#{ ref => counters:new(map_size(ctr_meta()), [write_concurrency])
|
|
, meta => ctr_meta()}.
|
|
|
|
ctr_meta() ->
|
|
#{ inner_retries => 1
|
|
, outer_retries => 2 }.
|
|
|
|
-spec incr(alias() | db_ref(), counter(), increment()) -> ok.
|
|
%% @doc Increment `Ctr' counter for `Alias` with increment `N'.
|
|
%%
|
|
%% Note that the first argument may also be a `db_ref()' map,
|
|
%% corresponding to `mrdb:get_ref({admin, Alias})'.
|
|
%% @end
|
|
incr(Alias, Ctr, N) when is_atom(Alias) ->
|
|
#{stats := #{ref := Ref, meta := Meta}} = mrdb:get_ref({admin, Alias}),
|
|
incr_(Ref, Meta, Ctr, N);
|
|
incr(#{stats := #{ref := Ref, meta := Meta}}, Ctr, N) ->
|
|
incr_(Ref, Meta, Ctr, N).
|
|
|
|
-spec get(alias() | db_ref(), counter()) -> integer().
|
|
%% @doc Fetches the integer value of the known counter `Ctr' for `Alias'.
|
|
%% @end
|
|
get(Alias, Ctr) when is_atom(Alias) ->
|
|
#{stats := #{ref := Ref, meta := Meta}} = mrdb:get_ref({admin, Alias}),
|
|
get_(Ref, Meta, Ctr);
|
|
get(#{stats := #{ref := Ref, meta := Meta}}, Ctr) ->
|
|
get_(Ref, Meta, Ctr).
|
|
|
|
-spec get(alias() | db_ref()) -> counters().
|
|
%% @doc Fetches all known counters for `Alias', in the form of a map,
|
|
%% `#{Counter => Value}'.
|
|
%% @end
|
|
get(Alias) when is_atom(Alias) ->
|
|
get_(mrdb:get_ref({admin, Alias}));
|
|
get(Ref) when is_map(Ref) ->
|
|
get_(Ref).
|
|
|
|
get_(#{stats := #{ref := Ref, meta := Meta}}) ->
|
|
lists:foldl(
|
|
fun({K, P}, M) ->
|
|
M#{K := counters:get(Ref, P)}
|
|
end, Meta, maps:to_list(Meta)).
|
|
|
|
get_(Ref, Meta, Attr) ->
|
|
Ix = maps:get(Attr, Meta),
|
|
counters:get(Ref, Ix).
|
|
|
|
incr_(Ref, Meta, Attr, N) ->
|
|
Ix = maps:get(Attr, Meta),
|
|
counters:add(Ref, Ix, N).
|