diagnose: add debug-worker endpoint to track background worker thread status
Browse files- app/main.py +16 -1
app/main.py
CHANGED
|
@@ -56,6 +56,8 @@ app.include_router(settings_router.router, prefix="/api")
|
|
| 56 |
app.include_router(legal.router, prefix="/api")
|
| 57 |
app.include_router(projects.router, prefix="/api")
|
| 58 |
|
|
|
|
|
|
|
| 59 |
@app.on_event("startup")
|
| 60 |
async def startup_event():
|
| 61 |
logger.info("Initializing database schemas...")
|
|
@@ -70,6 +72,7 @@ async def startup_event():
|
|
| 70 |
import redis
|
| 71 |
from rq import Queue, SimpleWorker as Worker
|
| 72 |
try:
|
|
|
|
| 73 |
conn = redis.Redis.from_url(settings.REDIS_URL)
|
| 74 |
worker = Worker([Queue("default", connection=conn)], connection=conn)
|
| 75 |
# Patch signal handler installation to prevent thread errors
|
|
@@ -84,13 +87,25 @@ async def startup_event():
|
|
| 84 |
worker.death_penalty_class = ThreadSafeDeathPenalty
|
| 85 |
|
| 86 |
logger.info("Starting RQ background worker...")
|
|
|
|
| 87 |
worker.work(with_scheduler=True)
|
| 88 |
except Exception as e:
|
|
|
|
|
|
|
| 89 |
logger.error(f"Failed to start RQ background worker: {e}")
|
| 90 |
|
| 91 |
-
threading.Thread(target=start_worker, daemon=True).start()
|
| 92 |
logger.info("Background worker thread started. Ready for requests.")
|
| 93 |
|
| 94 |
@app.get("/")
|
| 95 |
def read_root():
|
| 96 |
return {"status": "online", "app": settings.APP_NAME, "version": settings.API_VERSION}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
app.include_router(legal.router, prefix="/api")
|
| 57 |
app.include_router(projects.router, prefix="/api")
|
| 58 |
|
| 59 |
+
worker_status = {"status": "not_started", "error": None}
|
| 60 |
+
|
| 61 |
@app.on_event("startup")
|
| 62 |
async def startup_event():
|
| 63 |
logger.info("Initializing database schemas...")
|
|
|
|
| 72 |
import redis
|
| 73 |
from rq import Queue, SimpleWorker as Worker
|
| 74 |
try:
|
| 75 |
+
worker_status["status"] = "starting"
|
| 76 |
conn = redis.Redis.from_url(settings.REDIS_URL)
|
| 77 |
worker = Worker([Queue("default", connection=conn)], connection=conn)
|
| 78 |
# Patch signal handler installation to prevent thread errors
|
|
|
|
| 87 |
worker.death_penalty_class = ThreadSafeDeathPenalty
|
| 88 |
|
| 89 |
logger.info("Starting RQ background worker...")
|
| 90 |
+
worker_status["status"] = "running"
|
| 91 |
worker.work(with_scheduler=True)
|
| 92 |
except Exception as e:
|
| 93 |
+
worker_status["status"] = "failed"
|
| 94 |
+
worker_status["error"] = str(e)
|
| 95 |
logger.error(f"Failed to start RQ background worker: {e}")
|
| 96 |
|
| 97 |
+
threading.Thread(target=start_worker, name="RQ-Worker-Thread", daemon=True).start()
|
| 98 |
logger.info("Background worker thread started. Ready for requests.")
|
| 99 |
|
| 100 |
@app.get("/")
|
| 101 |
def read_root():
|
| 102 |
return {"status": "online", "app": settings.APP_NAME, "version": settings.API_VERSION}
|
| 103 |
+
|
| 104 |
+
@app.get("/api/debug-worker")
|
| 105 |
+
def debug_worker():
|
| 106 |
+
import threading
|
| 107 |
+
active_threads = [t.name for t in threading.enumerate()]
|
| 108 |
+
return {
|
| 109 |
+
"worker_status": worker_status,
|
| 110 |
+
"active_threads": active_threads
|
| 111 |
+
}
|