Release v4928.1.4.2 stable
This commit is contained in:
82
scripts/check_clientflow_health.py
Executable file
82
scripts/check_clientflow_health.py
Executable file
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Operational health check for ClientFlow deployments."""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(PROJECT_ROOT))
|
||||
os.chdir(PROJECT_ROOT)
|
||||
from sqlalchemy import text
|
||||
|
||||
from app.config import settings
|
||||
from app.db import engine
|
||||
|
||||
|
||||
def scalar(sql: str, **params):
|
||||
with engine.begin() as conn:
|
||||
return conn.execute(text(sql), params).scalar()
|
||||
|
||||
|
||||
def rows(sql: str, **params):
|
||||
with engine.begin() as conn:
|
||||
return [dict(r) for r in conn.execute(text(sql), params).mappings().all()]
|
||||
|
||||
|
||||
def main() -> int:
|
||||
result = {
|
||||
"app": settings.app_name,
|
||||
"env": settings.env,
|
||||
"database_ok": False,
|
||||
"jasmin_enabled": bool(settings.jasmin_enabled),
|
||||
"packlink_enabled": bool(settings.packlink_enabled),
|
||||
"outbox": {},
|
||||
"documents": {},
|
||||
"warnings": [],
|
||||
}
|
||||
|
||||
try:
|
||||
result["database_ok"] = bool(scalar("SELECT 1"))
|
||||
except Exception as exc:
|
||||
result["warnings"].append(f"database_error: {exc}")
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
|
||||
return 2
|
||||
|
||||
for row in rows("""
|
||||
SELECT target_system, status, count(*)::int AS total
|
||||
FROM integration_outbox
|
||||
GROUP BY target_system, status
|
||||
ORDER BY target_system, status
|
||||
"""):
|
||||
result["outbox"].setdefault(row["target_system"], {})[row["status"]] = row["total"]
|
||||
|
||||
for row in rows("""
|
||||
SELECT document_kind, status, count(*)::int AS total
|
||||
FROM commercial_documents
|
||||
GROUP BY document_kind, status
|
||||
ORDER BY document_kind, status
|
||||
"""):
|
||||
result["documents"].setdefault(row["document_kind"], {})[row["status"]] = row["total"]
|
||||
|
||||
missing_jasmin = scalar("""
|
||||
SELECT count(*)
|
||||
FROM products
|
||||
WHERE active = TRUE
|
||||
AND (jasmin_sales_item IS NULL OR jasmin_sales_item = '')
|
||||
""")
|
||||
if missing_jasmin:
|
||||
result["warnings"].append(f"active_products_without_jasmin_sales_item={missing_jasmin}")
|
||||
|
||||
failed_outbox = scalar("SELECT count(*) FROM integration_outbox WHERE status = 'failed'")
|
||||
if failed_outbox:
|
||||
result["warnings"].append(f"failed_outbox_items={failed_outbox}")
|
||||
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
|
||||
return 1 if result["warnings"] else 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user