Skip to content

Commit 436058f

Browse files
committed
refactor(ram_monitor): ros2 port
1 parent 3173a8e commit 436058f

File tree

3 files changed

+106
-1
lines changed

3 files changed

+106
-1
lines changed

diagnostic_common_diagnostics/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ament_python_install_package(${PROJECT_NAME})
1010
install(PROGRAMS
1111
${PROJECT_NAME}/cpu_monitor.py
1212
${PROJECT_NAME}/ntp_monitor.py
13+
${PROJECT_NAME}/ram_monitor.py
1314
DESTINATION lib/${PROJECT_NAME}
1415
)
1516

diagnostic_common_diagnostics/README.md

+21-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,27 @@ Disable self test.
5656
**To be ported**
5757

5858
## ram_monitor.py
59-
**To be ported**
59+
The `ram_monitor` module allows users to monitor the RAM usage of their system in real-time.
60+
It publishes the usage percentage in a diagnostic message.
61+
62+
* Name of the node is "ram_monitor_" + hostname.
63+
* Uses the following args:
64+
* warning_percentage: If the RAM usage is > warning_percentage, a WARN status will be published.
65+
* window: the maximum length of the used collections.deque for queuing CPU readings.
66+
67+
### Published Topics
68+
#### /diagnostics
69+
diagnostic_msgs/DiagnosticArray
70+
The diagnostics information.
71+
72+
### Parameters
73+
#### warning_percentage
74+
(default: 90)
75+
warning percentage threshold.
76+
77+
#### window
78+
(default: 1)
79+
Length of RAM readings queue.
6080

6181
## sensors_monitor.py
6282
**To be ported**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/usr/bin/env python
2+
#
3+
# Software License Agreement (BSD License)
4+
#
5+
# Copyright (c) 2017, TNO IVS, Helmond, Netherlands
6+
# All rights reserved.
7+
#
8+
# Redistribution and use in source and binary forms, with or without
9+
# modification, are permitted provided that the following conditions
10+
# are met:
11+
#
12+
# * Redistributions of source code must retain the above copyright
13+
# notice, this list of conditions and the following disclaimer.
14+
# * Redistributions in binary form must reproduce the above
15+
# copyright notice, this list of conditions and the following
16+
# disclaimer in the documentation and/or other materials provided
17+
# with the distribution.
18+
# * Neither the name of the TNO IVS nor the names of its
19+
# contributors may be used to endorse or promote products derived
20+
# from this software without specific prior written permission.
21+
#
22+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28+
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31+
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32+
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33+
# POSSIBILITY OF SUCH DAMAGE.
34+
35+
# \author Rein Appeldoorn
36+
37+
import collections
38+
import socket
39+
40+
import psutil
41+
import rclpy
42+
from diagnostic_msgs.msg import DiagnosticStatus
43+
from diagnostic_updater import DiagnosticTask, Updater
44+
45+
46+
class RamTask(DiagnosticTask):
47+
def __init__(self, warning_percentage, window=1):
48+
DiagnosticTask.__init__(self, "RAM Information")
49+
self._warning_percentage = int(warning_percentage)
50+
self._readings = collections.deque(maxlen=window)
51+
52+
def run(self, stat):
53+
self._readings.append(psutil.virtual_memory().percent)
54+
ram_average = sum(self._readings) / len(self._readings)
55+
56+
stat.add("RAM Load Average", "{:.2f}".format(ram_average))
57+
58+
if ram_average > self._warning_percentage:
59+
stat.summary(DiagnosticStatus.WARN,
60+
"RAM Average exceeds {:d} percent".format(self._warning_percentage))
61+
else:
62+
stat.summary(DiagnosticStatus.OK, "RAM Average {:.2f} percent".format(ram_average))
63+
64+
return stat
65+
66+
67+
def main():
68+
hostname = socket.gethostname()
69+
rclpy.init()
70+
node = rclpy.create_node('ram_monitor_%s' % hostname.replace("-", "_"))
71+
72+
updater = Updater(node)
73+
updater.setHardwareID(hostname)
74+
updater.add(
75+
RamTask(node.declare_parameter("warning_percentage", 90.0).value, node.declare_parameter("window", 1).value))
76+
77+
rclpy.spin(node)
78+
79+
80+
if __name__ == '__main__':
81+
try:
82+
main()
83+
except KeyboardInterrupt as e:
84+
pass

0 commit comments

Comments
 (0)