Add 8-hour default window for legacy-meter deploy monitoring
Expose hours query param on /legacy-meter/summary and weekly-review; capture_legacy_meter_evidence.py defaults to --hours 8 (--days 7 for weekly retirement gate). Re-capture post-deploy evidence with tighter window.
This commit is contained in:
parent
674479dcc7
commit
e302ca9f59
7 changed files with 252 additions and 90 deletions
|
|
@ -1,8 +1,11 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Capture legacy-meter weekly-review payload as dated evidence JSON.
|
||||
"""Capture legacy-meter review payload as dated evidence JSON.
|
||||
|
||||
Usage:
|
||||
python scripts/capture_legacy_meter_evidence.py [--days 7] [--api-base URL] [--dry-run]
|
||||
python scripts/capture_legacy_meter_evidence.py [--hours 8] [--days N] [--api-base URL] [--dry-run]
|
||||
|
||||
Default review window is 8 hours (post-deploy monitoring). Pass --days for the
|
||||
weekly activity-core cadence (typically 7).
|
||||
|
||||
Writes:
|
||||
docs/evidence/legacy-meter-weekly-review-YYYYMMDD.json
|
||||
|
|
@ -68,23 +71,40 @@ def _retire_interfaces(base: str, keys: list[str]) -> list[dict]:
|
|||
return retired
|
||||
|
||||
|
||||
def capture(*, api_base: str, days: int, retire_keys: list[str], dry_run: bool) -> Path:
|
||||
review = _api_get(api_base, f"/legacy-meter/weekly-review?days={days}")
|
||||
def _review_query(*, days: int | None, hours: int | None) -> str:
|
||||
if days is not None:
|
||||
return f"days={days}"
|
||||
return f"hours={hours or 8}"
|
||||
|
||||
|
||||
def capture(
|
||||
*,
|
||||
api_base: str,
|
||||
days: int | None,
|
||||
hours: int | None,
|
||||
retire_keys: list[str],
|
||||
dry_run: bool,
|
||||
) -> Path:
|
||||
query = _review_query(days=days, hours=hours)
|
||||
review = _api_get(api_base, f"/legacy-meter/weekly-review?{query}")
|
||||
retired: list[dict] = []
|
||||
if retire_keys and not dry_run:
|
||||
retired = _retire_interfaces(api_base, retire_keys)
|
||||
review = _api_get(api_base, f"/legacy-meter/weekly-review?days={days}")
|
||||
review = _api_get(api_base, f"/legacy-meter/weekly-review?{query}")
|
||||
|
||||
today = datetime.date.today().strftime("%Y%m%d")
|
||||
out_path = EVIDENCE_DIR / f"legacy-meter-weekly-review-{today}.json"
|
||||
payload = {
|
||||
payload: dict = {
|
||||
"captured_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
|
||||
"api_base": api_base,
|
||||
"days": days,
|
||||
"workplan": "STATE-WP-0069",
|
||||
"workplan": "STATE-WP-0070",
|
||||
"retired_interfaces": retired,
|
||||
"weekly_review": review,
|
||||
}
|
||||
if days is not None:
|
||||
payload["days"] = days
|
||||
else:
|
||||
payload["hours"] = hours or 8
|
||||
|
||||
if dry_run:
|
||||
print(json.dumps(payload, indent=2))
|
||||
|
|
@ -94,13 +114,25 @@ def capture(*, api_base: str, days: int, retire_keys: list[str], dry_run: bool)
|
|||
out_path.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8")
|
||||
candidates = len(review.get("retirement_candidates", []))
|
||||
interfaces = len(review.get("interfaces", []))
|
||||
print(f"wrote {out_path} ({interfaces} interfaces, {candidates} retirement candidates)")
|
||||
window = query.replace("=", " ")
|
||||
print(f"wrote {out_path} ({interfaces} interfaces, {candidates} retirement candidates, {window})")
|
||||
return out_path
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--days", type=int, default=7)
|
||||
parser.add_argument(
|
||||
"--hours",
|
||||
type=int,
|
||||
default=8,
|
||||
help="Review window in hours (default: 8; used when --days is omitted)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--days",
|
||||
type=int,
|
||||
default=None,
|
||||
help="Review window in days (weekly cadence; overrides --hours)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--api-base",
|
||||
default=os.environ.get("API_BASE", "http://127.0.0.1:8000"),
|
||||
|
|
@ -118,6 +150,7 @@ def main() -> None:
|
|||
capture(
|
||||
api_base=args.api_base,
|
||||
days=args.days,
|
||||
hours=args.hours,
|
||||
retire_keys=retire_keys,
|
||||
dry_run=args.dry_run,
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue