From 1ca50dbb90699a2c47f8e706a5e4d765e8982213 Mon Sep 17 00:00:00 2001 From: Fabio Salvini Date: Wed, 25 Oct 2017 05:27:41 +0200 Subject: [PATCH] Limit number of emails sent per minute. --- apps/log_monitor/src/mailer.erl | 29 +++++++++++++++++++++++------ config/log_monitor.config | 5 ++++- config/sys.config | 2 +- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/log_monitor/src/mailer.erl b/apps/log_monitor/src/mailer.erl index 8e1aa75..272e46c 100644 --- a/apps/log_monitor/src/mailer.erl +++ b/apps/log_monitor/src/mailer.erl @@ -23,7 +23,7 @@ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). --record(state, {}). +-record(state, {max_emails_per_minute, remaining_emails}). %%%=================================================================== %%% API @@ -66,8 +66,15 @@ queue() -> %%-------------------------------------------------------------------- init([]) -> register(mailer, self()), + {ok, EmailConfig} = application:get_env(log_monitor, email_config), + MaxEmailsPerMinute = proplists:get_value(max_emails_per_minute, EmailConfig), timer:send_after(1000, {send_emails}), - {ok, #state{}}. + timer:send_interval(60000, {reset_count}), + {ok, #state{ + max_emails_per_minute = MaxEmailsPerMinute, + remaining_emails = MaxEmailsPerMinute + } + }. %%-------------------------------------------------------------------- %% @private @@ -123,7 +130,7 @@ handle_info({error, File, Text}, State) -> end), {noreply, State}; handle_info({send_emails}, State) -> - Emails = emails_to_send(), + Emails = lists:sublist(emails_to_send(), State#state.remaining_emails), try send_emails(Emails) of _ -> timer:send_after(1000, {send_emails}) catch @@ -131,7 +138,17 @@ handle_info({send_emails}, State) -> error_logger:info_msg("Waiting 60s before sending new emails~n"), timer:send_after(60000, {send_emails}) end, - {noreply, State}. + {noreply, #state{ + max_emails_per_minute = State#state.max_emails_per_minute, + remaining_emails = State#state.remaining_emails - length(Emails) + } + }; +handle_info({reset_count}, State) -> + {noreply, #state{ + max_emails_per_minute = State#state.max_emails_per_minute, + remaining_emails = State#state.max_emails_per_minute + } + }. %%-------------------------------------------------------------------- %% @private @@ -335,8 +352,8 @@ first_line(Text) -> %%%=================================================================== -ifdef(TEST). -start_test() -> - {ok, _Pid} = start_link(). +%% start_test() -> +%% {ok, _Pid} = start_link(). email_subject_test() -> ?assertEqual("Error", email_subject("Error", "/var/log/myApp.log", "Line")), diff --git a/config/log_monitor.config b/config/log_monitor.config index 6afc9b5..a1aea82 100644 --- a/config/log_monitor.config +++ b/config/log_monitor.config @@ -26,6 +26,9 @@ %% The receiver to use for the application errors. {admin_receiver, "salvini.fabio001@gmail.com"}, + %% Maximum number of emails per minute. + {max_emails_per_minute, 0}, + %% Subject of the email. %% Placeholders: %% %f: the full path of the log file (ex. /var/log/myapp.log). @@ -42,7 +45,7 @@ }, %% Location of the file that contains the logs to monitor. - {logfiles_config, "/home/fsalvini/gitRepos/log_monitor/config/logfiles.config"} + {logfiles_config, "/home/fsalvini/Projects/log_monitor/config/logfiles.config"} ] }, diff --git a/config/sys.config b/config/sys.config index 72f7e3e..391f5dc 100644 --- a/config/sys.config +++ b/config/sys.config @@ -1,4 +1,4 @@ [ { log_monitor, [] - }, "/home/fsalvini/gitRepos/log_monitor/config/log_monitor.config" + }, "/home/fsalvini/Projects/log_monitor/config/log_monitor.config" ].