Jibbalit commited on
Commit
27bd556
·
1 Parent(s): 2239421

Expose workload traceback in Space health endpoint

Browse files
Files changed (1) hide show
  1. space_runner.py +23 -3
space_runner.py CHANGED
@@ -5,6 +5,7 @@ import signal
5
  import subprocess
6
  import sys
7
  import threading
 
8
  from http.server import BaseHTTPRequestHandler, HTTPServer
9
 
10
 
@@ -14,8 +15,16 @@ def main():
14
  print("No command provided to space_runner.py", flush=True)
15
  sys.exit(2)
16
 
17
- # Start the long-running workload and forward logs to container stdout/stderr.
18
- child = subprocess.Popen(cmd)
 
 
 
 
 
 
 
 
19
 
20
  state = {
21
  "status": "running",
@@ -24,9 +33,17 @@ def main():
24
  "command": cmd,
25
  }
26
 
 
 
 
 
 
 
 
 
27
  class Handler(BaseHTTPRequestHandler):
28
  def do_GET(self):
29
- payload = json.dumps(state).encode("utf-8")
30
  self.send_response(200)
31
  self.send_header("Content-Type", "application/json")
32
  self.send_header("Content-Length", str(len(payload)))
@@ -38,6 +55,9 @@ def main():
38
 
39
  server = HTTPServer(("0.0.0.0", int(os.environ.get("PORT", "7860"))), Handler)
40
 
 
 
 
41
  def wait_child():
42
  rc = child.wait()
43
  state["returncode"] = rc
 
5
  import subprocess
6
  import sys
7
  import threading
8
+ from collections import deque
9
  from http.server import BaseHTTPRequestHandler, HTTPServer
10
 
11
 
 
15
  print("No command provided to space_runner.py", flush=True)
16
  sys.exit(2)
17
 
18
+ # Start workload with captured output so we can expose failure tracebacks.
19
+ child = subprocess.Popen(
20
+ cmd,
21
+ stdout=subprocess.PIPE,
22
+ stderr=subprocess.STDOUT,
23
+ text=True,
24
+ bufsize=1,
25
+ )
26
+
27
+ recent_logs = deque(maxlen=400)
28
 
29
  state = {
30
  "status": "running",
 
33
  "command": cmd,
34
  }
35
 
36
+ def stream_output():
37
+ if child.stdout is None:
38
+ return
39
+ for line in child.stdout:
40
+ line = line.rstrip("\n")
41
+ recent_logs.append(line)
42
+ print(line, flush=True)
43
+
44
  class Handler(BaseHTTPRequestHandler):
45
  def do_GET(self):
46
+ payload = json.dumps({**state, "recent_logs": list(recent_logs)}).encode("utf-8")
47
  self.send_response(200)
48
  self.send_header("Content-Type", "application/json")
49
  self.send_header("Content-Length", str(len(payload)))
 
55
 
56
  server = HTTPServer(("0.0.0.0", int(os.environ.get("PORT", "7860"))), Handler)
57
 
58
+ log_thread = threading.Thread(target=stream_output, daemon=True)
59
+ log_thread.start()
60
+
61
  def wait_child():
62
  rc = child.wait()
63
  state["returncode"] = rc