Current section

Files

Jump to
temporal_sdk src telemetry temporal_sdk_telemetry_poller.erl
Raw

src/telemetry/temporal_sdk_telemetry_poller.erl

-module(temporal_sdk_telemetry_poller).
-behaviour(gen_server).
% elp:ignore W0012 W0040
-moduledoc false.
-export([
start_link/4
]).
-export([
init/1,
handle_call/3,
handle_cast/2,
handle_info/2
]).
-callback poll(Metadata :: telemetry:event_metadata(), Timeout :: integer()) -> ok.
-record(state, {
interval :: pos_integer(),
poller_mod :: module(),
metadata :: telemetry:event_metadata(),
timeout :: pos_integer()
}).
-spec start_link(
PollerId :: atom() | string(),
Interval :: pos_integer(),
PollerMod :: module(),
Metadata :: telemetry:event_metadata()
) ->
gen_server:start_ret().
start_link(PollerId, Interval, PollerMod, Metadata) when is_atom(PollerId) ->
gen_server:start_link(
{local, temporal_sdk_utils_path:atom_path([?MODULE, PollerId])},
?MODULE,
[PollerId, Interval, PollerMod, Metadata],
[]
);
start_link(PollerId, Interval, PollerMod, Metadata) ->
gen_server:start_link(
?MODULE,
[PollerId, Interval, PollerMod, Metadata],
[]
).
init([PollerId, Interval, PollerMod, Metadata]) when is_atom(PollerId) ->
init(Interval, PollerMod, Metadata);
init([PollerId, Interval, PollerMod, Metadata]) ->
ProcLabel = temporal_sdk_utils_path:string_path([?MODULE, PollerId]),
proc_lib:set_label(ProcLabel),
init(Interval, PollerMod, Metadata).
init(Interval, PollerMod, Metadata) ->
{ok,
#state{
interval = Interval,
poller_mod = PollerMod,
metadata = Metadata,
timeout = round(0.8 * Interval)
},
jitter(Interval)}.
handle_info(timeout, State) ->
#state{interval = Interval, poller_mod = PollerMod, metadata = Metadata, timeout = Timeout} =
State,
PollerMod:poll(Metadata, Timeout),
{noreply, State, jitter(Interval)};
handle_info(_Info, State) ->
{stop, invalid_request, State}.
handle_call(_Request, _From, State) ->
{stop, invalid_request, State}.
handle_cast(_Request, State) ->
{stop, invalid_request, State}.
jitter(Interval) -> Interval + rand:uniform(10).