|
9 | 9 | """Alert plugin."""
|
10 | 10 |
|
11 | 11 | from datetime import datetime
|
| 12 | +from functools import reduce |
12 | 13 |
|
13 | 14 | from glances.events_list import glances_events
|
14 | 15 |
|
@@ -123,59 +124,93 @@ def update(self):
|
123 | 124 | # Set the stats to the glances_events
|
124 | 125 | self.stats = glances_events.get()
|
125 | 126 |
|
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 |
130 | 130 |
|
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()) |
134 | 140 |
|
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})' |
140 | 156 | 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']) |
155 | 167 | 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}' |
170 | 187 | 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)) |
176 | 188 |
|
177 | 189 | return ret
|
178 | 190 |
|
| 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 | + |
179 | 214 | def approx_equal(self, a, b, tolerance=0.0):
|
180 | 215 | """Compare a with b using the tolerance (if numerical)."""
|
181 | 216 | if str(int(a)).isdigit() and str(int(b)).isdigit():
|
|
0 commit comments