feat: persist browser sessions and update admin workflows
This commit is contained in:
@@ -46,6 +46,7 @@ def _check_upstream(upstream_id: int) -> None:
|
||||
|
||||
auth_config = json.loads(upstream.auth_config_json or "{}")
|
||||
was_unhealthy = upstream.last_status == "unhealthy"
|
||||
balance_alert_triggered = False
|
||||
snapshot = None
|
||||
changes = None
|
||||
|
||||
@@ -76,6 +77,14 @@ def _check_upstream(upstream_id: int) -> None:
|
||||
if balance is not None:
|
||||
upstream.balance = balance
|
||||
upstream.balance_updated_at = datetime.now(timezone.utc)
|
||||
# ── 余额告警阈值检查 ──
|
||||
threshold = upstream.balance_alert_threshold
|
||||
if threshold is not None and threshold > 0:
|
||||
if balance < threshold and not upstream.balance_alert_notified:
|
||||
upstream.balance_alert_notified = True
|
||||
balance_alert_triggered = True
|
||||
elif balance >= threshold and upstream.balance_alert_notified:
|
||||
upstream.balance_alert_notified = False
|
||||
except Exception as exc:
|
||||
# failure path
|
||||
upstream.consecutive_failures = (upstream.consecutive_failures or 0) + 1
|
||||
@@ -152,6 +161,12 @@ def _check_upstream(upstream_id: int) -> None:
|
||||
_notify_rate_changed(upstream_id, upstream.name, upstream.base_url, changes)
|
||||
_sync_website_bindings(upstream_id, changes)
|
||||
|
||||
if balance_alert_triggered:
|
||||
_notify_balance_low(
|
||||
upstream_id, upstream.name, upstream.base_url,
|
||||
upstream.balance, upstream.balance_alert_threshold,
|
||||
)
|
||||
|
||||
|
||||
def _notify_status(
|
||||
upstream_id: int,
|
||||
@@ -184,6 +199,22 @@ def _notify_rate_changed(
|
||||
db.close()
|
||||
|
||||
|
||||
def _notify_balance_low(
|
||||
upstream_id: int,
|
||||
upstream_name: str,
|
||||
base_url: str,
|
||||
balance: float,
|
||||
threshold: float,
|
||||
) -> None:
|
||||
db = SessionLocal()
|
||||
try:
|
||||
webhook_service.send_balance_low(db, upstream_id, upstream_name, base_url, balance, threshold)
|
||||
except Exception:
|
||||
logger.exception("balance low webhook failed for upstream %s", upstream_name)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
def _sync_upstream_keys(upstream_id: int, snapshot: dict[str, Any], captured_at: datetime) -> None:
|
||||
"""上游检测成功后同步 SmartUp Key 状态(远端删除/分组删除)。"""
|
||||
db = SessionLocal()
|
||||
|
||||
Reference in New Issue
Block a user