summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2024-06-21 14:43:14 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2024-06-21 14:43:14 +0100
commit2d5d3c2a0dc6bb2600cce2ebcd73c95cb21a58db (patch)
tree6a252cfd13f51422cfa8a92cd9b7cca8a9243eca /src/libserver
parent90b73439d20d6e5b9b9e61cecbaa9809d7d0ddcd (diff)
downloadrspamd-2d5d3c2a0dc6bb2600cce2ebcd73c95cb21a58db.tar.gz
rspamd-2d5d3c2a0dc6bb2600cce2ebcd73c95cb21a58db.zip
[Rework] Allow metrics endpoint to be enabled for each scanner
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/worker_util.c68
-rw-r--r--src/libserver/worker_util.h11
2 files changed, 76 insertions, 3 deletions
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c
index 02b0cd5ae..3e8133a16 100644
--- a/src/libserver/worker_util.c
+++ b/src/libserver/worker_util.c
@@ -2354,3 +2354,71 @@ rspamd_worker_check_and_adjust_timeout(struct rspamd_config *cfg, double timeout
/* TODO: maybe adjust timeout */
return timeout;
}
+
+ucl_object_t *
+rspamd_worker_metrics_object(struct rspamd_config *cfg, struct rspamd_stat *stat, ev_tstamp uptime)
+{
+ rspamd_mempool_stat_t mem_st;
+ memset(&mem_st, 0, sizeof(mem_st));
+ rspamd_mempool_stat(&mem_st);
+
+ ucl_object_t *top = ucl_object_typed_new(UCL_OBJECT);
+
+ ucl_object_insert_key(top, ucl_object_fromstring(RVERSION), "version", 0, false);
+ ucl_object_insert_key(top, ucl_object_fromstring(cfg->checksum), "config_id", 0, false);
+ ucl_object_insert_key(top, ucl_object_fromdouble(uptime), "uptime", 0, false);
+ ucl_object_insert_key(top, ucl_object_fromint(stat->messages_scanned), "scanned", 0, false);
+ ucl_object_insert_key(top, ucl_object_fromint(stat->messages_learned), "learned", 0, false);
+
+ unsigned spam = 0, ham = 0;
+
+ if (stat->messages_scanned > 0) {
+ ucl_object_t *sub = ucl_object_typed_new(UCL_OBJECT);
+ for (int i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i++) {
+ ucl_object_insert_key(sub,
+ ucl_object_fromint(stat->actions_stat[i]),
+ rspamd_action_to_str(i), 0, false);
+ if (i < METRIC_ACTION_GREYLIST) {
+ spam += stat->actions_stat[i];
+ }
+ else {
+ ham += stat->actions_stat[i];
+ }
+ }
+ ucl_object_insert_key(top, sub, "actions", 0, false);
+ }
+
+ ucl_object_insert_key(top, ucl_object_fromint(spam), "spam_count", 0, false);
+ ucl_object_insert_key(top, ucl_object_fromint(ham), "ham_count", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(stat->connections_count), "connections", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(stat->control_connections_count),
+ "control_connections", 0, false);
+
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.pools_allocated), "pools_allocated", 0,
+ false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.pools_freed), "pools_freed", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.bytes_allocated), "bytes_allocated", 0,
+ false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(
+ mem_st.chunks_allocated),
+ "chunks_allocated", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.shared_chunks_allocated),
+ "shared_chunks_allocated", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.chunks_freed), "chunks_freed", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(
+ mem_st.oversized_chunks),
+ "chunks_oversized", 0, false);
+ ucl_object_insert_key(top,
+ ucl_object_fromint(mem_st.fragmented_size), "fragmented", 0, false);
+
+ return top;
+} \ No newline at end of file
diff --git a/src/libserver/worker_util.h b/src/libserver/worker_util.h
index e3627092d..1be7e0180 100644
--- a/src/libserver/worker_util.h
+++ b/src/libserver/worker_util.h
@@ -1,11 +1,11 @@
-/*-
- * Copyright 2016 Vsevolod Stakhov
+/*
+ * Copyright 2024 Vsevolod Stakhov
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -299,6 +299,11 @@ void rspamd_worker_init_controller(struct rspamd_worker *worker,
void rspamd_controller_store_saved_stats(struct rspamd_main *rspamd_main,
struct rspamd_config *cfg);
+/**
+ * Get metrics object for a worker
+ */
+ucl_object_t *rspamd_worker_metrics_object(struct rspamd_config *cfg, struct rspamd_stat *stat, ev_tstamp uptime);
+
#ifdef WITH_HYPERSCAN
struct rspamd_control_command;