1 |
|
-module(mongoose_instrument_probe). |
2 |
|
|
3 |
|
-export([start_probe_timer/3, call/4]). |
4 |
|
|
5 |
|
-callback probe(mongoose_instrument:event_name(), |
6 |
|
mongoose_instrument:labels(), |
7 |
|
mongoose_instrument:config()) -> mongoose_instrument:measurements(). |
8 |
|
|
9 |
|
-ignore_xref([call/4]). |
10 |
|
|
11 |
|
-spec start_probe_timer(mongoose_instrument:event_name(), |
12 |
|
mongoose_instrument:labels(), |
13 |
|
mongoose_instrument:config()) -> timer:tref(). |
14 |
|
start_probe_timer(EventName, Labels, #{probe := #{module := Module} = ProbeConfig} = Config) -> |
15 |
58 |
Interval = timer:seconds(get_probe_interval(ProbeConfig)), |
16 |
|
%% TODO: when dropping support for OTP25, consider changing this to apply_repeatedly |
17 |
58 |
{ok, TRef} = timer:apply_interval(Interval, ?MODULE, call, |
18 |
|
[Module, EventName, Labels, Config]), |
19 |
58 |
TRef. |
20 |
|
|
21 |
|
call(ProbeMod, EventName, Labels, Config) -> |
22 |
160 |
case safely:apply_and_log(ProbeMod, probe, [EventName, Labels, Config], |
23 |
|
#{what => probe_failed, probe_mod => ProbeMod, |
24 |
|
event_name => EventName, labels => Labels, config => Config}) of |
25 |
|
{exception, _} -> |
26 |
:-( |
ok; % Already logged |
27 |
|
Measurements = #{} -> |
28 |
160 |
mongoose_instrument:execute(EventName, Labels, Measurements) |
29 |
|
end. |
30 |
|
|
31 |
|
-spec get_probe_interval(mongoose_instrument:probe_config()) -> pos_integer(). |
32 |
|
get_probe_interval(#{interval := Interval}) when is_integer(Interval), Interval > 0 -> |
33 |
:-( |
Interval; |
34 |
|
get_probe_interval(#{}) -> |
35 |
58 |
mongoose_config:get_opt([instrumentation, probe_interval]). |