commit 1cf0d56: [Fix] Rework metrics handling
Vsevolod Stakhov
vsevolod at highsecure.ru
Tue May 18 15:14:04 UTC 2021
Author: Vsevolod Stakhov
Date: 2021-05-18 16:13:31 +0100
URL: https://github.com/rspamd/rspamd/commit/1cf0d5687baf976760681b0db6eed754555ca89b (HEAD -> master)
[Fix] Rework metrics handling
Issue: #3754
---
src/controller.c | 135 ++++++++++++++++++++++++--------------------
src/libserver/worker_util.c | 6 +-
src/libserver/worker_util.h | 4 +-
3 files changed, 79 insertions(+), 66 deletions(-)
diff --git a/src/controller.c b/src/controller.c
index ce4d9b21b..185970efa 100644
--- a/src/controller.c
+++ b/src/controller.c
@@ -2732,6 +2732,7 @@ rspamd_controller_metrics_fin_task (void *ud) {
ucl_object_t *top;
GList *fuzzy_elts, *cur;
struct rspamd_fuzzy_stat_entry *entry;
+ rspamd_fstring_t *output;
gint i;
conn_ent = cbdata->conn_ent;
@@ -2740,87 +2741,103 @@ rspamd_controller_metrics_fin_task (void *ud) {
ucl_object_insert_key (top,
ucl_object_fromint (cbdata->learned), "total_learns", 0, false);
- GString* output = g_string_new ("");
- g_string_append_printf (output, "build_info{version=\"%s\"} 1\n",
+ output = rspamd_fstring_sized_new (1024);
+ rspamd_printf_fstring (&output, "build_info{version=\"%s\"} 1\n",
ucl_object_tostring (ucl_object_lookup (top, "version")));
- g_string_append_printf (output, "config{id=\"%s\"} 1\n",
+ rspamd_printf_fstring (&output, "config{id=\"%s\"} 1\n",
ucl_object_tostring (ucl_object_lookup (top, "config_id")));
- g_string_append_printf (output, "process_start_time_seconds %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "process_start_time_seconds %L\n",
ucl_object_toint (ucl_object_lookup (top, "start_time")));
- g_string_append_printf (output, "read_only %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "read_only %L\n",
ucl_object_toint (ucl_object_lookup (top, "read_only")));
- g_string_append_printf (output, "scanned %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "scanned %L\n",
ucl_object_toint (ucl_object_lookup (top, "scanned")));
- g_string_append_printf (output, "learned %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "learned %L\n",
ucl_object_toint (ucl_object_lookup (top, "learned")));
- g_string_append_printf (output, "spam_count %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "spam_count %L\n",
ucl_object_toint (ucl_object_lookup (top, "spam_count")));
- g_string_append_printf (output, "ham_count %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "ham_count %L\n",
ucl_object_toint (ucl_object_lookup (top, "ham_count")));
- g_string_append_printf (output, "connections %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "connections %L\n",
ucl_object_toint (ucl_object_lookup (top, "connections")));
- g_string_append_printf (output, "control_connections %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "control_connections %L\n",
ucl_object_toint (ucl_object_lookup (top, "control_connections")));
- g_string_append_printf (output, "pools_allocated %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "pools_allocated %L\n",
ucl_object_toint (ucl_object_lookup (top, "pools_allocated")));
- g_string_append_printf (output, "pools_freed %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "pools_freed %" PRId64 "\n",
ucl_object_toint (ucl_object_lookup (top, "pools_freed")));
- g_string_append_printf (output, "bytes_allocated %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "bytes_allocated %L\n",
ucl_object_toint (ucl_object_lookup (top, "bytes_allocated")));
- g_string_append_printf (output, "chunks_allocated %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "chunks_allocated %L\n",
ucl_object_toint (ucl_object_lookup (top, "chunks_allocated")));
- g_string_append_printf (output, "shared_chunks_allocated %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "shared_chunks_allocated %L\n",
ucl_object_toint (ucl_object_lookup (top, "shared_chunks_allocated")));
- g_string_append_printf (output, "chunks_freed %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "chunks_freed %L\n",
ucl_object_toint (ucl_object_lookup (top, "chunks_freed")));
- g_string_append_printf (output, "chunks_oversized %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "chunks_oversized %L\n",
ucl_object_toint (ucl_object_lookup (top, "chunks_oversized")));
- g_string_append_printf (output, "fragmented %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "fragmented %L\n",
ucl_object_toint (ucl_object_lookup (top, "fragmented")));
- g_string_append_printf (output, "total_learns %" PRId64 "\n",
+ rspamd_printf_fstring (&output, "total_learns %L\n",
ucl_object_toint (ucl_object_lookup (top, "total_learns")));
- for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i++) {
- gchar* path = malloc (strlen (rspamd_action_to_str(i)));
- g_string_append_printf (output, "actions{type=\"%s\"} %" PRId64 "\n",
- rspamd_action_to_str (i),
- ucl_object_toint (ucl_object_lookup_path (top, path)));
- g_free (path);
+
+ const ucl_object_t *acts_obj = ucl_object_lookup (top, "actions");
+
+ if (acts_obj) {
+ for (i = METRIC_ACTION_REJECT; i <= METRIC_ACTION_NOACTION; i++) {
+ const char *str_act = rspamd_action_to_str (i);
+ const ucl_object_t *act = ucl_object_lookup (acts_obj, str_act);
+
+ if (act) {
+ rspamd_printf_fstring(&output, "actions{type=\"%s\"} %L\n",
+ str_act,
+ ucl_object_toint(act));
+ }
+ else {
+ rspamd_printf_fstring (&output, "actions{type=\"%s\"} 0\n",
+ str_act);
+ }
+ }
}
if (cbdata->stat) {
const ucl_object_t *cur_elt;
- ucl_object_iter_t it = NULL;
- while ((cur_elt = ucl_object_iterate (cbdata->stat, &it, true))) {
- if (ucl_object_lookup_path (cur_elt, "symbol") && ucl_object_lookup_path (cur_elt, "type")) {
- g_string_append_printf (output, "statfiles_revision{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "revision")));
- g_string_append_printf (output, "statfiles_used{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "used")));
- g_string_append_printf (output, "statfiles_total{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "total")));
- g_string_append_printf (output, "statfiles_size{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "size")));
- g_string_append_printf (output, "statfiles_languages{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "languages")));
- g_string_append_printf (output, "statfiles_users{symbol=\"%s\", type=\"%s\"} %" PRId64 "\n",
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "symbol")),
- ucl_object_tostring (ucl_object_lookup_path (cur_elt, "type")),
- ucl_object_toint (ucl_object_lookup_path (cur_elt, "users")));
+ ucl_object_iter_t it = NULL;
+ while ((cur_elt = ucl_object_iterate (cbdata->stat, &it, true))) {
+ if (ucl_object_lookup (cur_elt, "symbol") &&
+ ucl_object_lookup (cur_elt, "type")) {
+
+ const char *sym = ucl_object_tostring (ucl_object_lookup (cur_elt, "symbol"));
+ const char *type = ucl_object_tostring (ucl_object_lookup (cur_elt, "type"));
+
+ rspamd_printf_fstring (&output, "statfiles_revision{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "revision")));
+ rspamd_printf_fstring (&output, "statfiles_used{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "used")));
+ rspamd_printf_fstring (&output, "statfiles_total{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "total")));
+ rspamd_printf_fstring (&output, "statfiles_size{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "size")));
+ rspamd_printf_fstring (&output, "statfiles_languages{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "languages")));
+ rspamd_printf_fstring (&output, "statfiles_users{symbol=\"%s\", type=\"%s\"} %L\n",
+ sym,
+ type,
+ ucl_object_toint (ucl_object_lookup (cur_elt, "users")));
}
}
}
-
fuzzy_elts = rspamd_mempool_get_variable (cbdata->task->task_pool, "fuzzy_stat");
if (fuzzy_elts) {
@@ -2828,17 +2845,15 @@ rspamd_controller_metrics_fin_task (void *ud) {
entry = cur->data;
if (entry->name) {
- g_string_append_printf (output, "fuzzy_stat{storage=\"%s\"} %" PRIu32 "\n",
- entry->name, entry->fuzzy_cnt);
+ rspamd_printf_fstring (&output, "fuzzy_stat{storage=\"%s\"} %ud\n",
+ entry->name, entry->fuzzy_cnt);
}
}
}
- g_string_append (output, "# EOF\n");
- rspamd_controller_send_openmetrics (conn_ent, g_string_free (output, FALSE));
-
- // TODO implement statfile metrics
+ rspamd_printf_fstring (&output, "# EOF\n");
+ rspamd_controller_send_openmetrics (conn_ent, output);
return TRUE;
}
diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c
index c1840c76d..cf20d9591 100644
--- a/src/libserver/worker_util.c
+++ b/src/libserver/worker_util.c
@@ -601,19 +601,17 @@ rspamd_controller_send_error (struct rspamd_http_connection_entry *entry,
void
rspamd_controller_send_openmetrics (struct rspamd_http_connection_entry *entry,
- const gchar *str)
+ rspamd_fstring_t *str)
{
struct rspamd_http_message *msg;
- rspamd_fstring_t *reply;
msg = rspamd_http_new_message (HTTP_RESPONSE);
msg->date = time (NULL);
msg->code = 200;
msg->status = rspamd_fstring_new_init ("OK", 2);
- reply = rspamd_fstring_new_init (str, strlen (str));
rspamd_http_message_set_body_from_fstring_steal (msg,
- rspamd_controller_maybe_compress (entry, reply, msg));
+ rspamd_controller_maybe_compress (entry, str, msg));
rspamd_http_connection_reset (entry->conn);
rspamd_http_router_insert_headers (entry->rt, msg);
rspamd_http_connection_write_message (entry->conn,
diff --git a/src/libserver/worker_util.h b/src/libserver/worker_util.h
index 973990974..67d598b88 100644
--- a/src/libserver/worker_util.h
+++ b/src/libserver/worker_util.h
@@ -121,11 +121,11 @@ void rspamd_controller_send_error (struct rspamd_http_connection_entry *entry,
/**
* Send openmetrics-formatted strings using HTTP
* @param entry router entry
- * @param str string to send
+ * @param str rspamd fstring buffer, ownership is transferred
*/
void
rspamd_controller_send_openmetrics (struct rspamd_http_connection_entry *entry,
- const gchar *str);
+ rspamd_fstring_t *str);
/**
* Send a custom string using HTTP
More information about the Commits
mailing list