Add binary test result metrics to Prometheus exporter

Change-Id: I3dfc620ce397ef8eb919c0dc3bfc224b27687608
diff --git a/edge-monitoring/VERSION b/edge-monitoring/VERSION
index 2b7c5ae..8f0916f 100644
--- a/edge-monitoring/VERSION
+++ b/edge-monitoring/VERSION
@@ -1 +1 @@
-0.4.2
+0.5.0
diff --git a/edge-monitoring/edge_monitoring_server.py b/edge-monitoring/edge_monitoring_server.py
index aa9de66..47ae6f3 100755
--- a/edge-monitoring/edge_monitoring_server.py
+++ b/edge-monitoring/edge_monitoring_server.py
@@ -53,13 +53,29 @@
     "connected": 2
 }
 
+# Collapse 5 levels into 3 for simpler Prometheus metrics
+result_mapping = {
+    "no result": "no result",
+    "error": "no result",
+    "disconnected": "fail",
+    "connecting": "fail",
+    "connected": "ok"
+}
+
 room_mapping = {
     "ace-menlo-pixel-production": "(Compute)-MP-1-Aether Production",
     "ace-menlo-staging": "(Compute)-MP-1-Aether Staging"
 }
 
+# Legacy test status metrics, reporting a status code between -2 and 2
 cp_status = prom.Gauge("aetheredge_status_control_plane", "Control plane status code", ["name"])
 up_status = prom.Gauge("aetheredge_status_user_plane", "User plane status code", ["name"])
+
+# Simplified binary test result metrics
+connect_test = prom.Gauge("aetheredge_connect_test", "Result of last connect test", ["name", "result"])
+ping_test = prom.Gauge("aetheredge_ping_test", "Result of last ping test", ["name", "result"])
+
+# Other metrics
 last_update = prom.Gauge("aetheredge_last_update", "Last reported test result", ["name"])
 maint_window = prom.Gauge("aetheredge_in_maintenance_window", "Currently in a maintenance window", ["name"])
 
@@ -126,6 +142,13 @@
         pass
 
     try:
+        for result in list(set(result_mapping.values())):
+            connect_test.remove(name, result)
+            ping_test.remove(name, result)
+    except:
+        pass
+
+    try:
         maint_window.remove(name)
     except:
         pass
@@ -133,6 +156,7 @@
 @app.route('/edges/metrics', methods=['GET'])
 def get_prometheus_metrics():
     res = []
+    result_list = list(set(result_mapping.values()))
     time_out_stale_results()
     for edge in edges:
         if edge['name'] == "ace-example":
@@ -144,10 +168,20 @@
         if 'maintenance' in edge:
             maint_window.labels(edge['name']).set(int(edge['maintenance']['in_window']))
 
+        for result in result_list:
+            connect_test.labels(edge['name'], result).set(0)
+            ping_test.labels(edge['name'], result).set(0)
+        result = result_mapping[edge['status']['control_plane']]
+        connect_test.labels(edge['name'], result).set(1)
+        result = result_mapping[edge['status']['user_plane']]
+        ping_test.labels(edge['name'], result).set(1)
+
     res.append(prom.generate_latest(cp_status))
     res.append(prom.generate_latest(up_status))
     res.append(prom.generate_latest(last_update))
     res.append(prom.generate_latest(maint_window))
+    res.append(prom.generate_latest(connect_test))
+    res.append(prom.generate_latest(ping_test))
 
     return Response(res, mimetype="text/plain")
 
diff --git a/edge-monitoring/test_edge_monitoring_server.py b/edge-monitoring/test_edge_monitoring_server.py
index 423c310..9979c38 100755
--- a/edge-monitoring/test_edge_monitoring_server.py
+++ b/edge-monitoring/test_edge_monitoring_server.py
@@ -133,9 +133,16 @@
 
         response = self.app.get('/edges/metrics')
         data = response.get_data(as_text=True)
+        print(data)
         self.assertTrue('aetheredge_status_control_plane{name="ace-menlo-pixel"} 2.0' in data)
         self.assertTrue('aetheredge_status_user_plane{name="ace-menlo-pixel"} 2.0' in data)
         self.assertTrue('aetheredge_last_update{name="ace-menlo-pixel"}' in data)
+        self.assertTrue('aetheredge_connect_test{name="ace-menlo-pixel",result="ok"} 1.0' in data)
+        self.assertTrue('aetheredge_ping_test{name="ace-menlo-pixel",result="ok"} 1.0' in data)
+        self.assertTrue('aetheredge_connect_test{name="ace-menlo-pixel",result="fail"} 0.0' in data)
+        self.assertTrue('aetheredge_ping_test{name="ace-menlo-pixel",result="fail"} 0.0' in data)
+        self.assertTrue('aetheredge_connect_test{name="ace-menlo-pixel",result="no result"} 0.0' in data)
+        self.assertTrue('aetheredge_ping_test{name="ace-menlo-pixel",result="no result"} 0.0' in data)
 
         response = self.app.delete('/edges/ace-menlo-pixel')
         data = json.loads(response.get_data(as_text=True))
@@ -143,9 +150,8 @@
 
         response = self.app.get('/edges/metrics')
         data = response.get_data(as_text=True)
-        self.assertFalse('aetheredge_status_control_plane{name="ace-menlo-pixel"} 2.0' in data)
-        self.assertFalse('aetheredge_status_user_plane{name="ace-menlo-pixel"} 2.0' in data)
-        self.assertFalse('aetheredge_last_update{name="ace-menlo-pixel"}' in data)
+        print(data)
+        self.assertFalse('ace-menlo-pixel' in data)
 
         response = self.app.get('/edges')
         data = json.loads(response.get_data(as_text=True))