diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2013-07-23 14:53:15 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2013-07-23 14:53:15 +0100 |
commit | f59c88c67b8a546e5067a7f979c09f683097658b (patch) | |
tree | 10d92bdc12a9fd5e8ed16db81131747819d0dfe9 | |
parent | 8abd76b18ff391376fff2f6652a7f9711d7766d2 (diff) | |
download | rspamd-f59c88c67b8a546e5067a7f979c09f683097658b.tar.gz rspamd-f59c88c67b8a546e5067a7f979c09f683097658b.zip |
Add stat_reset command.
This command is designed to get statistics from rspamd and reset
it to a zero state.
-rw-r--r-- | src/controller.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/src/controller.c b/src/controller.c index b712895d2..2459d3a7d 100644 --- a/src/controller.c +++ b/src/controller.c @@ -69,6 +69,7 @@ enum command_type { COMMAND_QUIT, COMMAND_RELOAD, COMMAND_STAT, + COMMAND_STAT_RESET, COMMAND_SHUTDOWN, COMMAND_UPTIME, COMMAND_LEARN, @@ -112,6 +113,7 @@ static struct controller_command commands[] = { {"quit", FALSE, COMMAND_QUIT}, {"reload", TRUE, COMMAND_RELOAD}, {"stat", FALSE, COMMAND_STAT}, + {"stat_reset", TRUE, COMMAND_STAT_RESET}, {"shutdown", TRUE, COMMAND_SHUTDOWN}, {"uptime", FALSE, COMMAND_UPTIME}, {"learn", TRUE, COMMAND_LEARN}, @@ -473,7 +475,7 @@ process_counters_command (struct controller_session *session) } static gboolean -process_stat_command (struct controller_session *session) +process_stat_command (struct controller_session *session, gboolean do_reset) { gchar out_buf[BUFSIZ]; gint r, i; @@ -484,29 +486,34 @@ process_stat_command (struct controller_session *session) stat_file_t *statfile; struct statfile *st; GList *cur_cl, *cur_st; + struct rspamd_stat *stat; memory_pool_stat (&mem_st); - r = rspamd_snprintf (out_buf, sizeof (out_buf), "Messages scanned: %ud" CRLF, session->worker->srv->stat->messages_scanned); + stat = session->worker->srv->stat; + r = rspamd_snprintf (out_buf, sizeof (out_buf), "Messages scanned: %ud" CRLF, stat->messages_scanned); if (session->worker->srv->stat->messages_scanned > 0) { for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i ++) { r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Messages with action %s: %ud, %.2f%%" CRLF, - str_action_metric (i), session->worker->srv->stat->actions_stat[i], - (double)session->worker->srv->stat->actions_stat[i] / (double)session->worker->srv->stat->messages_scanned * 100.); + str_action_metric (i), stat->actions_stat[i], + (double)stat->actions_stat[i] / (double)stat->messages_scanned * 100.); if (i < METRIC_ACTION_GREYLIST) { - spam += session->worker->srv->stat->actions_stat[i]; + spam += stat->actions_stat[i]; } else { - ham += session->worker->srv->stat->actions_stat[i]; + ham += stat->actions_stat[i]; + } + if (do_reset) { + stat->actions_stat[i] = 0; } } r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Messages treated as spam: %ud, %.2f%%" CRLF, spam, - (double)spam / (double)session->worker->srv->stat->messages_scanned * 100.); + (double)spam / (double)stat->messages_scanned * 100.); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Messages treated as ham: %ud, %.2f%%" CRLF, ham, - (double)ham / (double)session->worker->srv->stat->messages_scanned * 100.); + (double)ham / (double)stat->messages_scanned * 100.); } - r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Messages learned: %ud" CRLF, session->worker->srv->stat->messages_learned); - r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Connections count: %ud" CRLF, session->worker->srv->stat->connections_count); - r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Control connections count: %ud" CRLF, session->worker->srv->stat->control_connections_count); + r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Messages learned: %ud" CRLF, stat->messages_learned); + r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Connections count: %ud" CRLF, stat->connections_count); + r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Control connections count: %ud" CRLF, stat->control_connections_count); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Pools allocated: %z" CRLF, mem_st.pools_allocated); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Pools freed: %z" CRLF, mem_st.pools_freed); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Bytes allocated: %z" CRLF, mem_st.bytes_allocated); @@ -514,8 +521,8 @@ process_stat_command (struct controller_session *session) r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Shared chunks allocated: %z" CRLF, mem_st.shared_chunks_allocated); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Chunks freed: %z" CRLF, mem_st.chunks_freed); r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Oversized chunks: %z" CRLF, mem_st.oversized_chunks); - r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Fuzzy hashes stored: %ud" CRLF, session->worker->srv->stat->fuzzy_hashes); - r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Fuzzy hashes expired: %ud" CRLF, session->worker->srv->stat->fuzzy_hashes_expired); + r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Fuzzy hashes stored: %ud" CRLF, stat->fuzzy_hashes); + r += rspamd_snprintf (out_buf + r, sizeof (out_buf) - r, "Fuzzy hashes expired: %ud" CRLF, stat->fuzzy_hashes_expired); /* Now write statistics for each statfile */ cur_cl = g_list_first (session->cfg->classifiers); while (cur_cl) { @@ -552,6 +559,13 @@ process_stat_command (struct controller_session *session) cur_cl = g_list_next (cur_cl); } + if (do_reset) { + stat->messages_scanned = 0; + stat->messages_learned = 0; + stat->connections_count = 0; + stat->control_connections_count = 0; + } + if (!session->restful) { return rspamd_dispatcher_write (session->dispatcher, out_buf, r, FALSE, FALSE); } @@ -745,7 +759,12 @@ process_command (struct controller_command *cmd, gchar **cmd_args, struct contro break; case COMMAND_STAT: if (check_auth (cmd, session)) { - return process_stat_command (session); + return process_stat_command (session, FALSE); + } + break; + case COMMAND_STAT_RESET: + if (check_auth (cmd, session)) { + return process_stat_command (session, TRUE); } break; case COMMAND_SHUTDOWN: |