From 010e0cca1b8800878de26ac6a402061017cd6c37 Mon Sep 17 00:00:00 2001
From: hardy <remi.hardy@openairinterface.org>
Date: Thu, 14 Oct 2021 11:11:49 +0200
Subject: [PATCH] bring ulsch and dlsch stats for gnb

---
 ci-scripts/stats_monitor.py        | 165 +++++++++++++++--------------
 ci-scripts/stats_monitor.py.old    |  94 ++++++++++++++++
 ci-scripts/stats_monitor_conf.yaml |   8 +-
 ci-scripts/stats_monitor_dev.py    |  19 ++--
 4 files changed, 195 insertions(+), 91 deletions(-)
 create mode 100755 ci-scripts/stats_monitor.py.old

diff --git a/ci-scripts/stats_monitor.py b/ci-scripts/stats_monitor.py
index ae9b39bfa6..83de20f5d2 100755
--- a/ci-scripts/stats_monitor.py
+++ b/ci-scripts/stats_monitor.py
@@ -1,94 +1,101 @@
+"""
+To create graphs and pickle from runtime statistics in L1,MAC,RRC,PDCP files
+"""
+
 import subprocess
 import time
 import shlex
 import re
 import sys
-import matplotlib.pyplot as plt
 import pickle
+import matplotlib.pyplot as plt
 import numpy as np
