Current section
Files
Jump to
Current section
Files
src/exometer_cpu.erl
%% -------------------------------------------------------------------
%%
%% Copyright (c) 2014 Basho Technologies, Inc. All Rights Reserved.
%%
%% This Source Code Form is subject to the terms of the Mozilla Public
%% License, v. 2.0. If a copy of the MPL was not distributed with this
%% file, You can obtain one at http://mozilla.org/MPL/2.0/.
%%
%% -------------------------------------------------------------------
-module(exometer_cpu).
-behaviour(exometer_probe).
%% exometer_entry callbacks
%% exometer_probe callbacks
-export(
[
behaviour/0,
probe_init/3,
probe_terminate/1,
probe_get_value/2,
probe_get_datapoints/1,
probe_update/2,
probe_reset/1,
probe_sample/1,
probe_setopts/3,
probe_handle_msg/2,
probe_code_change/3
]).
-include("exometer.hrl").
-define(DATAPOINTS, [nprocs, avg1, avg5, avg15]).
-record(st, {
datapoints,
data,
ref
}).
-spec behaviour() -> exometer:behaviour().
behaviour() ->
probe.
probe_init(_, _, Opts) ->
DP = proplists:get_value(datapoints, Opts, ?DATAPOINTS),
{ok, #st{datapoints = DP}}.
probe_terminate(_) -> ok.
probe_get_value(DPs, #st{data = Data0,
datapoints = DPs0} = S) ->
Data1 = if Data0 == undefined -> sample(DPs0);
true -> Data0
end,
DPs1 = if DPs == default -> DPs0;
true -> DPs
end,
{ok, probe_get_value_(Data1, DPs1), S#st{data = Data1}}.
probe_get_value_(Data, DPs) ->
[D || {K,_} = D <- Data,
lists:member(K, DPs)].
probe_get_datapoints(#st{datapoints = DPs}) ->
{ok, DPs}.
probe_update(_, _) ->
{error, not_supported}.
probe_reset(S) ->
{ok, S#st{data = []}}.
probe_sample(#st{datapoints = DPs} = S) ->
{_Pid, Ref} = spawn_monitor(
fun() ->
exit({sample, sample(DPs)})
end),
{ok, S#st{ref = Ref}}.
probe_setopts(_Entry, Opts, S) ->
DPs = proplists:get_value(datapoints, Opts, S#st.datapoints),
{ok, S#st{datapoints = DPs}}.
probe_handle_msg({'DOWN', Ref, _, _, {sample,Data}}, #st{ref = Ref} = S) ->
{ok, S#st{ref = undefined, data = Data}};
probe_handle_msg(_, S) ->
{ok, S}.
probe_code_change(_, S, _) -> {ok, S}.
sample(DPs) ->
[{F, cpu_sup:F()} || F <- DPs, lists:member(F, ?DATAPOINTS)].