summaryrefslogtreecommitdiffstats
path: root/src/output-json-stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/output-json-stats.c')
-rw-r--r--src/output-json-stats.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/src/output-json-stats.c b/src/output-json-stats.c
index 718298e..33f98af 100644
--- a/src/output-json-stats.c
+++ b/src/output-json-stats.c
@@ -36,6 +36,7 @@
#include "util-print.h"
#include "util-time.h"
#include "util-unittest.h"
+#include "util-validate.h"
#include "util-debug.h"
#include "output.h"
@@ -265,20 +266,30 @@ json_t *StatsToJSON(const StatsTable *st, uint8_t flags)
for (x = 0; x < st->ntstats; x++) {
uint32_t offset = x * st->nstats;
+ // Stats for for this thread.
+ json_t *thread = json_object();
+ if (unlikely(thread == NULL)) {
+ json_decref(js_stats);
+ json_decref(threads);
+ return NULL;
+ }
+
/* for each counter */
for (u = offset; u < (offset + st->nstats); u++) {
if (st->tstats[u].name == NULL)
continue;
+ // Seems this holds, but assert in debug builds.
+ DEBUG_VALIDATE_BUG_ON(
+ strcmp(st->tstats[offset].tm_name, st->tstats[u].tm_name) != 0);
+
json_t *js_type = NULL;
const char *stat_name = st->tstats[u].short_name;
if (st->tstats[u].short_name == NULL) {
stat_name = st->tstats[u].name;
js_type = threads;
} else {
- char str[256];
- snprintf(str, sizeof(str), "%s.%s", st->tstats[u].tm_name, st->tstats[u].name);
- js_type = OutputStats2Json(threads, str);
+ js_type = OutputStats2Json(thread, st->tstats[u].name);
}
if (js_type != NULL) {
@@ -292,6 +303,7 @@ json_t *StatsToJSON(const StatsTable *st, uint8_t flags)
}
}
}
+ json_object_set_new(threads, st->tstats[offset].tm_name, thread);
}
json_object_set_new(js_stats, "threads", threads);
}
@@ -471,3 +483,7 @@ void JsonStatsLogRegister(void) {
"eve-log.stats", OutputStatsLogInitSub, JsonStatsLogger,
JsonStatsLogThreadInit, JsonStatsLogThreadDeinit, NULL);
}
+
+#ifdef UNITTESTS
+#include "tests/output-json-stats.c"
+#endif