aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2023-01-14 12:43:46 +0000
committerVsevolod Stakhov <vsevolod@rspamd.com>2023-01-14 12:46:08 +0000
commit563d89d5b8e90b477da878aa8564c09d15f34e6f (patch)
tree1e00bf14519e21f896a5d727d4e03172bf097d2a
parent09f02278babef898de21f6940ae5d7d8b3b102f0 (diff)
downloadrspamd-563d89d5b8e90b477da878aa8564c09d15f34e6f.tar.gz
rspamd-563d89d5b8e90b477da878aa8564c09d15f34e6f.zip
[Minor] Add per-hour counters for fuzzy keys
-rw-r--r--src/fuzzy_storage.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c
index e51ec9eef..874e81c87 100644
--- a/src/fuzzy_storage.c
+++ b/src/fuzzy_storage.c
@@ -48,6 +48,8 @@
#define DEFAULT_MAX_BUCKETS 2000
#define DEFAULT_BUCKET_TTL 3600
#define DEFAULT_BUCKET_MASK 24
+/* Update stats on keys each 1 hour */
+#define KEY_STAT_INTERVAL 3600.0
static const gchar *local_db_name = "local";
@@ -86,6 +88,12 @@ struct fuzzy_key_stat {
guint64 added;
guint64 deleted;
guint64 errors;
+ /* Store averages for checked/matched per minute */
+ struct rspamd_counter_data checked_ctr;
+ struct rspamd_counter_data matched_ctr;
+ gdouble last_checked_time;
+ guint64 last_checked_count;
+ guint64 last_matched_count;
struct rspamd_cryptobox_keypair *keypair;
rspamd_lru_hash_t *last_ips;
ref_entry_t ref;
@@ -663,7 +671,9 @@ rspamd_fuzzy_update_stats (struct rspamd_fuzzy_storage_ctx *ctx,
gboolean is_delayed,
struct fuzzy_key_stat *key_stat,
struct fuzzy_key_stat *ip_stat,
- guint cmd, guint reply)
+ guint cmd,
+ guint reply,
+ ev_tstamp timestamp)
{
ctx->stat.fuzzy_hashes_checked[epoch] ++;
@@ -688,6 +698,22 @@ rspamd_fuzzy_update_stats (struct rspamd_fuzzy_storage_ctx *ctx,
if (matched) {
key_stat->matched ++;
}
+
+ if (G_UNLIKELY(key_stat->last_checked_time == 0.0)) {
+ key_stat->last_checked_time = timestamp;
+ key_stat->last_checked_count = key_stat->checked;
+ key_stat->last_matched_count = key_stat->matched;
+ }
+ else if (G_UNLIKELY(timestamp > key_stat->last_checked_time + KEY_STAT_INTERVAL)) {
+ guint64 nchecked = key_stat->checked - key_stat->last_checked_count;
+ guint64 nmatched = key_stat->matched - key_stat->last_matched_count;
+
+ rspamd_set_counter_ema (&key_stat->checked_ctr, nchecked, 0.5);
+ rspamd_set_counter_ema (&key_stat->checked_ctr, nmatched, 0.5);
+ key_stat->last_checked_time = timestamp;
+ key_stat->last_checked_count = key_stat->checked;
+ key_stat->last_matched_count = key_stat->matched;
+ }
}
else if (cmd == FUZZY_WRITE) {
key_stat->added++;
@@ -746,7 +772,8 @@ rspamd_fuzzy_make_reply (struct rspamd_fuzzy_cmd *cmd,
session->key ? session->key->stat : NULL,
session->ip_stat,
cmd->cmd,
- result->v1.value);
+ result->v1.value,
+ session->timestamp);
if (flags & RSPAMD_FUZZY_REPLY_DELAY) {
/* Hash is too fresh, need to delay it */