]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
json-stats: split out json generation
authorVictor Julien <victor@inliniac.net>
Wed, 17 Feb 2016 19:19:20 +0000 (20:19 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 22 Feb 2016 12:02:59 +0000 (13:02 +0100)
Split out JSON generation logic so the code becomes reusable.

src/output-json-stats.c

index f17593235d5e89d372cf6bc85b0381124a79746b..68701dd9d95f19b14d0a34e01b2a00872c57f9bb 100644 (file)
@@ -90,28 +90,18 @@ static json_t *OutputStats2Json(json_t *js, const char *key)
     return value;
 }
 
-static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *st)
+/** \brief turn StatsTable into a json object
+ *  \param flags JSON_STATS_* flags for controlling output
+ */
+json_t *StatsToJSON(const StatsTable *st, uint8_t flags)
 {
-    SCEnter();
-    JsonStatsLogThread *aft = (JsonStatsLogThread *)thread_data;
     const char delta_suffix[] = "_delta";
-
     struct timeval tval;
     gettimeofday(&tval, NULL);
 
-    json_t *js = json_object();
-    if (unlikely(js == NULL))
-        return 0;
-
-    char timebuf[64];
-    CreateIsoTimeString(&tval, timebuf, sizeof(timebuf));
-    json_object_set_new(js, "timestamp", json_string(timebuf));
-
-    json_object_set_new(js, "event_type", json_string("stats"));
     json_t *js_stats = json_object();
     if (unlikely(js_stats == NULL)) {
-        json_decref(js);
-        return 0;
+        return NULL;
     }
 
     /* Uptime, in seconds. */
@@ -119,7 +109,7 @@ static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *
         json_integer((int)difftime(tval.tv_sec, st->start_time)));
 
     uint32_t u = 0;
-    if (aft->statslog_ctx->flags & JSON_STATS_TOTALS) {
+    if (flags & JSON_STATS_TOTALS) {
         for (u = 0; u < st->nstats; u++) {
             if (st->stats[u].name == NULL)
                 continue;
@@ -132,7 +122,8 @@ static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *
             if (js_type != NULL) {
                 json_object_set_new(js_type, shortname,
                     json_integer(st->stats[u].value));
-                if (aft->statslog_ctx->flags & JSON_STATS_DELTAS) {
+
+                if (flags & JSON_STATS_DELTAS) {
                     char deltaname[strlen(shortname) + strlen(delta_suffix) + 1];
                     snprintf(deltaname, sizeof(deltaname), "%s%s", shortname,
                         delta_suffix);
@@ -144,12 +135,12 @@ static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *
     }
 
     /* per thread stats - stored in a "threads" object. */
-    if (st->tstats != NULL && (aft->statslog_ctx->flags & JSON_STATS_THREADS)) {
+    if (st->tstats != NULL && (flags & JSON_STATS_THREADS)) {
         /* for each thread (store) */
         json_t *threads = json_object();
         if (unlikely(threads == NULL)) {
-            json_decref(js);
-            return 0;
+            json_decref(js_stats);
+            return NULL;
         }
         uint32_t x;
         for (x = 0; x < st->ntstats; x++) {
@@ -168,7 +159,7 @@ static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *
                 if (js_type != NULL) {
                     json_object_set_new(js_type, shortname, json_integer(st->tstats[u].value));
 
-                    if (aft->statslog_ctx->flags & JSON_STATS_DELTAS) {
+                    if (flags & JSON_STATS_DELTAS) {
                         char deltaname[strlen(shortname) + strlen(delta_suffix) + 1];
                         snprintf(deltaname, sizeof(deltaname), "%s%s",
                             shortname, delta_suffix);
@@ -180,6 +171,30 @@ static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *
         }
         json_object_set_new(js_stats, "threads", threads);
     }
+    return js_stats;
+}
+
+static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *st)
+{
+    SCEnter();
+    JsonStatsLogThread *aft = (JsonStatsLogThread *)thread_data;
+
+    struct timeval tval;
+    gettimeofday(&tval, NULL);
+
+    json_t *js = json_object();
+    if (unlikely(js == NULL))
+        return 0;
+    char timebuf[64];
+    CreateIsoTimeString(&tval, timebuf, sizeof(timebuf));
+    json_object_set_new(js, "timestamp", json_string(timebuf));
+    json_object_set_new(js, "event_type", json_string("stats"));
+
+    json_t *js_stats = StatsToJSON(st, aft->statslog_ctx->flags);
+    if (js_stats == NULL) {
+        json_decref(js);
+        return 0;
+    }
 
     json_object_set_new(js, "stats", js_stats);