-import os
-
-def collect(d, node_type):
-    if node_type=='enb':
-        cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
-    else: #'gnb'
-        cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
-    process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
-    output = process.stdout.readlines()
-    for l in output:
-        tmp=l.decode("utf-8")
-        result=re.match(rf'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
-        if result is not None:
-            d['PHR'].append(int(result.group(1)))
-            d['bler'].append(float(result.group(2)))
-            d['mcsoff'].append(int(result.group(3)))
-            d['mcs'].append(int(result.group(4)))
-
-
-def graph(d, node_type):
-
-
-    figure, axis = plt.subplots(4, 1,figsize=(10, 10)) 
-
-    major_ticks = np.arange(0, len(d['PHR'])+1, 1)
-    axis[0].set_xticks(major_ticks)
-    axis[0].set_xticklabels([])
-    axis[0].plot(d['PHR'],marker='o')
-    axis[0].set_xlabel('time')
-    axis[0].set_ylabel('PHR')
-    axis[0].set_title("PHR")
-  
-    major_ticks = np.arange(0, len(d['bler'])+1, 1)
-    axis[1].set_xticks(major_ticks)
-    axis[1].set_xticklabels([])
-    axis[1].plot(d['bler'],marker='o')
-    axis[1].set_xlabel('time')
-    axis[1].set_ylabel('bler')
-    axis[1].set_title("bler")
-
-    major_ticks = np.arange(0, len(d['mcsoff'])+1, 1)
-    axis[2].set_xticks(major_ticks)
-    axis[2].set_xticklabels([])
-    axis[2].plot(d['mcsoff'],marker='o')
-    axis[2].set_xlabel('time')
-    axis[2].set_ylabel('mcsoff')
-    axis[2].set_title("mcsoff")
-
-    major_ticks = np.arange(0, len(d['mcs'])+1, 1)
-    axis[3].set_xticks(major_ticks)
-    axis[3].set_xticklabels([])
-    axis[3].plot(d['mcs'],marker='o')
-    axis[3].set_xlabel('time')
-    axis[3].set_ylabel('mcs')
-    axis[3].set_title("mcs")
-
-    plt.tight_layout()
-    # Combine all the operations and display
-    plt.savefig(node_type+'_stats_monitor.png')
-    plt.show()
-
-if __name__ == "__main__":
+import yaml
+
+
+class StatMonitor():
+    def __init__(self,):
+        with open('stats_monitor_conf.yaml','r') as file:
+            self.d = yaml.load(file)
+        for node in self.d:
+            for metric in self.d[node]:
+                self.d[node][metric]=[]
+
+
+    def process_gnb (self,node_type,output):
+        for line in output:
+            tmp=line.decode("utf-8")
+            result=re.match(r'^.*\bdlsch_rounds\b ([0-9]+)\/([0-9]+).*\bdlsch_errors\b ([0-9]+)',tmp)
+            if result is not None:
+                self.d[node_type]['dlsch_err'].append(int(result.group(3)))
+                percentage=float(result.group(2))/float(result.group(1))
+                self.d[node_type]['dlsch_err_perc_round_1'].append(percentage)
+            result=re.match(r'^.*\bulsch_rounds\b ([0-9]+)\/([0-9]+).*\bulsch_errors\b ([0-9]+)',tmp)
+            if result is not None:
+                self.d[node_type]['ulsch_err'].append(int(result.group(3)))
+                percentage=float(result.group(2))/float(result.group(1))
+                self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
+
+
+    def process_enb (self,node_type,output):
+        for line in output:
+            tmp=line.decode("utf-8")
+            result=re.match(r'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
+            if result is not None:
+                self.d[node_type]['PHR'].append(int(result.group(1)))
+                self.d[node_type]['bler'].append(float(result.group(2)))
+                self.d[node_type]['mcsoff'].append(int(result.group(3)))
+                self.d[node_type]['mcs'].append(int(result.group(4)))
+
+
+    def collect(self,node_type):
+        if node_type=='enb':
+            cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
+        else: #'gnb'
+            cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
+        process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
+        output = process.stdout.readlines()
+        if node_type=='enb':
+            self.process_enb(node_type,output)
+        else: #'gnb'
+            self.process_gnb(node_type,output)
+
+
+    def graph(self,node_type):
+        col = 1
+        figure, axis = plt.subplots(len(self.d[node_type]), col ,figsize=(10, 10))
+        i=0
+        for metric in self.d[node_type]:
+            major_ticks = np.arange(0, len(self.d[node_type][metric])+1, 1)
+            axis[i].set_xticks(major_ticks)
+            axis[i].set_xticklabels([])
+            axis[i].plot(self.d[node_type][metric],marker='o')
+            axis[i].set_xlabel('time')
+            axis[i].set_ylabel(metric)
+            axis[i].set_title(metric)
+            i+=1
+
+        plt.tight_layout()
+        # Combine all the operations and display
+        plt.savefig(node_type+'_stats_monitor.png')
+        plt.show()
 
-    node_type = sys.argv[1]#enb or gnb
 
-    d={}
-    d['PHR']=[]
-    d['bler']=[]
-    d['mcsoff']=[]
-    d['mcs']=[]
+if __name__ == "__main__":
 
+    node = sys.argv[1]#enb or gnb
+    mon=StatMonitor()
 
-    cmd='ps aux | grep modem | grep -v grep'
-    process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+    #collecting stats when modem process is stopped
+    CMD='ps aux | grep mode | grep -v grep'
+    process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
     output = process.stdout.readlines()
     while len(output)!=0 :
-        collect(d, node_type)
-        process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+        mon.collect(node)
+        process=subprocess.Popen(CMD, shell=True, stdout=subprocess.PIPE)
         output = process.stdout.readlines()
         time.sleep(1)
-    print('process stopped')
-    with open(node_type+'_stats_monitor.pickle', 'wb') as handle:
-        pickle.dump(d, handle, protocol=pickle.HIGHEST_PROTOCOL)
-    graph(d, node_type)
-
-
+    print('Process stopped')
+    with open(node+'_stats_monitor.pickle', 'wb') as handle:
+        pickle.dump(mon.d, handle, protocol=pickle.HIGHEST_PROTOCOL)
+    mon.graph(node)
diff --git a/ci-scripts/stats_monitor.py.old b/ci-scripts/stats_monitor.py.old
new file mode 100755
index 0000000000..ae9b39bfa6
--- /dev/null
+++ b/ci-scripts/stats_monitor.py.old
@@ -0,0 +1,94 @@
+import subprocess
+import time
+import shlex
+import re
+import sys
+import matplotlib.pyplot as plt
+import pickle
+import numpy as np
+import os
+
+def collect(d, node_type):
+    if node_type=='enb':
+        cmd='cat L1_stats.log MAC_stats.log PDCP_stats.log RRC_stats.log'
+    else: #'gnb'
+        cmd='cat nrL1_stats.log nrMAC_stats.log nrPDCP_stats.log nrRRC_stats.log'
+    process=subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
+    output = process.stdout.readlines()
+    for l in output:
+        tmp=l.decode("utf-8")
+        result=re.match(rf'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
+        if result is not None:
+            d['PHR'].append(int(result.group(1)))
+            d['bler'].append(float(result.group(2)))
+            d['mcsoff'].append(int(result.group(3)))
+            d['mcs'].append(int(result.group(4)))
+
+
+def graph(d, node_type):
+
+
+    figure, axis = plt.subplots(4, 1,figsize=(10, 10)) 
+
+    major_ticks = np.arange(0, len(d['PHR'])+1, 1)
+    axis[0].set_xticks(major_ticks)
+    axis[0].set_xticklabels([])
+    axis[0].plot(d['PHR'],marker='o')
+    axis[0].set_xlabel('time')
+    axis[0].set_ylabel('PHR')
+    axis[0].set_title("PHR")
+  
+    major_ticks = np.arange(0, len(d['bler'])+1, 1)
+    axis[1].set_xticks(major_ticks)
+    axis[1].set_xticklabels([])
+    axis[1].plot(d['bler'],marker='o')
+    axis[1].set_xlabel('time')
+    axis[1].set_ylabel('bler')
+    axis[1].set_title("bler")
+
+    major_ticks = np.arange(0, len(d['mcsoff'])+1, 1)
+    axis[2].set_xticks(major_ticks)
+    axis[2].set_xticklabels([])
+    axis[2].plot(d['mcsoff'],marker='o')
+    axis[2].set_xlabel('time')
+    axis[2].set_ylabel('mcsoff')
+    axis[2].set_title("mcsoff")
+
+    major_ticks = np.arange(0, len(d['mcs'])+1, 1)
+    axis[3].set_xticks(major_ticks)
+    axis[3].set_xticklabels([])
+    axis[3].plot(d['mcs'],marker='o')
+    axis[3].set_xlabel('time')
+    axis[3].set_ylabel('mcs')
+    axis[3].set_title("mcs")
+
+    plt.tight_layout()
+    # Combine all the operations and display
+    plt.savefig(node_type+'_stats_monitor.png')
+    plt.show()
+
+if __name__ == "__main__":
+
+    node_type = sys.argv[1]#enb or gnb
+
+    d={}
+    d['PHR']=[]
+    d['bler']=[]
+    d['mcsoff']=[]
+    d['mcs']=[]
+
+
+    cmd='ps aux | grep modem | grep -v grep'
+    process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+    output = process.stdout.readlines()
+    while len(output)!=0 :
+        collect(d, node_type)
+        process=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+        output = process.stdout.readlines()
+        time.sleep(1)
+    print('process stopped')
+    with open(node_type+'_stats_monitor.pickle', 'wb') as handle:
+        pickle.dump(d, handle, protocol=pickle.HIGHEST_PROTOCOL)
+    graph(d, node_type)
+
+
diff --git a/ci-scripts/stats_monitor_conf.yaml b/ci-scripts/stats_monitor_conf.yaml
index 3da7c1e8ba..6c0a2b0225 100644
--- a/ci-scripts/stats_monitor_conf.yaml
+++ b/ci-scripts/stats_monitor_conf.yaml
@@ -5,7 +5,7 @@ enb :
   mcs:  
 
 gnb :
-  PHR:
-  bler:
-  mcsoff:
-  mcs:
\ No newline at end of file
+  dlsch_err:
+  dlsch_err_perc_round_1:
+  ulsch_err:
+  ulsch_err_perc_round_1:
\ No newline at end of file
diff --git a/ci-scripts/stats_monitor_dev.py b/ci-scripts/stats_monitor_dev.py
index 44f79dfb73..83de20f5d2 100755
--- a/ci-scripts/stats_monitor_dev.py
+++ b/ci-scripts/stats_monitor_dev.py
@@ -22,19 +22,22 @@ class StatMonitor():
                 self.d[node][metric]=[]
 
 
-    def process_enb (self,node_type,output):
+    def process_gnb (self,node_type,output):
         for line in output:
             tmp=line.decode("utf-8")
-            result=re.match(r'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
+            result=re.match(r'^.*\bdlsch_rounds\b ([0-9]+)\/([0-9]+).*\bdlsch_errors\b ([0-9]+)',tmp)
             if result is not None:
-                self.d[node_type]['PHR'].append(int(result.group(1)))
-                self.d[node_type]['bler'].append(float(result.group(2)))
-                self.d[node_type]['mcsoff'].append(int(result.group(3)))
-                self.d[node_type]['mcs'].append(int(result.group(4)))
-
+                self.d[node_type]['dlsch_err'].append(int(result.group(3)))
+                percentage=float(result.group(2))/float(result.group(1))
+                self.d[node_type]['dlsch_err_perc_round_1'].append(percentage)
+            result=re.match(r'^.*\bulsch_rounds\b ([0-9]+)\/([0-9]+).*\bulsch_errors\b ([0-9]+)',tmp)
+            if result is not None:
+                self.d[node_type]['ulsch_err'].append(int(result.group(3)))
+                percentage=float(result.group(2))/float(result.group(1))
+                self.d[node_type]['ulsch_err_perc_round_1'].append(percentage)
 
 
-    def process_gnb (self,node_type,output):
+    def process_enb (self,node_type,output):
         for line in output:
             tmp=line.decode("utf-8")
             result=re.match(r'^.*\bPHR\b ([0-9]+).+\bbler\b ([0-9]+\.[0-9]+).+\bmcsoff\b ([0-9]+).+\bmcs\b ([0-9]+)',tmp)
-- 
2.26.2