Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenXG
OpenXG-RAN
Commits
f8b480be
Commit
f8b480be
authored
Oct 22, 2024
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove stats_monitor.py: it is not used by the CI
parent
8ef52d54
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
0 additions
and
161 deletions
+0
-161
ci-scripts/main.py
ci-scripts/main.py
+0
-1
ci-scripts/ran.py
ci-scripts/ran.py
+0
-17
ci-scripts/stats_monitor.py
ci-scripts/stats_monitor.py
+0
-139
ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
+0
-2
ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
+0
-2
No files found.
ci-scripts/main.py
View file @
f8b480be
...
...
@@ -162,7 +162,6 @@ def ExecuteActionWithParam(action):
elif
action
==
'Initialize_eNB'
:
RAN
.
eNB_Trace
=
test
.
findtext
(
'eNB_Trace'
)
RAN
.
eNB_Stats
=
test
.
findtext
(
'eNB_Stats'
)
datalog_rt_stats_file
=
test
.
findtext
(
'rt_stats_cfg'
)
if
datalog_rt_stats_file
is
None
:
RAN
.
datalog_rt_stats_file
=
'datalog_rt_stats.default.yaml'
...
...
ci-scripts/ran.py
View file @
f8b480be
...
...
@@ -91,7 +91,6 @@ class RANManagement():
self
.
datalog_rt_stats
=
{}
self
.
datalog_rt_stats_file
=
'datalog_rt_stats.default.yaml'
self
.
eNB_Trace
=
''
#if 'yes', Tshark will be launched at initialization
self
.
eNB_Stats
=
''
#if 'yes', Statistics Monitor will be launched at initialization
self
.
USRPIPAddress
=
''
#checkers from xml
self
.
ran_checkers
=
{}
...
...
@@ -227,19 +226,6 @@ class RANManagement():
mySSH
.
command
(
'echo '
+
lPassWord
+
' | sudo -S rm -Rf enb_'
+
self
.
testCase_id
+
'.log'
,
'\$'
,
5
)
mySSH
.
command
(
'echo $USER; nohup sudo -E stdbuf -o0 ./my-lte-softmodem-run'
+
str
(
self
.
eNB_instance
)
+
'.sh > '
+
lSourcePath
+
'/cmake_targets/enb_'
+
self
.
testCase_id
+
'.log 2>&1 &'
,
lUserName
,
10
)
#stats monitoring during runtime
time
.
sleep
(
20
)
monitor_file
=
'../ci-scripts/stats_monitor.py'
conf_file
=
'../ci-scripts/stats_monitor_conf.yaml'
if
self
.
eNB_Stats
==
'yes'
:
if
self
.
air_interface
[
self
.
eNB_instance
]
==
'lte-softmodem'
:
mySSH
.
command
(
'echo $USER; nohup python3 '
+
monitor_file
+
' '
+
conf_file
+
' '
+
self
.
testCase_id
+
' enb 2>&1 > enb_stats_monitor_execution.log &'
,
'\$'
,
5
)
else
:
mySSH
.
command
(
'echo $USER; nohup python3 '
+
monitor_file
+
' '
+
conf_file
+
' '
+
self
.
testCase_id
+
' gnb 2>&1 > gnb_stats_monitor_execution.log &'
,
'\$'
,
5
)
self
.
eNBLogFiles
[
int
(
self
.
eNB_instance
)]
=
'enb_'
+
self
.
testCase_id
+
'.log'
if
extra_options
!=
''
:
self
.
eNBOptions
[
int
(
self
.
eNB_instance
)]
=
extra_options
...
...
@@ -453,9 +439,6 @@ class RANManagement():
#debug / tentative
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./nrL1_stats.log'
,
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./nrMAC_stats.log'
,
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./gnb_stats_monitor.pickle'
,
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./gnb_stats_monitor.png'
,
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
#
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./'
+
fileToAnalyze
,
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
logging
.
debug
(
'
\u001B
[1m Analyzing '
+
nodeB_prefix
+
'NB logfile
\u001B
[0m '
+
fileToAnalyze
)
logStatus
=
self
.
AnalyzeLogFile_eNB
(
fileToAnalyze
,
HTML
,
self
.
ran_checkers
)
...
...
ci-scripts/stats_monitor.py
deleted
100755 → 0
View file @
8ef52d54
"""
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
pickle
import
matplotlib.pyplot
as
plt
import
numpy
as
np
import
yaml
import
os
class
StatMonitor
():
def
__init__
(
self
,
cfg_file
):
with
open
(
cfg_file
,
'r'
)
as
file
:
self
.
d
=
yaml
.
load
(
file
)
for
node
in
self
.
d
:
#so far we have enb or gnb as nodes
for
metric_l1
in
self
.
d
[
node
]:
#first level of metric keys
if
metric_l1
!=
"graph"
:
#graph is a reserved word to configure graph paging, so it is disregarded
if
self
.
d
[
node
][
metric_l1
]
is
None
:
#first level is None -> create array
self
.
d
[
node
][
metric_l1
]
=
[]
else
:
#first level is not None -> there is a second level -> create array
for
metric_l2
in
self
.
d
[
node
][
metric_l1
]:
self
.
d
[
node
][
metric_l1
][
metric_l2
]
=
[]
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
)
for
k
in
self
.
d
[
node_type
][
'rt'
]:
result
=
re
.
match
(
rf'^.*\b
{
k
}
\b:\s+([0-9\.]+) us;\s+([0-9]+);\s+([0-9\.]+) us;'
,
tmp
)
if
result
is
not
None
:
self
.
d
[
node_type
][
'rt'
][
k
].
append
(
float
(
result
.
group
(
3
)))
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
,
testcase_id
,
node_type
):
if
node_type
==
'enb'
:
files
=
[
"L1_stats.log"
,
"MAC_stats.log"
,
"PDCP_stats.log"
,
"RRC_stats.log"
]
else
:
#'gnb'
files
=
[
"nrL1_stats.log"
,
"nrMAC_stats.log"
,
"nrPDCP_stats.log"
,
"nrRRC_stats.log"
]
#append each file's contents to another file (prepended with CI-) for debug
for
f
in
files
:
if
os
.
path
.
isfile
(
f
):
cmd
=
'cat '
+
f
+
' >> CI-'
+
testcase_id
+
'-'
+
f
subprocess
.
Popen
(
cmd
,
shell
=
True
)
#join the files for further processing
cmd
=
'cat '
for
f
in
files
:
if
os
.
path
.
isfile
(
f
):
cmd
+=
f
+
' '
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
,
testcase_id
,
node_type
):
for
page
in
self
.
d
[
node_type
][
'graph'
]:
#work out a set a graphs per page
col
=
1
figure
,
axis
=
plt
.
subplots
(
len
(
self
.
d
[
node_type
][
'graph'
][
page
]),
col
,
figsize
=
(
10
,
10
))
i
=
0
for
m
in
self
.
d
[
node_type
][
'graph'
][
page
]:
#metric may refer to 1 level or 2 levels
metric_path
=
m
.
split
(
'.'
)
if
len
(
metric_path
)
==
1
:
#1 level
metric_l1
=
metric_path
[
0
]
major_ticks
=
np
.
arange
(
0
,
len
(
self
.
d
[
node_type
][
metric_l1
])
+
1
,
1
)
axis
[
i
].
set_xticks
(
major_ticks
)
axis
[
i
].
set_xticklabels
([])
axis
[
i
].
plot
(
self
.
d
[
node_type
][
metric_l1
],
marker
=
'o'
)
axis
[
i
].
set_xlabel
(
'time'
)
axis
[
i
].
set_ylabel
(
metric_l1
)
axis
[
i
].
set_title
(
metric_l1
)
else
:
#2 levels
metric_l1
=
metric_path
[
0
]
metric_l2
=
metric_path
[
1
]
major_ticks
=
np
.
arange
(
0
,
len
(
self
.
d
[
node_type
][
metric_l1
][
metric_l2
])
+
1
,
1
)
axis
[
i
].
set_xticks
(
major_ticks
)
axis
[
i
].
set_xticklabels
([])
axis
[
i
].
plot
(
self
.
d
[
node_type
][
metric_l1
][
metric_l2
],
marker
=
'o'
)
axis
[
i
].
set_xlabel
(
'time'
)
axis
[
i
].
set_ylabel
(
metric_l2
)
axis
[
i
].
set_title
(
metric_l2
)
i
+=
1
plt
.
tight_layout
()
#save as png
plt
.
savefig
(
node_type
+
'_stats_monitor_'
+
testcase_id
+
'_'
+
page
+
'.png'
)
if
__name__
==
"__main__"
:
cfg_filename
=
sys
.
argv
[
1
]
#yaml file as metrics config
testcase_id
=
sys
.
argv
[
2
]
#test case id to name files accordingly, especially if we have several tests in a sequence
node
=
sys
.
argv
[
3
]
#enb or gnb
mon
=
StatMonitor
(
cfg_filename
)
#collecting stats when modem process is stopped
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
:
mon
.
collect
(
testcase_id
,
node
)
process
=
subprocess
.
Popen
(
CMD
,
shell
=
True
,
stdout
=
subprocess
.
PIPE
)
output
=
process
.
stdout
.
readlines
()
time
.
sleep
(
1
)
print
(
'Process stopped'
)
with
open
(
node
+
'_stats_monitor.pickle'
,
'wb'
)
as
handle
:
pickle
.
dump
(
mon
.
d
,
handle
,
protocol
=
pickle
.
HIGHEST_PROTOCOL
)
mon
.
graph
(
testcase_id
,
node
)
ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
View file @
f8b480be
...
...
@@ -108,7 +108,6 @@
<eNB_serverId>
0
</eNB_serverId>
<air_interface>
lte
</air_interface>
<eNB_Trace>
yes
</eNB_Trace>
<eNB_Stats>
yes
</eNB_Stats>
<USRP_IPAddress>
172.21.19.13
</USRP_IPAddress>
</testCase>
...
...
@@ -120,7 +119,6 @@
<eNB_instance>
1
</eNB_instance>
<eNB_serverId>
1
</eNB_serverId>
<air_interface>
nr
</air_interface>
<eNB_Stats>
yes
</eNB_Stats>
<rt_stats_cfg>
datalog_rt_stats.2x2.yaml
</rt_stats_cfg>
<USRP_IPAddress>
172.21.19.14
</USRP_IPAddress>
</testCase>
...
...
ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
View file @
f8b480be
...
...
@@ -112,7 +112,6 @@
<eNB_serverId>
0
</eNB_serverId>
<air_interface>
lte
</air_interface>
<eNB_Trace>
yes
</eNB_Trace>
<eNB_Stats>
yes
</eNB_Stats>
<USRP_IPAddress>
172.21.19.13
</USRP_IPAddress>
</testCase>
...
...
@@ -124,7 +123,6 @@
<eNB_instance>
1
</eNB_instance>
<eNB_serverId>
1
</eNB_serverId>
<air_interface>
nr
</air_interface>
<eNB_Stats>
yes
</eNB_Stats>
<rt_stats_cfg>
datalog_rt_stats.2x2.yaml
</rt_stats_cfg>
<USRP_IPAddress>
172.21.19.14
</USRP_IPAddress>
</testCase>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment