uint32_t flags; /** Store mode */
} OutputStatsCtx;
-
typedef struct JsonStatsLogThread_ {
OutputStatsCtx *statslog_ctx;
+ MemBuffer *buffer;
} JsonStatsLogThread;
-static void *eve_file_ctx = NULL;
-static void *eve_buffer = NULL;
-
static
json_t *SCPerfLookupJson(json_t *js, char *key)
{
return value;
}
-static int JsonStatsLogger(ThreadVars *tv, void *thread_data, StatsTable *st)
+static int JsonStatsLogger(ThreadVars *tv, void *thread_data, const StatsTable *st)
{
SCEnter();
- /*JsonStatsLogThread *aft = (JsonStatsLogThread *)thread_data; */
+ JsonStatsLogThread *aft = (JsonStatsLogThread *)thread_data;
+ MemBuffer *buffer = (MemBuffer *)aft->buffer;
struct timeval tval;
- struct tm *tms;
-
gettimeofday(&tval, NULL);
- struct tm local_tm;
- tms = SCLocalTime(tval.tv_sec, &local_tm);
/* Calculate the Engine uptime */
int up_time = (int)difftime(tval.tv_sec, st->start_time);
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;
}
- char date[128];
- snprintf(date, sizeof(date),
- "%" PRId32 "/%" PRId32 "/%04d -- %02d:%02d:%02d",
- tms->tm_mon + 1, tms->tm_mday, tms->tm_year + 1900, tms->tm_hour,
- tms->tm_min, tms->tm_sec);
-
- json_object_set_new(js_stats, "date", json_string(date));
char uptime[128];
snprintf(uptime, sizeof(uptime),
}
json_object_set_new(js, "stats", js_stats);
- if (eve_file_ctx != NULL && eve_buffer != NULL) {
- OutputJSONBuffer(js, eve_file_ctx, eve_buffer);
- }
+ OutputJSONBuffer(js, aft->statslog_ctx->file_ctx, buffer);
+ MemBufferReset(buffer);
+
json_object_clear(js);
json_decref(js);
/* Use the Ouptut Context (file pointer and mutex) */
aft->statslog_ctx = ((OutputCtx *)initdata)->data;
+ aft->buffer = MemBufferCreateNew(OUTPUT_BUFFER_SIZE);
+ if (aft->buffer == NULL) {
+ SCFree(aft);
+ return TM_ECODE_FAILED;
+ }
+
*data = (void *)aft;
return TM_ECODE_OK;
}
return TM_ECODE_OK;
}
+ MemBufferFree(aft->buffer);
+
/* clear memory */
memset(aft, 0, sizeof(JsonStatsLogThread));
static void OutputStatsLogDeinitSub(OutputCtx *output_ctx)
{
-
OutputStatsCtx *stats_ctx = output_ctx->data;
SCFree(stats_ctx);
SCFree(output_ctx);
OutputCtx *OutputStatsLogInitSub(ConfNode *conf, OutputCtx *parent_ctx)
{
AlertJsonThread *ajt = parent_ctx->data;
- MemBuffer *buffer;
OutputStatsCtx *stats_ctx = SCMalloc(sizeof(OutputStatsCtx));
if (unlikely(stats_ctx == NULL))
output_ctx->data = stats_ctx;
output_ctx->DeInit = OutputStatsLogDeinitSub;
- buffer = MemBufferCreateNew(OUTPUT_BUFFER_SIZE);
- if (buffer == NULL) {
- SCFree(stats_ctx);
- SCFree(output_ctx);
- return NULL;
- }
-
- eve_file_ctx = stats_ctx->file_ctx;
- eve_buffer = buffer;
-
return output_ctx;
}
tmm_modules[TMM_JSONSTATSLOG].flags = TM_FLAG_LOGAPI_TM;
/* register as separate module */
- OutputRegisterStatsModule(MODULE_NAME, "stats", OutputStatsLogInit,
+ OutputRegisterStatsModule(MODULE_NAME, "stats-json", OutputStatsLogInit,
JsonStatsLogger);
/* also register as child of eve-log */