feat: show channel monitor health
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import contextlib
|
||||
import io
|
||||
from pathlib import Path
|
||||
import importlib.util
|
||||
import sys
|
||||
@@ -134,6 +136,77 @@ class Sub2APIQuotaTUITests(unittest.TestCase):
|
||||
|
||||
self.assertEqual([row["name"] for row in rows], ["sfast", "fast", "slow", "manual"])
|
||||
|
||||
def test_monitor_summary_and_account_match(self) -> None:
|
||||
mod = load_module()
|
||||
status_payload = {
|
||||
"channel_monitors": {
|
||||
"enabled": 6,
|
||||
"latest_ok": 5,
|
||||
"latest_failed": 0,
|
||||
"latest_unknown": 1,
|
||||
"latest_checked_max": "2026-06-09 15:07:40+08:00",
|
||||
"items": [
|
||||
{
|
||||
"name": "input responses",
|
||||
"provider": "openai",
|
||||
"enabled": True,
|
||||
"primary_model": "gpt-5.5",
|
||||
"latest_status": "operational",
|
||||
"latency_ms": 2606,
|
||||
"checked_at": "2026-06-09 15:03:28+08:00",
|
||||
"message": "",
|
||||
},
|
||||
{
|
||||
"name": "kedaya responses",
|
||||
"provider": "openai",
|
||||
"enabled": True,
|
||||
"primary_model": "gpt-5.5",
|
||||
"latest_status": "degraded",
|
||||
"latency_ms": 25923,
|
||||
"checked_at": "2026-06-09 15:07:40+08:00",
|
||||
"message": "slow response: 25923ms",
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
row = {"name": "input 300"}
|
||||
|
||||
self.assertIn("monitors 5 ok / 0 failed / 1 unknown", mod.monitor_summary(status_payload))
|
||||
self.assertIn("monitor operational 2606ms", mod.monitor_detail(row, status_payload))
|
||||
|
||||
def test_monitor_error_is_non_blocking_in_once_output(self) -> None:
|
||||
mod = load_module()
|
||||
payload = {
|
||||
"generated_at": "2026-06-09T12:00:00+08:00",
|
||||
"totals": {"total_accounts": 1, "usable_accounts": 1, "today_cost_usd": 0, "today_tokens": 0, "today_requests": 0},
|
||||
"accounts": [
|
||||
{"id": 1, "name": "alpha", "routing_group": "slow", "provider": "openai", "kind": "pay_as_you_go", "status": "ok"}
|
||||
],
|
||||
}
|
||||
out = io.StringIO()
|
||||
|
||||
with contextlib.redirect_stdout(out):
|
||||
mod.print_once(payload, status_error="timeout")
|
||||
|
||||
text = out.getvalue()
|
||||
self.assertIn("monitors error: timeout", text)
|
||||
self.assertIn("alpha", text)
|
||||
|
||||
def test_once_output_includes_monitor_summary(self) -> None:
|
||||
mod = load_module()
|
||||
payload = {
|
||||
"generated_at": "2026-06-09T12:00:00+08:00",
|
||||
"totals": {"total_accounts": 0, "usable_accounts": 0, "today_cost_usd": 0, "today_tokens": 0, "today_requests": 0},
|
||||
"accounts": [],
|
||||
}
|
||||
status_payload = {"channel_monitors": {"enabled": 1, "latest_ok": 1, "latest_failed": 0, "latest_unknown": 0}}
|
||||
out = io.StringIO()
|
||||
|
||||
with contextlib.redirect_stdout(out):
|
||||
mod.print_once(payload, status_payload=status_payload)
|
||||
|
||||
self.assertIn("monitors 1 ok / 0 failed / 0 unknown", out.getvalue())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user