瀏覽代碼

Merge pull request #499 from lukebakken/lrb-496_dont_count_filtered_logs_in_hwm

Fix for incorrectly counting dropped messages
pull/501/head
Mark Allen 6 年之前
committed by GitHub
父節點
當前提交
b89d362f24
沒有發現已知的金鑰在資料庫的簽署中 GPG Key ID: 4AEE18F83AFDEB23
共有 3 個文件被更改,包括 188 次插入23 次删除
  1. +162
    -21
      src/error_logger_lager_h.erl
  2. +1
    -0
      src/lager_handler_watcher.erl
  3. +25
    -2
      test/lager_test_backend.erl

+ 162
- 21
src/error_logger_lager_h.erl 查看文件

@ -45,16 +45,16 @@
case ?SHOULD_LOG(Sink, Level) of case ?SHOULD_LOG(Sink, Level) of
true -> true ->
_ =lager:log(Sink, Level, Pid, Msg, []), _ =lager:log(Sink, Level, Pid, Msg, []),
ok;
_ -> ok
logged;
_ -> no_log
end). end).
-define(LOGFMT(Sink, Level, Pid, Fmt, Args), -define(LOGFMT(Sink, Level, Pid, Fmt, Args),
case ?SHOULD_LOG(Sink, Level) of case ?SHOULD_LOG(Sink, Level) of
true -> true ->
_ = lager:log(Sink, Level, Pid, Fmt, Args), _ = lager:log(Sink, Level, Pid, Fmt, Args),
ok;
_ -> ok
logged;
_ -> no_log
end). end).
-ifdef(TEST). -ifdef(TEST).
@ -179,7 +179,7 @@ eval_gl(Event, State) ->
log_event(Event, State). log_event(Event, State).
log_event(Event, #state{sink=Sink} = State) -> log_event(Event, #state{sink=Sink} = State) ->
case Event of
DidLog = case Event of
{error, _GL, {Pid, Fmt, Args}} -> {error, _GL, {Pid, Fmt, Args}} ->
FormatRaw = State#state.raw, FormatRaw = State#state.raw,
case {FormatRaw, Fmt} of case {FormatRaw, Fmt} of
@ -314,9 +314,9 @@ log_event(Event, #state{sink=Sink} = State) ->
Details = lists:sort(D), Details = lists:sort(D),
case Details of case Details of
[{application, App}, {exited, Reason}, {type, _Type}] -> [{application, App}, {exited, Reason}, {type, _Type}] ->
case application:get_env(lager, suppress_application_start_stop) of
{ok, true} when Reason == stopped ->
ok;
case application:get_env(lager, suppress_application_start_stop, false) of
true when Reason == stopped ->
no_log;
_ -> _ ->
{Md, Formatted} = format_reason_md(Reason), {Md, Formatted} = format_reason_md(Reason),
?LOGFMT(Sink, info, [{pid, Pid} | Md], "Application ~w exited with reason: ~s", ?LOGFMT(Sink, info, [{pid, Pid} | Md], "Application ~w exited with reason: ~s",
@ -331,9 +331,9 @@ log_event(Event, #state{sink=Sink} = State) ->
Details = lists:sort(D), Details = lists:sort(D),
case Details of case Details of
[{application, App}, {started_at, Node}] -> [{application, App}, {started_at, Node}] ->
case application:get_env(lager, suppress_application_start_stop) of
{ok, true} ->
ok;
case application:get_env(lager, suppress_application_start_stop, false) of
true ->
no_log;
_ -> _ ->
?LOGFMT(Sink, info, P, "Application ~w started on node ~w", ?LOGFMT(Sink, info, P, "Application ~w started on node ~w",
[App, Node]) [App, Node])
@ -341,7 +341,7 @@ log_event(Event, #state{sink=Sink} = State) ->
[{started, Started}, {supervisor, Name}] -> [{started, Started}, {supervisor, Name}] ->
case application:get_env(lager, suppress_supervisor_start_stop, false) of case application:get_env(lager, suppress_supervisor_start_stop, false) of
true -> true ->
ok;
no_log;
_ -> _ ->
MFA = format_mfa(get_value(mfargs, Started)), MFA = format_mfa(get_value(mfargs, Started)),
Pid = get_value(pid, Started), Pid = get_value(pid, Started),
@ -354,7 +354,20 @@ log_event(Event, #state{sink=Sink} = State) ->
_ -> _ ->
?LOGFMT(Sink, warning, self(), "Unexpected error_logger event ~w", [Event]) ?LOGFMT(Sink, warning, self(), "Unexpected error_logger event ~w", [Event])
end, end,
{ok, State}.
case DidLog of
logged ->
{ok, State};
no_log ->
Shaper = State#state.shaper,
{ok, State#state{
shaper = Shaper#lager_shaper{
mps = Shaper#lager_shaper.mps - 1
}
}};
Invalid ->
?LOGFMT(Sink, error, self(), "Unexpeted log result: ~p", [Invalid]),
{ok, State}
end.
format_crash_report(Report, Neighbours) -> format_crash_report(Report, Neighbours) ->
Name = case get_value(registered_name, Report, []) of Name = case get_value(registered_name, Report, []) of
@ -627,16 +640,107 @@ no_silent_hwm_drops_test_() ->
try try
{_, _, MS} = os:timestamp(), {_, _, MS} = os:timestamp(),
timer:sleep((1000000 - MS) div 1000 + 1), timer:sleep((1000000 - MS) div 1000 + 1),
%start close to the beginning of a new second
% start close to the beginning of a new second
[error_logger:error_msg("Foo ~p~n", [K]) || K <- lists:seq(1, 15)], [error_logger:error_msg("Foo ~p~n", [K]) || K <- lists:seq(1, 15)],
timer:sleep(1000),
lager_handler_watcher:pop_until("lager_error_logger_h dropped 10 messages in the last second that exceeded the limit of 5 messages/sec",
fun lists:flatten/1),
%and once again
wait_for_message("lager_error_logger_h dropped 10 messages in the last second that exceeded the limit of 5 messages/sec", 100, 50),
% and once again
[error_logger:error_msg("Foo1 ~p~n", [K]) || K <- lists:seq(1, 20)], [error_logger:error_msg("Foo1 ~p~n", [K]) || K <- lists:seq(1, 20)],
timer:sleep(1000),
lager_handler_watcher:pop_until("lager_error_logger_h dropped 15 messages in the last second that exceeded the limit of 5 messages/sec",
fun lists:flatten/1)
wait_for_message("lager_error_logger_h dropped 15 messages in the last second that exceeded the limit of 5 messages/sec", 100, 50)
after
application:stop(lager),
application:stop(goldrush),
error_logger:tty(true)
end
end
]
}.
shaper_does_not_forward_sup_progress_messages_to_info_level_backend_test_() ->
{timeout, 10000,
[fun() ->
error_logger:tty(false),
application:load(lager),
application:set_env(lager, handlers, [{lager_test_backend, info}]),
application:set_env(lager, error_logger_redirect, true),
application:set_env(lager, error_logger_hwm, 5),
application:set_env(lager, suppress_supervisor_start_stop, false),
application:set_env(lager, suppress_application_start_stop, false),
application:unset_env(lager, crash_log),
lager:start(),
try
PidPlaceholder = self(),
SupervisorMsg =
[{supervisor, {PidPlaceholder,rabbit_connection_sup}},
{started,
[{pid, PidPlaceholder},
{name,helper_sup},
{mfargs,
{rabbit_connection_helper_sup,start_link,[]}},
{restart_type,intrinsic},
{shutdown,infinity},
{child_type,supervisor}]}],
ApplicationExit =
[{application, error_logger_lager_h_test},
{exited, stopped},
{type, permanent}],
error_logger:info_report("This is not a progress message"),
error_logger:info_report(ApplicationExit),
[error_logger:info_report(progress, SupervisorMsg) || _K <- lists:seq(0, 100)],
error_logger:info_report("This is not a progress message 2"),
% Note: this gets logged in slow environments:
% Application lager started on node nonode@nohost
wait_for_count(fun lager_test_backend:count/0, [3, 4], 100, 50),
% Note: this debug msg gets ignored in slow environments:
% Lager installed handler lager_test_backend into lager_event
wait_for_count(fun lager_test_backend:count_ignored/0, [0, 1], 100, 50)
after
application:stop(lager),
application:stop(goldrush),
error_logger:tty(true)
end
end
]
}.
supressed_messages_are_not_counted_for_hwm_test_() ->
{timeout, 10000,
[fun() ->
error_logger:tty(false),
application:load(lager),
application:set_env(lager, handlers, [{lager_test_backend, debug}]),
application:set_env(lager, error_logger_redirect, true),
application:set_env(lager, error_logger_hwm, 5),
application:set_env(lager, suppress_supervisor_start_stop, true),
application:set_env(lager, suppress_application_start_stop, true),
application:unset_env(lager, crash_log),
lager:start(),
try
PidPlaceholder = self(),
SupervisorMsg =
[{supervisor, {PidPlaceholder,rabbit_connection_sup}},
{started,
[{pid, PidPlaceholder},
{name,helper_sup},
{mfargs,
{rabbit_connection_helper_sup,start_link,[]}},
{restart_type,intrinsic},
{shutdown,infinity},
{child_type,supervisor}]}],
ApplicationExit =
[{application, error_logger_lager_h_test},
{exited, stopped},
{type, permanent}],
lager_test_backend:flush(),
error_logger:info_report("This is not a progress message"),
[error_logger:info_report(ApplicationExit) || _K <- lists:seq(0, 100)],
[error_logger:info_report(progress, SupervisorMsg) || _K <- lists:seq(0, 100)],
error_logger:info_report("This is not a progress message 2"),
wait_for_count(fun lager_test_backend:count/0, 2, 100, 50),
wait_for_count(fun lager_test_backend:count_ignored/0, 0, 100, 50)
after after
application:stop(lager), application:stop(lager),
application:stop(goldrush), application:stop(goldrush),
@ -646,4 +750,41 @@ no_silent_hwm_drops_test_() ->
] ]
}. }.
wait_for_message(Expected, Tries, Sleep) ->
maybe_find_expected_message(lager_test_backend:get_buffer(), Expected, Tries, Sleep).
maybe_find_expected_message(_Buffer, Expected, 0, _Sleep) ->
throw({not_found, Expected});
maybe_find_expected_message([], Expected, Tries, Sleep) ->
timer:sleep(Sleep),
maybe_find_expected_message(lager_test_backend:get_buffer(), Expected, Tries - 1, Sleep);
maybe_find_expected_message([{_Severity, _Date, Msg, _Metadata}|T], Expected, Tries, Sleep) ->
case lists:flatten(Msg) of
Expected ->
ok;
_ ->
maybe_find_expected_message(T, Expected, Tries, Sleep)
end.
wait_for_count(Fun, _Expected, 0, _Sleep) ->
Actual = Fun(),
Msg = io_lib:format("wait_for_count: fun ~p final value: ~p~n", [Fun, Actual]),
throw({failed, Msg});
wait_for_count(Fun, Expected, Tries, Sleep) when is_list(Expected) ->
Actual = Fun(),
case lists:member(Actual, Expected) of
true ->
ok;
false ->
timer:sleep(Sleep),
wait_for_count(Fun, Expected, Tries - 1, Sleep)
end;
wait_for_count(Fun, Expected, Tries, Sleep) ->
case Fun() of
Expected ->
ok;
_ ->
timer:sleep(Sleep),
wait_for_count(Fun, Expected, Tries - 1, Sleep)
end.
-endif. -endif.

+ 1
- 0
src/lager_handler_watcher.erl 查看文件

@ -27,6 +27,7 @@
-ifdef(TEST). -ifdef(TEST).
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-export([pop_until/2]).
-endif. -endif.
%% callbacks %% callbacks

+ 25
- 2
test/lager_test_backend.erl 查看文件

@ -50,7 +50,9 @@
flush/0, flush/0,
message_stuffer/3, message_stuffer/3,
pop/0, pop/0,
print_state/0
pop_ignored/0,
print_state/0,
get_buffer/0
]). ]).
-endif. -endif.
@ -70,6 +72,15 @@ handle_call(pop, #state{buffer=Buffer} = State) ->
[H|T] -> [H|T] ->
{ok, H, State#state{buffer=T}} {ok, H, State#state{buffer=T}}
end; end;
handle_call(pop_ignored, #state{ignored=Ignored} = State) ->
case Ignored of
[] ->
{ok, undefined, State};
[H|T] ->
{ok, H, State#state{ignored=T}}
end;
handle_call(get_buffer, #state{buffer=Buffer} = State) ->
{ok, Buffer, State};
handle_call(get_loglevel, #state{level=Level} = State) -> handle_call(get_loglevel, #state{level=Level} = State) ->
{ok, Level, State}; {ok, Level, State};
handle_call({set_loglevel, Level}, State) -> handle_call({set_loglevel, Level}, State) ->
@ -94,7 +105,7 @@ handle_event({log, Msg},
lager_msg:datetime(Msg), lager_msg:datetime(Msg),
lager_msg:message(Msg), lager_msg:metadata(Msg)}]}}; lager_msg:message(Msg), lager_msg:metadata(Msg)}]}};
_ -> _ ->
{ok, State#state{ignored=Ignored ++ [ignored]}}
{ok, State#state{ignored=Ignored ++ [Msg]}}
end; end;
handle_event(_Event, State) -> handle_event(_Event, State) ->
{ok, State}. {ok, State}.
@ -113,6 +124,12 @@ code_change(_OldVsn, State, _Extra) ->
pop() -> pop() ->
pop(lager_event). pop(lager_event).
pop_ignored() ->
pop_ignored(lager_event).
get_buffer() ->
get_buffer(lager_event).
count() -> count() ->
count(lager_event). count(lager_event).
@ -131,6 +148,12 @@ print_bad_state() ->
pop(Sink) -> pop(Sink) ->
gen_event:call(Sink, ?MODULE, pop). gen_event:call(Sink, ?MODULE, pop).
pop_ignored(Sink) ->
gen_event:call(Sink, ?MODULE, pop_ignored).
get_buffer(Sink) ->
gen_event:call(Sink, ?MODULE, get_buffer).
count(Sink) -> count(Sink) ->
gen_event:call(Sink, ?MODULE, count). gen_event:call(Sink, ?MODULE, count).

Loading…
取消
儲存