NFVBENCH-40 Add pylint to tox
[nfvbench.git] / nfvbench / fluentd.py
index 5bfcebe..16ff33e 100644 (file)
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import logging
+
 from datetime import datetime
 from fluent import sender
-import logging
+import pytz
 
 
 class FluentLogHandler(logging.Handler):
@@ -40,7 +42,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 +51,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 +74,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 +83,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):
@@ -94,11 +109,14 @@ class FluentLogHandler(logging.Handler):
             return "GOOD RUN"
         elif highest_level == logging.WARNING:
             return "RUN WITH WARNINGS"
-        else:
-            return "RUN WITH ERRORS"
+        return "RUN WITH ERRORS"
 
     def __update_stats(self, levelno):
         if levelno == logging.WARNING:
             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")