fix: preserve previous perf metrics when MongoDB unavailable; fix delete ID parsing

- update_readme_metrics.py: fall back to existing README values instead of
  overwriting with "N/A (MongoDB not connected)" when metrics are unavailable
- measure_perf.py: fix uploaded_id extraction — ParsedForm.id is top-level,
  not nested under a "form" key, so delete timing now actually runs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
vee1e 2026-06-02 15:09:37 +05:30
parent d3190c78b9
commit efe14f67a2
No known key found for this signature in database
GPG key ID: EB498AFC60A7A01A
2 changed files with 47 additions and 17 deletions

View file

@ -112,10 +112,10 @@ def main():
results["upload"] = m results["upload"] = m
log(f"Upload: {m}") log(f"Upload: {m}")
data = resp.json() data = resp.json()
for item in (data if isinstance(data, list) else []): for item in (data if isinstance(data, list) else [data]):
form = item.get("form") if isinstance(item, dict) else None if isinstance(item, dict):
if form: uploaded_id = item.get("id") or item.get("_id")
uploaded_id = form.get("id") or form.get("_id") if uploaded_id:
break break
else: else:
log(f"Upload returned {resp.status_code} skipping (MongoDB not connected?)") log(f"Upload returned {resp.status_code} skipping (MongoDB not connected?)")

View file

@ -15,20 +15,38 @@ README_FILE = os.path.join(ROOT, "README.md")
def fmt_range(m): def fmt_range(m):
"""Format a min/max/avg dict into a readable string.""" """Format a min/max/avg dict into a readable string, or None if unavailable."""
if m is None: if m is None:
return "N/A (MongoDB not connected)" return None
lo, hi = m["min_ms"], m["max_ms"] lo, hi = m["min_ms"], m["max_ms"]
return f"{lo:.0f}{hi:.0f}ms ({lo/1000:.3f}{hi/1000:.3f}s)" return f"{lo:.0f}{hi:.0f}ms ({lo/1000:.3f}{hi/1000:.3f}s)"
def fmt_per(ms): def fmt_per(ms):
if ms is None: if ms is None:
return "N/A (MongoDB not connected)" return None
return f"{ms:.3f}ms per item" return f"{ms:.3f}ms per item"
def build_table(r, updated_at): def parse_existing_table(content):
"""Extract previous metric values from the README table by label."""
existing = {}
marker_pattern = re.compile(
r"<!-- PERF_TABLE_START -->.*?<!-- PERF_TABLE_END -->",
re.DOTALL,
)
match = marker_pattern.search(content)
if not match:
return existing
row_pattern = re.compile(r"\|\s*(\*\*[^|]+\*\*)\s*\|\s*([^|]+)\s*\|")
for m in row_pattern.finditer(match.group(0)):
label = m.group(1).strip()
value = m.group(2).strip()
existing[label] = value
return existing
def build_table(r, updated_at, existing=None):
v = r.get("validation") v = r.get("validation")
p = r.get("parsing") p = r.get("parsing")
u = r.get("upload") u = r.get("upload")
@ -39,14 +57,24 @@ def build_table(r, updated_at):
cold_str = f"{cs:.0f}ms" if cs is not None else "N/A" cold_str = f"{cs:.0f}ms" if cs is not None else "N/A"
def keep_prev(label, value):
"""Return value if measured, otherwise the previous README value."""
if value is not None:
return value
if existing:
prev = existing.get(label, "")
if prev and "MongoDB not connected" not in prev and prev != "N/A":
return prev
return "N/A"
rows = [ rows = [
("**File Validation**", fmt_range(v)), ("**File Validation**", keep_prev("**File Validation**", fmt_range(v))),
("**Form Parsing**", fmt_range(p)), ("**Form Parsing**", keep_prev("**Form Parsing**", fmt_range(p))),
("**Form Upload**", fmt_range(u)), ("**Form Upload**", keep_prev("**Form Upload**", fmt_range(u))),
("**Question Processing**", fmt_per(pq)), ("**Question Processing**", keep_prev("**Question Processing**", fmt_per(pq))),
("**Option Processing**", fmt_per(po)), ("**Option Processing**", keep_prev("**Option Processing**", fmt_per(po))),
("**Batch Processing**", fmt_range(u)), ("**Batch Processing**", keep_prev("**Batch Processing**", fmt_range(u))),
("**Delete Operations**", fmt_range(d)), ("**Delete Operations**", keep_prev("**Delete Operations**", fmt_range(d))),
("**Cold Start Time**", cold_str), ("**Cold Start Time**", cold_str),
] ]
@ -74,11 +102,13 @@ def main():
results = json.load(f) results = json.load(f)
updated_at = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M") updated_at = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M")
new_table = build_table(results, updated_at)
with open(README_FILE) as f: with open(README_FILE) as f:
content = f.read() content = f.read()
existing = parse_existing_table(content)
new_table = build_table(results, updated_at, existing=existing)
# Replace between markers if they exist, otherwise replace the whole table # Replace between markers if they exist, otherwise replace the whole table
marker_pattern = re.compile( marker_pattern = re.compile(
r"<!-- PERF_TABLE_START -->.*?<!-- PERF_TABLE_END -->", r"<!-- PERF_TABLE_START -->.*?<!-- PERF_TABLE_END -->",