Files
troupe-standup/wizard-work/spark/health_check.py
T

34 lines
1.4 KiB
Python

#!/usr/bin/env python3
"""Quick multi-URL health checker with JSON output."""
import sys, json, urllib.request, urllib.error, concurrent.futures
def check_url(url, timeout=5):
"""Check single URL, return status dict."""
try:
req = urllib.request.Request(url, method='HEAD')
with urllib.request.urlopen(req, timeout=timeout) as resp:
return {"url": url, "status": resp.status, "ok": 200 <= resp.status < 400}
except urllib.error.HTTPError as e:
return {"url": url, "status": e.code, "ok": False, "error": str(e)}
except Exception as e:
return {"url": url, "status": None, "ok": False, "error": str(e)}
def health_check(urls, parallel=True):
"""Check multiple URLs, return JSON results."""
results = []
if parallel and len(urls) > 1:
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as ex:
results = list(ex.map(check_url, urls))
else:
results = [check_url(u) for u in urls]
return {"checked": len(urls), "passed": sum(1 for r in results if r["ok"]), "results": results}
if __name__ == "__main__":
urls = sys.argv[1:] if len(sys.argv) > 1 else [
"https://httpbin.org/status/200",
"https://httpbin.org/status/404",
"https://httpbin.org/delay/1"
]
result = health_check(urls)
print(json.dumps(result, indent=2))
sys.exit(0 if result["passed"] > 0 else 1)