NFVBENCH-25 Send run results to fluentd
[nfvbench.git] / nfvbench / fluentd.py
index 5bfcebe..a9bda62 100644 (file)
@@ -15,6 +15,7 @@
 from datetime import datetime
 from fluent import sender
 import logging
+import pytz
 
 
 class FluentLogHandler(logging.Handler):
@@ -40,7 +41,7 @@ class FluentLogHandler(logging.Handler):
     def start_new_run(self):
         '''Delimitate a new run in the stream of records with a new timestamp
         '''
-        self.runlogdate = str(datetime.now())
+        self.runlogdate = self.__get_timestamp()
         # reset counters
         self.__warning_counter = 0
         self.__error_counter = 0
@@ -49,13 +50,21 @@ class FluentLogHandler(logging.Handler):
 
     def emit(self, record):
         data = {
-            "runlogdate": self.runlogdate,
             "loglevel": record.levelname,
-            "message": self.formatter.format(record)
+            "message": self.formatter.format(record),
+            "@timestamp": self.__get_timestamp()
         }
+        # if runlogdate is 0, it's a log from server (not an nfvbench run) so do not send runlogdate
+        if self.runlogdate != 0:
+            data["runlogdate"] = self.runlogdate
+
         self.__update_stats(record.levelno)
         self.sender.emit(None, data)
 
+    # this function is called by summarizer
+    def record_send(self, record):
+        self.sender.emit(None, record)
+
     # send START record for each run
     def __send_start_record(self):
         data = {
@@ -64,7 +73,8 @@ class FluentLogHandler(logging.Handler):
             "message": "NFVBENCH run is started",
             "numloglevel": 0,
             "numerrors": 0,
-            "numwarnings": 0
+            "numwarnings": 0,
+            "@timestamp": self.__get_timestamp()
         }
         self.sender.emit(None, data)
 
@@ -72,13 +82,17 @@ class FluentLogHandler(logging.Handler):
     def send_run_summary(self, run_summary_required):
         if run_summary_required or self.__get_highest_level() == logging.ERROR:
             data = {
-                "runlogdate": self.runlogdate,
                 "loglevel": "RUN_SUMMARY",
                 "message": self.__get_highest_level_desc(),
                 "numloglevel": self.__get_highest_level(),
                 "numerrors": self.__error_counter,
-                "numwarnings": self.__warning_counter
+                "numwarnings": self.__warning_counter,
+                "@timestamp": self.__get_timestamp()
             }
+            # if runlogdate is 0, it's a log from server (not an nfvbench run)
+            # so don't send runlogdate
+            if self.runlogdate != 0:
+                data["runlogdate"] = self.runlogdate
             self.sender.emit(None, data)
 
     def __get_highest_level(self):
@@ -102,3 +116,7 @@ class FluentLogHandler(logging.Handler):
             self.__warning_counter += 1
         elif levelno == logging.ERROR:
             self.__error_counter += 1
+
+    def __get_timestamp(self):
+        return datetime.utcnow().replace(tzinfo=pytz.utc).strftime(
+            "%Y-%m-%dT%H:%M:%S.%f%z")