Spaces:
Paused
Paused
Expose workload traceback in Space health endpoint
Browse files- 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
|
| 18 |
-
child = subprocess.Popen(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|