|
|
@ -8,7 +8,7 @@ |
|
|
|
, levelToNum/1 |
|
|
|
, levelToChr/1 |
|
|
|
, numToLevel/1 |
|
|
|
, config_to_mask/1 |
|
|
|
, configToMask/1 |
|
|
|
, atomCfgToLevels/1 |
|
|
|
, maskToLevels/1 |
|
|
|
, nowMs/0 |
|
|
@ -20,7 +20,7 @@ |
|
|
|
, calcNextRotateDt/2 |
|
|
|
, validate_trace/1 |
|
|
|
, check_traces/4 |
|
|
|
, is_loggable/3 |
|
|
|
, isLoggAble/3 |
|
|
|
, trace_filter/1 |
|
|
|
, trace_filter/2 |
|
|
|
, parsePath/1 |
|
|
@ -81,8 +81,8 @@ levelToChr(alert) -> $A; |
|
|
|
levelToChr(emergency) -> $M; |
|
|
|
levelToChr(none) -> $ . |
|
|
|
|
|
|
|
-spec config_to_mask(atom()|string()) -> {'mask', integer()}. |
|
|
|
config_to_mask(Conf) -> |
|
|
|
-spec configToMask(atom()|string()) -> integer(). |
|
|
|
configToMask(Conf) -> |
|
|
|
Levels = atomCfgToLevels(Conf), |
|
|
|
levelsToMask(Levels, 0). |
|
|
|
|
|
|
@ -385,7 +385,7 @@ validate_trace({Filter, Level, {Destination, ID}}) when is_tuple(Filter); is_lis |
|
|
|
end; |
|
|
|
validate_trace({Filter, Level, Destination}) when is_tuple(Filter); is_list(Filter), is_atom(Level), is_atom(Destination) -> |
|
|
|
ValidFilter = validate_trace_filter(Filter), |
|
|
|
try config_to_mask(Level) of |
|
|
|
try configToMask(Level) of |
|
|
|
_ when not ValidFilter -> |
|
|
|
{error, invalid_trace}; |
|
|
|
L when is_list(Filter) -> |
|
|
@ -454,7 +454,7 @@ trace_acc([{Key, '<', Val} | T], Acc) -> |
|
|
|
|
|
|
|
check_traces(_, _, [], Acc) -> |
|
|
|
lists:flatten(Acc); |
|
|
|
check_traces(Attrs, Level, [{_, {mask, FilterLevel}, _} | Flows], Acc) when (Level band FilterLevel) == 0 -> |
|
|
|
check_traces(Attrs, Level, [{_, FilterLevel, _} | Flows], Acc) when (Level band FilterLevel) == 0 -> |
|
|
|
check_traces(Attrs, Level, Flows, Acc); |
|
|
|
check_traces(Attrs, Level, [{Filter, _, _} | Flows], Acc) when length(Attrs) < length(Filter) -> |
|
|
|
check_traces(Attrs, Level, Flows, Acc); |
|
|
@ -475,18 +475,9 @@ check_trace(Attrs, {Filter, _Level, Dest}) when is_tuple(Filter) -> |
|
|
|
[] |
|
|
|
end. |
|
|
|
|
|
|
|
-spec is_loggable(rumMsg:rumMsg(), non_neg_integer()|{'mask', non_neg_integer()}, term()) -> boolean(). |
|
|
|
is_loggable(Msg, {mask, Mask}, MyName) -> |
|
|
|
%% using syslog style comparison flags |
|
|
|
%S = lager_msg:severity_as_int(Msg), |
|
|
|
%?debugFmt("comparing masks ~.2B and ~.2B -> ~p~n", [S, Mask, S band Mask]), |
|
|
|
(rumMsg:severity_as_int(Msg) band Mask) /= 0 orelse |
|
|
|
lists:member(MyName, rumMsg:destinations(Msg)); |
|
|
|
is_loggable(Msg, SeverityThreshold, MyName) when is_atom(SeverityThreshold) -> |
|
|
|
is_loggable(Msg, levelToNum(SeverityThreshold), MyName); |
|
|
|
is_loggable(Msg, SeverityThreshold, MyName) when is_integer(SeverityThreshold) -> |
|
|
|
rumMsg:severity_as_int(Msg) =< SeverityThreshold orelse |
|
|
|
lists:member(MyName, rumMsg:destinations(Msg)). |
|
|
|
-spec isLoggAble(rumMsg:rumMsg(), non_neg_integer(), term()) -> boolean(). |
|
|
|
isLoggAble(Msg, Mask, MyName) -> |
|
|
|
(rumMsg:severity_as_int(Msg) band Mask) /= 0 orelse lists:member(MyName, rumMsg:destinations(Msg)). |
|
|
|
|
|
|
|
parsePath(RelPath) -> |
|
|
|
NewRelPath = |
|
|
@ -559,7 +550,7 @@ check_hwm(Shaper = #rumShaper{lastTime = Last, dropped = Drop}) -> |
|
|
|
end, |
|
|
|
Timer = case erlang:read_timer(Shaper#rumShaper.timer) of |
|
|
|
false -> |
|
|
|
erlang:send_after(trunc((1000000 - N) / 1000), self(), {shaper_expired, Shaper#rumShaper.id}); |
|
|
|
erlang:send_after(trunc((1000000 - N) / 1000), self(), {mShaperExpired, Shaper#rumShaper.id}); |
|
|
|
_ -> |
|
|
|
Shaper#rumShaper.timer |
|
|
|
end, |
|
|
@ -735,42 +726,42 @@ check_trace_test() -> |
|
|
|
trace_filter(none), |
|
|
|
%% match by module |
|
|
|
?assertEqual([foo], check_traces([{module, ?MODULE}], ?EMERGENCY, [ |
|
|
|
{[{module, ?MODULE}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, test}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, ?MODULE}], configToMask(emergency), foo}, |
|
|
|
{[{module, test}], configToMask(emergency), bar}], [])), |
|
|
|
%% match by module, but other unsatisfyable attribute |
|
|
|
?assertEqual([], check_traces([{module, ?MODULE}], ?EMERGENCY, [ |
|
|
|
{[{module, ?MODULE}, {foo, bar}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, test}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, ?MODULE}, {foo, bar}], configToMask(emergency), foo}, |
|
|
|
{[{module, test}], configToMask(emergency), bar}], [])), |
|
|
|
%% match by wildcard module |
|
|
|
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ |
|
|
|
{[{module, ?MODULE}, {foo, bar}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, ?MODULE}, {foo, bar}], configToMask(emergency), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
%% wildcard module, one trace with unsatisfyable attribute |
|
|
|
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ |
|
|
|
{[{module, '*'}, {foo, bar}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, '*'}, {foo, bar}], configToMask(emergency), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
%% wildcard but not present custom trace attribute |
|
|
|
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ |
|
|
|
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
%% wildcarding a custom attribute works when it is present |
|
|
|
?assertEqual([bar, foo], check_traces([{module, ?MODULE}, {foo, bar}], ?EMERGENCY, [ |
|
|
|
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
%% denied by level |
|
|
|
?assertEqual([], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [ |
|
|
|
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
%% allowed by level |
|
|
|
?assertEqual([foo], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [ |
|
|
|
{[{module, '*'}, {foo, '*'}], config_to_mask(debug), foo}, |
|
|
|
{[{module, '*'}], config_to_mask(emergency), bar}], [])), |
|
|
|
{[{module, '*'}, {foo, '*'}], configToMask(debug), foo}, |
|
|
|
{[{module, '*'}], configToMask(emergency), bar}], [])), |
|
|
|
?assertEqual([anythingbutnotice, infoandbelow, infoonly], check_traces([{module, ?MODULE}], ?INFO, [ |
|
|
|
{[{module, '*'}], config_to_mask('=debug'), debugonly}, |
|
|
|
{[{module, '*'}], config_to_mask('=info'), infoonly}, |
|
|
|
{[{module, '*'}], config_to_mask('<=info'), infoandbelow}, |
|
|
|
{[{module, '*'}], config_to_mask('!=info'), anythingbutinfo}, |
|
|
|
{[{module, '*'}], config_to_mask('!=notice'), anythingbutnotice} |
|
|
|
{[{module, '*'}], configToMask('=debug'), debugonly}, |
|
|
|
{[{module, '*'}], configToMask('=info'), infoonly}, |
|
|
|
{[{module, '*'}], configToMask('<=info'), infoandbelow}, |
|
|
|
{[{module, '*'}], configToMask('!=info'), anythingbutinfo}, |
|
|
|
{[{module, '*'}], configToMask('!=notice'), anythingbutnotice} |
|
|
|
], [])), |
|
|
|
application:stop(lager), |
|
|
|
application:stop(goldrush), |
|
|
@ -778,11 +769,11 @@ check_trace_test() -> |
|
|
|
|
|
|
|
is_loggable_test_() -> |
|
|
|
[ |
|
|
|
{"Loggable by severity only", ?_assert(is_loggable(rumMsg:new("", alert, [], []), 2, me))}, |
|
|
|
{"Not loggable by severity only", ?_assertNot(is_loggable(rumMsg:new("", critical, [], []), 1, me))}, |
|
|
|
{"Loggable by severity with destination", ?_assert(is_loggable(rumMsg:new("", alert, [], [you]), 2, me))}, |
|
|
|
{"Not loggable by severity with destination", ?_assertNot(is_loggable(rumMsg:new("", critical, [], [you]), 1, me))}, |
|
|
|
{"Loggable by destination overriding severity", ?_assert(is_loggable(rumMsg:new("", critical, [], [me]), 1, me))} |
|
|
|
{"Loggable by severity only", ?_assert(isLoggAble(rumMsg:new("", alert, [], []), 2, me))}, |
|
|
|
{"Not loggable by severity only", ?_assertNot(isLoggAble(rumMsg:new("", critical, [], []), 1, me))}, |
|
|
|
{"Loggable by severity with destination", ?_assert(isLoggAble(rumMsg:new("", alert, [], [you]), 2, me))}, |
|
|
|
{"Not loggable by severity with destination", ?_assertNot(isLoggAble(rumMsg:new("", critical, [], [you]), 1, me))}, |
|
|
|
{"Loggable by destination overriding severity", ?_assert(isLoggAble(rumMsg:new("", critical, [], [me]), 1, me))} |
|
|
|
]. |
|
|
|
|
|
|
|
format_time_test_() -> |
|
|
@ -816,7 +807,7 @@ format_time_test_() -> |
|
|
|
|
|
|
|
config_to_levels_test() -> |
|
|
|
?assertEqual([none], atomCfgToLevels('none')), |
|
|
|
?assertEqual({mask, 0}, config_to_mask('none')), |
|
|
|
?assertEqual(0, configToMask('none')), |
|
|
|
?assertEqual([debug], atomCfgToLevels('=debug')), |
|
|
|
?assertEqual([debug], atomCfgToLevels('<info')), |
|
|
|
?assertEqual(levels() -- [debug], atomCfgToLevels('!=debug')), |
|
|
@ -837,10 +828,10 @@ config_to_levels_test() -> |
|
|
|
ok. |
|
|
|
|
|
|
|
config_to_mask_test() -> |
|
|
|
?assertEqual({mask, 0}, config_to_mask('none')), |
|
|
|
?assertEqual({mask, ?DEBUG bor ?INFO bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('debug')), |
|
|
|
?assertEqual({mask, ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('warning')), |
|
|
|
?assertEqual({mask, ?DEBUG bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('!=info')), |
|
|
|
?assertEqual(0, configToMask('none')), |
|
|
|
?assertEqual(?DEBUG bor ?INFO bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('debug')), |
|
|
|
?assertEqual(?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('warning')), |
|
|
|
?assertEqual(?DEBUG bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('!=info')), |
|
|
|
ok. |
|
|
|
|
|
|
|
mask_to_levels_test() -> |
|
|
|