|
@@ -1,5 +1,6 @@
|
|
import time
|
|
import time
|
|
from collections import defaultdict
|
|
from collections import defaultdict
|
|
|
|
+from datetime import datetime
|
|
|
|
|
|
HEARTBEAT_EXPIRE = 120 # Heartbeats must be at most 2 minutes apart.
|
|
HEARTBEAT_EXPIRE = 120 # Heartbeats must be at most 2 minutes apart.
|
|
|
|
|
|
@@ -23,15 +24,41 @@ class MonitorState(object):
|
|
t[task_type].append(id)
|
|
t[task_type].append(id)
|
|
return t
|
|
return t
|
|
|
|
|
|
|
|
+ def get_task_info(self, task_id):
|
|
|
|
+ task_info = dict(self.tasks[task_id])
|
|
|
|
+
|
|
|
|
+ task_events = []
|
|
|
|
+ for event in self.task_events[task_id]:
|
|
|
|
+ print("EVENT >>>>>> %s" % event)
|
|
|
|
+ if event["state"] in ("task-failed", "task-retried"):
|
|
|
|
+ task_info["exception"] = event["exception"]
|
|
|
|
+ task_info["traceback"] = event["traceback"]
|
|
|
|
+ elif event["state"] == "task-succeeded":
|
|
|
|
+ task_info["result"] = event["result"]
|
|
|
|
+ task_events.append({event["state"]: event["when"]})
|
|
|
|
+ task_info["events"] = task_events
|
|
|
|
+
|
|
|
|
+ return task_info
|
|
|
|
+
|
|
|
|
+
|
|
def receive_task_event(self, event):
|
|
def receive_task_event(self, event):
|
|
event["state"] = event.pop("type")
|
|
event["state"] = event.pop("type")
|
|
|
|
+ event["when"] = self.timestamp_to_isoformat(event["timestamp"])
|
|
self.task_events[event["uuid"]].append(event)
|
|
self.task_events[event["uuid"]].append(event)
|
|
|
|
|
|
|
|
+ def timestamp_to_datetime(self, timestamp):
|
|
|
|
+ return datetime.fromtimestamp(timestamp).isoformat()
|
|
|
|
+
|
|
def receive_heartbeat(self, event):
|
|
def receive_heartbeat(self, event):
|
|
self.hearts[event["hostname"]] = event["timestamp"]
|
|
self.hearts[event["hostname"]] = event["timestamp"]
|
|
|
|
|
|
def receive_task_received(self, event):
|
|
def receive_task_received(self, event):
|
|
- self.tasks[event["uuid"]] = event
|
|
|
|
|
|
+ task_info = dict(event)
|
|
|
|
+ event = dict(event)
|
|
|
|
+ task_info.pop("type")
|
|
|
|
+ event["state"] = event.pop("type")
|
|
|
|
+ event["when"] = self.timestamp_to_isoformat(event["timestamp"])
|
|
|
|
+ self.tasks[task_info["uuid"]] = task_info
|
|
self.task_events[event["uuid"]].append(event)
|
|
self.task_events[event["uuid"]].append(event)
|
|
|
|
|
|
def receive_worker_event(self, event):
|
|
def receive_worker_event(self, event):
|
|
@@ -47,7 +74,7 @@ class MonitorState(object):
|
|
|
|
|
|
def tasks_by_time(self):
|
|
def tasks_by_time(self):
|
|
return dict(sorted(self.task_events.items(),
|
|
return dict(sorted(self.task_events.items(),
|
|
- key=lambda (uuid, events): events[-1]["timestamp"]))
|
|
|
|
|
|
+ key=lambda uuid__events: uuid__events[1][-1]["timestamp"]))
|
|
|
|
|
|
def tasks_by_last_state(self):
|
|
def tasks_by_last_state(self):
|
|
return [events[-1] for event in self.task_by_time()]
|
|
return [events[-1] for event in self.task_by_time()]
|