From ea2e03828353fca31ffa2bc31b33de0f6e919639 Mon Sep 17 00:00:00 2001
From: ddamiron <ddamiron@sii.fr>
Date: Tue, 2 Jul 2019 17:50:29 +0200
Subject: [PATCH] add plot step graph end-point

---
 api.py               | 40 ++++++++++++++++++++++++++++++++++++++++
 lib/mongo_session.py | 36 ++++++++++++++++++++++++++++++++++++
 requirements.txt     |  1 +
 3 files changed, 77 insertions(+)

diff --git a/api.py b/api.py
index 92fba98..485f14e 100644
--- a/api.py
+++ b/api.py
@@ -3,6 +3,9 @@ import atexit
 import argparse
 import uuid
 import json
+import matplotlib.pyplot as plt
+import io
+import base64
 
 from flask import Flask, jsonify, Response
 
@@ -24,6 +27,7 @@ except ImportError:
 from lib.read_status_logs import ReadLogger
 from lib.get_most_recent_status_logs import GetLatestLog
 from lib.read_and_filter_logs import ReadFilterLogger
+from lib.mongo_session import MongoSession
 
 # read 'n' parse the configuration
 with open("config.yaml", 'r') as yamlfile:
@@ -41,6 +45,7 @@ cfg['rabbitmq']['exchange'] = os.environ['RMQ_EXCHANGE']
 logging.getLogger().setLevel(os.environ['LOGLEVEL'])
 
 
+
 # def say_hi(n):
 #     import time
 #     time.sleep(n)
@@ -125,5 +130,40 @@ def taskfilter(session_id, query_key, query_value):
     return Response(json.dumps(body, indent=4, sort_keys=True, default=str), mimetype='application/json')
 
 
+@api.route('/plot/<session_id>/<step>')
+def build_plot(session_id, step):
+
+    img = io.BytesIO()
+    x, y = MongoSession(cfg=cfg).get_array_from_step(this_session_id=session_id, step_name=step)
+    # y = [1,2,3,4,5]
+    # x = [0,2,1,3,4]
+    plt.clf()
+    plt.plot(x, y, label=step)
+    plt.savefig(img, format='png')
+    img.seek(0)
+
+    plot_url = base64.b64encode(img.getvalue()).decode()
+
+    return '<img src="data:image/png;base64,{}">'.format(plot_url)
+
+
+@api.route('/plot/<session_id>')
+def build_all_plot(session_id):
+    img = io.BytesIO()
+    plt.clf()
+    for step in ['main', 'doc-enricher', 'doc-processor', 'doc-indexer']:
+        x, y = MongoSession(cfg=cfg).get_array_from_step(this_session_id=session_id, step_name=step)
+        # y = [1,2,3,4,5]
+        # x = [0,2,1,3,4]
+        plt.plot(x, y, label=step)
+    plt.legend()
+    plt.savefig(img, format='png')
+    img.seek(0)
+
+    plot_url = base64.b64encode(img.getvalue()).decode()
+
+    return '<img src="data:image/png;base64,{}">'.format(plot_url)
+
+
 if __name__ == '__main__':
     api.run(host='0.0.0.0', port=8000, debug=True)
diff --git a/lib/mongo_session.py b/lib/mongo_session.py
index 15a17a6..e1d9f82 100644
--- a/lib/mongo_session.py
+++ b/lib/mongo_session.py
@@ -95,3 +95,39 @@ class MongoSession:
             return data
         except Exception as exc:
             print('[ERROR reading log]:', exc)
+
+    def get_array_from_step(self, this_session_id, step_name):
+        try:
+            data_time = []
+            data_value = []
+
+            request_result = self.mongo_data_collection.find({"session_id": this_session_id, "step": step_name},
+                                                             {'timestamp': 1, 'progress_ratio': 1})
+
+            for res in request_result:
+                data_time.append(res['timestamp'])
+                data_value.append(res['progress_ratio'])
+
+            return data_time, data_value
+        except Exception as exc:
+            print('[ERROR reading log]:', exc)
+
+
+if __name__ == '__main__':
+    # TODO the config below should be extracted from the config.yaml file
+    cfg = dict()
+    cfg['rabbitmq'] = dict()
+    cfg['mongo'] = dict()
+
+    cfg['mongo']['host'] = 'localhost'
+    cfg['mongo']['database'] = 'indexerdb'
+    cfg['mongo']['port'] = 27017
+    cfg['mongo']['user'] = 'root'
+    cfg['mongo']['password'] = 'example'
+    cfg['mongo']['collection'] = 'indexer_logs'
+    this_session_id = 'bb0764fe-324e-4719-9214-dc4abc59fe50'
+    data_time, data_value = MongoSession(cfg=cfg).get_array_from_step(this_session_id, "doc-enricher")
+    print('data_time: ', data_time)
+    print('data_value: ', data_value)
+
+
diff --git a/requirements.txt b/requirements.txt
index 7a42fe3..04802f3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -18,3 +18,4 @@ flask
 gunicorn
 apscheduler
 flask-executor
+matplotlib>=3.1.0
-- 
GitLab