Skip to content

Commit 24c8725

Browse files
authored
Merge pull request nicolargo#2941 from ariel-anieli/refactor-alert
Refactorized alert plugin
2 parents 42af55b + fa7fc5b commit 24c8725

File tree

1 file changed

+80
-45
lines changed

1 file changed

+80
-45
lines changed

glances/plugins/alert/__init__.py

+80-45
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"""Alert plugin."""
1010

1111
from datetime import datetime
12+
from functools import reduce
1213

1314
from glances.events_list import glances_events
1415

@@ -123,59 +124,93 @@ def update(self):
123124
# Set the stats to the glances_events
124125
self.stats = glances_events.get()
125126

126-
def msg_curse(self, args=None, max_width=None):
127-
"""Return the dict to display in the curse interface."""
128-
# Init the return message
129-
ret = []
127+
def build_hdr_msg(self, ret):
128+
def cond(elem):
129+
return elem['end'] == -1 and 'global_msg' in elem
130130

131-
# Only process if display plugin enable...
132-
if not self.stats or self.is_disabled():
133-
return ret
131+
global_message = [elem['global_msg'] for elem in self.stats if cond(elem)]
132+
title = global_message[0] if len(global_message) > 0 else "EVENTS history"
133+
134+
ret.append(self.curse_add_line(title, "TITLE"))
135+
136+
return ret
137+
138+
def add_new_line(self, ret, alert):
139+
ret.append(self.curse_new_line())
134140

135-
# Build the string message
136-
# Header with the global message
137-
global_message = [e['global_msg'] for e in self.stats if (e['end'] == -1 and 'global_msg' in e)]
138-
if len(global_message) > 0:
139-
ret.append(self.curse_add_line(global_message[0], "TITLE"))
141+
return ret
142+
143+
def add_start_time(self, ret, alert):
144+
timezone = datetime.now().astimezone().tzinfo
145+
alert_dt = datetime.fromtimestamp(alert['begin'], tz=timezone)
146+
ret.append(self.curse_add_line(alert_dt.strftime("%Y-%m-%d %H:%M:%S(%z)")))
147+
148+
return ret
149+
150+
def add_duration(self, ret, alert):
151+
if alert['end'] > 0:
152+
# If finished display duration
153+
end = datetime.fromtimestamp(alert['end'])
154+
begin = datetime.fromtimestamp(alert['begin'])
155+
msg = f' ({end - begin})'
140156
else:
141-
ret.append(self.curse_add_line("EVENTS history", "TITLE"))
142-
# Loop over alerts
143-
for alert in self.stats:
144-
# New line
145-
ret.append(self.curse_new_line())
146-
# Start
147-
alert_dt = datetime.fromtimestamp(alert['begin'], tz=datetime.now().astimezone().tzinfo)
148-
ret.append(self.curse_add_line(alert_dt.strftime("%Y-%m-%d %H:%M:%S(%z)")))
149-
# Duration
150-
if alert['end'] > 0:
151-
# If finished display duration
152-
msg = ' ({})'.format(datetime.fromtimestamp(alert['end']) - datetime.fromtimestamp(alert['begin']))
153-
else:
154-
msg = ' (ongoing)'
157+
msg = ' (ongoing)'
158+
ret.append(self.curse_add_line(msg))
159+
ret.append(self.curse_add_line(" - "))
160+
161+
return ret
162+
163+
def add_infos(self, ret, alert):
164+
if alert['end'] > 0:
165+
# If finished do not display status
166+
msg = '{} on {}'.format(alert['state'], alert['type'])
155167
ret.append(self.curse_add_line(msg))
156-
ret.append(self.curse_add_line(" - "))
157-
# Infos
158-
if alert['end'] > 0:
159-
# If finished do not display status
160-
msg = '{} on {}'.format(alert['state'], alert['type'])
161-
ret.append(self.curse_add_line(msg))
162-
else:
163-
msg = str(alert['type'])
164-
ret.append(self.curse_add_line(msg, decoration=alert['state']))
165-
# Min / Mean / Max
166-
if self.approx_equal(alert['min'], alert['max'], tolerance=0.1):
167-
msg = ' ({:.1f})'.format(alert['avg'])
168-
else:
169-
msg = ' (Min:{:.1f} Mean:{:.1f} Max:{:.1f})'.format(alert['min'], alert['avg'], alert['max'])
168+
else:
169+
msg = str(alert['type'])
170+
ret.append(self.curse_add_line(msg, decoration=alert['state']))
171+
172+
return ret
173+
174+
def add_min_mean_max(self, ret, alert):
175+
if self.approx_equal(alert['min'], alert['max'], tolerance=0.1):
176+
msg = ' ({:.1f})'.format(alert['avg'])
177+
else:
178+
msg = ' (Min:{:.1f} Mean:{:.1f} Max:{:.1f})'.format(alert['min'], alert['avg'], alert['max'])
179+
ret.append(self.curse_add_line(msg))
180+
181+
return ret
182+
183+
def add_top_proc(self, ret, alert):
184+
top_process = ', '.join(alert['top'])
185+
if top_process != '':
186+
msg = f': {top_process}'
170187
ret.append(self.curse_add_line(msg))
171-
# Top processes
172-
top_process = ', '.join(alert['top'])
173-
if top_process != '':
174-
msg = f': {top_process}'
175-
ret.append(self.curse_add_line(msg))
176188

177189
return ret
178190

191+
def loop_over_alert(self, init, alert):
192+
steps = [
193+
self.add_new_line,
194+
self.add_start_time,
195+
self.add_duration,
196+
self.add_infos,
197+
self.add_min_mean_max,
198+
self.add_top_proc,
199+
]
200+
201+
return reduce(lambda ret, step: step(ret, alert), steps, init)
202+
203+
def msg_curse(self, args=None, max_width=None):
204+
"""Return the dict to display in the curse interface."""
205+
# Init the return message
206+
init = []
207+
208+
# Only process if display plugin enable...
209+
if not self.stats or self.is_disabled():
210+
return init
211+
212+
return reduce(self.loop_over_alert, self.stats, self.build_hdr_msg(init))
213+
179214
def approx_equal(self, a, b, tolerance=0.0):
180215
"""Compare a with b using the tolerance (if numerical)."""
181216
if str(int(a)).isdigit() and str(int(b)).isdigit():

0 commit comments

Comments
 (0)