From edd80a9db673f8e45a88a06fda957e9e418545b3 Mon Sep 17 00:00:00 2001 From: bav6096 <benedikt.deike@informatik.uni-hamburg.de> Date: Fri, 29 Oct 2021 22:57:07 +0200 Subject: [PATCH] added monitor class --- msg/Metric.msg | 4 ++ msg/Monitoring.msg | 3 ++ scripts/monitor.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 msg/Metric.msg diff --git a/msg/Metric.msg b/msg/Metric.msg new file mode 100644 index 0000000..c583db8 --- /dev/null +++ b/msg/Metric.msg @@ -0,0 +1,4 @@ +string key # Label of the value. +string val # Value to track. +string unit # Unit of the value. +float32 err # Error level of the value. \ No newline at end of file diff --git a/msg/Monitoring.msg b/msg/Monitoring.msg index e69de29..0c0d06e 100644 --- a/msg/Monitoring.msg +++ b/msg/Monitoring.msg @@ -0,0 +1,3 @@ +string name # Name and origin of the monitor message. +string desc # Text describing the monitor message. +Metric metric # Values to monitor. \ No newline at end of file diff --git a/scripts/monitor.py b/scripts/monitor.py index e69de29..2e396d2 100755 --- a/scripts/monitor.py +++ b/scripts/monitor.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +import socket +import rospy +from monitoring.msg import Monitoring +from monitoring.msg import Metic + + +class Monitor: + def __init__(self, desc, freq=1, auto=True): + self.host = socket.gethostname() + self.node = rospy.get_name() + self.name = self.host + self.node + self.desc = desc + + if not freq > 0: + print("Frequency must be greater than 0!") + quit() + + if auto: + self.timer = rospy.Timer(rospy.Duration(1.0 / freq), self.pub_monitoring) + + self.log = {} + self.pub = rospy.Publisher('monitoring', Monitoring, queue_size=1) + self.pub_times = 0 + + self.monitoring = Monitoring() + self.monitoring.name = self.name + self.monitoring.desc = self.desc + + def rst_log_key(self, key): + self.log[key] = {'num': 0, 'val': 0, 'sum': 0, 'dur': rospy.get_rostime()} + + def add_log_val(self, key, val, unit, err, mode=2): + if " " in key: # A key cannot contain whitespace! + rospy.logwarn("[%s] whitespaces are not allowed in monitoring keys!", self.node) + else: + if key in self.log: + # Mode 1: Write the first obtained value into the + # published message. + if mode == 1 and self.pub_times == 0: + self.set_metric(key, val, unit, err) + self.pub_times = 1 + + # Mode 2: Write the last obtained value into the + # published message. + elif mode == 2: + self.set_metric(key, val, unit, err) + + # Mode 3: Remember and write the minimum obtained + # value, after mode selection, into the + # published message. + elif mode == 3: + if val < self.log[key]['val']: + self.log[key]['val'] = val + + self.set_metric(key, self.log[key]['val'], unit, err) + + # Mode 4: Remember and write the maximum obtained + # value, after mode selection, into the + # published message. + elif mode == 4: + if val > self.log[key]['val']: + self.log[key]['val'] = val + + self.set_metric(key, self.log[key]['val'], unit, err) + + # Mode 5: Write the average value over five seconds + # into the published message. + elif mode == 5: + dur = rospy.get_rostime() - self.log[key]['dur'] + if dur < rospy.Duration(5): + self.log[self.name][key]['num'] += 1 + self.log[self.name][key]['sum'] += val + else: + quotient = self.log[key]['sum'] / (self.log[key]['num'] + 0.001) + self.set_metric(key, quotient, unit, err) + self.rst_log_key(key) + else: + self.rst_log_key(key) # Add key to the logging dictionary. + self.set_metric(key, val, unit, err) + + def set_metric(self, key, val, unit, err): + metric = Metic() + metric.key = str(key) + metric.val = str(val) + metric.unit = str(unit) + metric.err = err + self.monitoring.metric = metric + + def rst_monitoring(self): + self.monitoring = Monitoring() + self.monitoring.name = self.name + self.monitoring.desc = self.desc + + def pub_monitoring(self): + self.pub.publish(self.monitoring) + self.rst_monitoring() + -- GitLab