{.name = {.begin = "/fuzzystat", .len = sizeof("/fuzzystat") - 1}, .type = RSPAMD_CONTROL_FUZZY_STAT},
{.name = {.begin = "/fuzzysync", .len = sizeof("/fuzzysync") - 1}, .type = RSPAMD_CONTROL_FUZZY_SYNC},
{.name = {.begin = "/compositesstats", .len = sizeof("/compositesstats") - 1}, .type = RSPAMD_CONTROL_COMPOSITES_STATS},
+ {.name = {.begin = "/memstat", .len = sizeof("/memstat") - 1}, .type = RSPAMD_CONTROL_MEMORY_STAT},
};
static void rspamd_control_ignore_io_handler(int fd, short what, void *ud);
unsigned int total_conns = 0;
/* Composites stats aggregation */
uint64_t total_checked_slow = 0, total_checked_fast = 0, total_matched = 0;
+ /* Memory stat aggregation */
+ uint64_t total_rss_kb = 0, total_lua_kb = 0, total_mempool_bytes = 0,
+ total_jemalloc_allocated = 0;
rep = ucl_object_typed_new(UCL_OBJECT);
workers = ucl_object_typed_new(UCL_OBJECT);
total_checked_fast += elt->reply.reply.composites_stats.checked_fast;
total_matched += elt->reply.reply.composites_stats.matched;
break;
+ case RSPAMD_CONTROL_MEMORY_STAT:
+ ucl_object_insert_key(cur,
+ ucl_object_fromint(elt->reply.reply.memory_stat.status),
+ "status", 0, false);
+ ucl_object_insert_key(cur,
+ ucl_object_fromint(elt->reply.reply.memory_stat.rss_kb),
+ "rss_kb", 0, false);
+ ucl_object_insert_key(cur,
+ ucl_object_fromint(elt->reply.reply.memory_stat.lua_kb),
+ "lua_kb", 0, false);
+ ucl_object_insert_key(cur,
+ ucl_object_fromint(elt->reply.reply.memory_stat.mempool_bytes),
+ "mempool_bytes", 0, false);
+ ucl_object_insert_key(cur,
+ ucl_object_fromint(elt->reply.reply.memory_stat.jemalloc_allocated),
+ "jemalloc_allocated", 0, false);
+
+ if (elt->attached_fd != -1) {
+ parser = ucl_parser_new(UCL_PARSER_SAFE_FLAGS);
+
+ if (ucl_parser_add_fd(parser, elt->attached_fd)) {
+ ucl_object_insert_key(cur, ucl_parser_get_object(parser),
+ "data", 0, false);
+ }
+ else {
+ ucl_object_insert_key(cur,
+ ucl_object_fromstring(ucl_parser_get_error(parser)),
+ "error", 0, false);
+ }
+ ucl_parser_free(parser);
+ }
+
+ total_rss_kb += elt->reply.reply.memory_stat.rss_kb;
+ total_lua_kb += elt->reply.reply.memory_stat.lua_kb;
+ total_mempool_bytes += elt->reply.reply.memory_stat.mempool_bytes;
+ total_jemalloc_allocated += elt->reply.reply.memory_stat.jemalloc_allocated;
+ break;
default:
break;
}
ucl_object_insert_key(rep, cur, "total", 0, false);
}
+ else if (session->cmd.type == RSPAMD_CONTROL_MEMORY_STAT) {
+ /* Total memory stats */
+ cur = ucl_object_typed_new(UCL_OBJECT);
+ ucl_object_insert_key(cur, ucl_object_fromint(total_rss_kb), "rss_kb", 0, false);
+ ucl_object_insert_key(cur, ucl_object_fromint(total_lua_kb), "lua_kb", 0, false);
+ ucl_object_insert_key(cur, ucl_object_fromint(total_mempool_bytes),
+ "mempool_bytes", 0, false);
+ ucl_object_insert_key(cur, ucl_object_fromint(total_jemalloc_allocated),
+ "jemalloc_allocated", 0, false);
+
+ ucl_object_insert_key(rep, cur, "total", 0, false);
+ }
rspamd_control_send_ucl(session, rep);
ucl_object_unref(rep);