summaryrefslogtreecommitdiffstats
path: root/glances/event.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/event.py')
-rw-r--r--glances/event.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/glances/event.py b/glances/event.py
new file mode 100644
index 00000000..d7662907
--- /dev/null
+++ b/glances/event.py
@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Glances.
+#
+# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
+#
+# SPDX-License-Identifier: LGPL-3.0-only
+#
+
+"""Manage Glances event class
+This class is a Pydantic data class for the Glances event.
+
+event_state = "OK|CAREFUL|WARNING|CRITICAL"
+event_type = "CPU*|LOAD|MEM|MON"
+event_value = value
+
+Item (or event) is defined by:
+ {
+ "begin": "begin",
+ "end": "end",
+ "state": "WARNING|CRITICAL",
+ "type": "CPU|LOAD|MEM",
+ "max": MAX,
+ "avg": AVG,
+ "min": MIN,
+ "sum": SUM,
+ "count": COUNT,
+ "top": [top 3 process name],
+ "desc": "Processes description",
+ "sort": "top sort key",
+ "global": "global alert message"
+ }
+"""
+
+from pydantic.dataclasses import dataclass
+
+from glances.processes import sort_stats
+
+
+@dataclass
+class GlancesEvent:
+ begin: int
+ state: str
+ type: str
+ min: float
+ max: float
+ sum: float
+ count: int
+ avg: float
+ top: list[str]
+ desc: str
+ sort: str
+ global_msg: str
+ end: int = -1
+
+ def is_ongoing(self):
+ """Return True if the event is ongoing"""
+ return self.end == -1
+
+ def is_finished(self):
+ """Return True if the event is finished"""
+ return self.end != -1
+
+ def update(self, state: str, value: float,
+ sort_key: str = None, proc_list: list = None,
+ proc_desc: str = None, global_msg: str = None):
+ """Update an ongoing event"""
+
+ self.end = -1
+
+ self.min = min(self.min, value)
+ self.max = max(self.max, value)
+ self.sum += value
+ self.count += 1
+ self.avg = self.sum / self.count
+
+ if state == "CRITICAL":
+ # Avoid to change from CRITICAL to WARNING
+ # If an events have reached the CRITICAL state, it can't go back to WARNING
+ self.state = state
+ # TOP PROCESS LIST (only for CRITICAL ALERT)
+ self.sort = sort_key
+ self.top = [p['name'] for p in sort_stats(proc_list, sort_key)[0:3]]
+
+ # MONITORED PROCESSES DESC
+ self.desc = proc_desc
+
+ # Global message
+ self.global_msg = global_msg