ping: always save rtt data, influxdb ignore empty data 49/44849/9
authorRoss Brattain <ross.b.brattain@intel.com>
Wed, 11 Oct 2017 22:16:53 +0000 (15:16 -0700)
committerRoss Brattain <ross.b.brattain@intel.com>
Fri, 13 Oct 2017 03:38:42 +0000 (20:38 -0700)
If the SLA was failing we were raising AssertionError and not storing
the rtt in the data dict.  This caused influxdb parse errors because the
data was empty.

Fixup influxdb to ignore records with no data, so we don't try to parse
no data.

Change the ping logic to always record the rtt result even if the SLA
was not met.

Also fixup ping logic in cases where ping does not return results.  If
SLA is defined use SLA * 10 otherwise use large float that doesn't break
the grafana scale too much, maybe 999999

JIRA: YARDSTICK-809

Change-Id: Id2d51216581644a80e8c7b9aa98919a766008adf
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
dashboard/opnfv_yardstick_tc037.json
dashboard/opnfv_yardstick_tc038.json
dashboard/opnfv_yardstick_tc070.json
dashboard/opnfv_yardstick_tc071.json
dashboard/opnfv_yardstick_tc072.json
yardstick/benchmark/scenarios/networking/ping.py
yardstick/dispatcher/influxdb.py

index 3662105..85f7908 100644 (file)
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Latency - Ping",
+          "title": "Latency - Ping, 999999 rtt indicates ping error",
           "tooltip": {
             "shared": true,
             "sort": 0,
index bf068d5..65b97d6 100644 (file)
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Latency - Ping",
+          "title": "Latency - Ping, 999999 rtt indicates ping error",
           "tooltip": {
             "shared": true,
             "sort": 0,
index 152ecca..c57d419 100644 (file)
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Latency - Ping",
+          "title": "Latency - Ping, 999999 rtt indicates ping error",
           "tooltip": {
             "shared": true,
             "sort": 0,
index defd6fa..009e0a1 100644 (file)
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Latency - Ping",
+          "title": "Latency - Ping, 999999 rtt indicates ping error",
           "tooltip": {
             "shared": true,
             "sort": 0,
index 2d330a0..b8e9fa3 100644 (file)
           ],
           "timeFrom": null,
           "timeShift": null,
-          "title": "Latency - Ping",
+          "title": "Latency - Ping, 999999 rtt indicates ping error",
           "tooltip": {
             "shared": true,
             "sort": 0,
index 3bade73..e7d9bee 100644 (file)
@@ -24,6 +24,8 @@ LOG = logging.getLogger(__name__)
 class Ping(base.Scenario):
     """Execute ping between two hosts
 
+    If ping error, RTT will be set to 999999
+
   Parameters
     packetsize - number of data bytes to send
         type:    int
@@ -33,6 +35,8 @@ class Ping(base.Scenario):
 
     __scenario_type__ = "Ping"
 
+    PING_ERROR_RTT = 999999
+
     TARGET_SCRIPT = 'ping_benchmark.bash'
 
     def __init__(self, scenario_cfg, context_cfg):
@@ -60,6 +64,7 @@ class Ping(base.Scenario):
 
         rtt_result = {}
         ping_result = {"rtt": rtt_result}
+        sla_max_rtt = self.scenario_cfg.get("sla", {}).get("max_rtt")
 
         for pos, dest in enumerate(dest_list):
             if 'targets' in self.scenario_cfg:
@@ -76,20 +81,34 @@ class Ping(base.Scenario):
             if exit_status != 0:
                 raise RuntimeError(stderr)
 
+            if isinstance(target_vm, dict):
+                target_vm_name = target_vm.get("name")
+            else:
+                target_vm_name = target_vm.split('.')[0]
             if stdout:
-                if isinstance(target_vm, dict):
-                    target_vm_name = target_vm.get("name")
-                else:
-                    target_vm_name = target_vm.split('.')[0]
-                rtt_result[target_vm_name] = float(stdout)
-                if "sla" in self.scenario_cfg:
-                    sla_max_rtt = int(self.scenario_cfg["sla"]["max_rtt"])
+                rtt_result[target_vm_name] = float(stdout.strip())
+                # store result before potential AssertionError
+                result.update(utils.flatten_dict_key(ping_result))
+                if sla_max_rtt is not None:
+                    sla_max_rtt = float(sla_max_rtt)
                     assert rtt_result[target_vm_name] <= sla_max_rtt,\
                         "rtt %f > sla: max_rtt(%f); " % \
                         (rtt_result[target_vm_name], sla_max_rtt)
             else:
                 LOG.error("ping '%s' '%s' timeout", options, target_vm)
-        result.update(utils.flatten_dict_key(ping_result))
+                # we need to specify a result to satisfy influxdb schema
+                # choose a very large number to inidcate timeout
+                # in this case choose an order of magnitude greater than the SLA
+                rtt_result[target_vm_name] = float(self.PING_ERROR_RTT)
+                # store result before potential AssertionError
+                result.update(utils.flatten_dict_key(ping_result))
+                if sla_max_rtt is not None:
+                    raise AssertionError("packet dropped rtt {:f} > sla: max_rtt({:f})".format(
+                        rtt_result[target_vm_name], sla_max_rtt))
+
+                else:
+                    raise AssertionError(
+                        "packet dropped rtt {:f}".format(rtt_result[target_vm_name]))
 
 
 def _test():    # pragma: no cover
index f157e91..632b433 100644 (file)
@@ -55,7 +55,9 @@ class InfluxdbDispatcher(DispatchBase):
         for case, data in testcases.items():
             tc_criteria = data['criteria']
             for record in data['tc_data']:
-                self._upload_one_record(record, case, tc_criteria)
+                # skip results with no data because we influxdb encode empty dicts
+                if record.get("data"):
+                    self._upload_one_record(record, case, tc_criteria)
 
         return 0