Packages

libkstat interface for erlang

Current section

Files

Jump to
ekstat src ekstat.erl
Raw

src/ekstat.erl

-module(ekstat).
%% API
-export([open/0, update/1, clear/1, read/1, read/2, read/3, read/4, read/5, read/6]).
-on_load(init/0).
%% Types
-type kstat_handle() :: binary().
-type kstat_pattern() :: '_' | integer() | string().
-type kstat_error() :: {error, {kstat, string()}}.
-type kstat_statistic() :: {Statistic::string(), Value::integer()} | {Statistic::string(), Value::string()}.
-type kstat_row() :: {Class::string(), Module::string(), Instance::integer(), Name::string(), [kstat_statistic()]}.
-export_type([kstat_handle/0, kstat_pattern/0]).
%%%===================================================================
%%% API functions
%%%===================================================================
-spec open() -> {ok, Handle::kstat_handle()} | kstat_error().
open() ->
erlang:nif_error(undefined).
-spec update(Handle::binary()) -> {ok, NumInstances::integer()} | kstat_error().
update(_Handle) ->
erlang:nif_error(undefined).
-spec clear(Handle::binary()) -> {ok, NumInstances::integer()} | kstat_error().
clear(_Handle) ->
erlang:nif_error(undefined).
-spec read(Handle::binary()) -> [kstat_row()] | kstat_error().
read(_Handle) ->
erlang:nif_error(undefined).
-spec read(Handle::binary(), Class::kstat_pattern()) -> [kstat_row()] | kstat_error().
read(_Handle, _Class) ->
erlang:nif_error(undefined).
-spec read(Handle::binary(), Class::kstat_pattern(), Module::kstat_pattern()) -> [kstat_row()] | kstat_error().
read(_Handle, _Class, _Module) ->
erlang:nif_error(undefined).
-spec read(Handle::binary(), Class::kstat_pattern(), Module::kstat_pattern(), Instance::kstat_pattern()) -> [kstat_row()] | kstat_error().
read(_Handle, _Class, _Module, _Instance) ->
erlang:nif_error(undefined).
-spec read(Handle::binary(), Class::kstat_pattern(), Module::kstat_pattern(), Instance::kstat_pattern(), Name::kstat_pattern()) -> [kstat_row()] | kstat_error().
read(_Handle, _Class, _Module, _Instance, _Name) ->
erlang:nif_error(undefined).
-spec read(Handle::binary(), Class::kstat_pattern(), Module::kstat_pattern(), Instance::kstat_pattern(), Name::kstat_pattern(), Statistic::kstat_pattern()) -> [kstat_row()] | kstat_error().
read(_Handle, _Class, _Module, _Instance, _Name, _Statistic) ->
erlang:nif_error(undefined).
%%%-------------------------------------------------------------------
%%% Internal functions
%%%-------------------------------------------------------------------
%% @private
-spec init() -> ok | {error, {Reason::load_failed | bad_lib | load | reload | upgrade | old_code, Text::string()}}.
init() ->
PrivDir = case code:priv_dir(?MODULE) of
{error, _} ->
EbinDir = filename:dirname(code:which(?MODULE)),
AppPath = filename:dirname(EbinDir),
filename:join(AppPath, "priv");
Path ->
Path
end,
erlang:load_nif(filename:join(PrivDir, "ekstat_drv"), 0).
%% Tests.
-ifdef(TEST).
sanity_test() ->
{ok, Handle} = ekstat:open(),
[] = ekstat:read(Handle),
{ok, Number} = ekstat:update(Handle),
Number = length(ekstat:read(Handle)),
{ok, Number} = ekstat:clear(Handle),
{ok, 0} = ekstat:clear(Handle),
ok.
-endif.