]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Add stat_reset command.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 23 Jul 2013 13:53:15 +0000 (14:53 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 23 Jul 2013 13:53:15 +0000 (14:53 +0100)
This command is designed to get statistics from rspamd and reset
it to a zero state.

src/controller.c

index b712895d2b45cfba24b2f881f4ccd5a43ff78405..2459d3a7d62ece480a76ee72e1b2ad777d6310bf 100644 (file)
@@ -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: