|
12 | 12 | DASHBOARD_PATH = "/__codex_fast_proxy/dashboard" |
13 | 13 | DASHBOARD_EVENT_LIMIT = 8 |
14 | 14 | BENCHMARK_FILENAME = "fast_proxy.benchmark.json" |
| 15 | +EVENT_DETAIL_FIELDS = ( |
| 16 | + "ts", |
| 17 | + "request_id", |
| 18 | + "method", |
| 19 | + "path", |
| 20 | + "status", |
| 21 | + "duration_ms", |
| 22 | + "eligible", |
| 23 | + "service_tier_before", |
| 24 | + "service_tier_after", |
| 25 | + "service_tier_injected", |
| 26 | + "stream", |
| 27 | + "json_error", |
| 28 | + "response_content_type", |
| 29 | + "error_type", |
| 30 | +) |
15 | 31 |
|
16 | 32 |
|
17 | 33 | def safe_url_display(url: str) -> str: |
@@ -512,7 +528,7 @@ def render_dashboard(server: Any) -> str: |
512 | 528 | <h2>Recent requests</h2> |
513 | 529 | <p>pid {html_value(os.getpid())} / injected {injected_count}</p> |
514 | 530 | </div> |
515 | | - {render_status_badge(last_status)} |
| 531 | + {render_status_badge(last_status, event_detail(latest_event))} |
516 | 532 | </div> |
517 | 533 | <div class="table-wrap"> |
518 | 534 | <table> |
@@ -600,17 +616,30 @@ def render_injection_state(event: dict[str, Any] | None) -> str: |
600 | 616 | return "yes" if event.get("service_tier_injected") else "no" |
601 | 617 |
|
602 | 618 |
|
603 | | -def render_status_badge(status: Any) -> str: |
| 619 | +def event_detail(event: dict[str, Any] | None) -> str | None: |
| 620 | + if not event: |
| 621 | + return None |
| 622 | + |
| 623 | + lines = [] |
| 624 | + for field in EVENT_DETAIL_FIELDS: |
| 625 | + value = event.get(field) |
| 626 | + if value is not None: |
| 627 | + lines.append(f"{field}: {value}") |
| 628 | + return "\n".join(lines) if lines else None |
| 629 | + |
| 630 | + |
| 631 | +def render_status_badge(status: Any, detail: str | None = None) -> str: |
| 632 | + title = f' title="{html_value(detail, "")}"' if detail else "" |
604 | 633 | if status is None: |
605 | | - return '<span class="badge"><span class="dot warn" aria-hidden="true"></span>No events</span>' |
| 634 | + return f'<span class="badge"{title}><span class="dot warn" aria-hidden="true"></span>No events</span>' |
606 | 635 | try: |
607 | 636 | status_code = int(status) |
608 | 637 | except (TypeError, ValueError): |
609 | | - return f'<span class="badge"><span class="dot warn" aria-hidden="true"></span>{html_value(status)}</span>' |
| 638 | + return f'<span class="badge"{title}><span class="dot warn" aria-hidden="true"></span>{html_value(status)}</span>' |
610 | 639 |
|
611 | 640 | dot_class = "bad" if status_code >= 400 else "" |
612 | 641 | label = "Needs attention" if status_code >= 400 else "Healthy" |
613 | | - return f'<span class="badge"><span class="dot {dot_class}" aria-hidden="true"></span>{label}</span>' |
| 642 | + return f'<span class="badge"{title}><span class="dot {dot_class}" aria-hidden="true"></span>{label}</span>' |
614 | 643 |
|
615 | 644 |
|
616 | 645 | def benchmark_fast_label(benchmark: dict[str, Any]) -> str: |
@@ -726,7 +755,7 @@ def render_event_row(event: dict[str, Any]) -> str: |
726 | 755 | "<tr>" |
727 | 756 | f"<td>{render_time_value(event.get('ts'))}</td>" |
728 | 757 | f"<td class=\"path\" title=\"{html_value(event.get('path'), '')}\">{html_value(event.get('method'))} {html_value(event.get('path'))}</td>" |
729 | | - f"<td>{render_status_badge(status)}</td>" |
| 758 | + f"<td>{render_status_badge(status, event_detail(event))}</td>" |
730 | 759 | f"<td>{html_value(format_duration(event.get('duration_ms')))}</td>" |
731 | 760 | f"<td>{render_tier_change(event)}</td>" |
732 | 761 | f"<td>{render_boolean_badge(injected)}</td>" |
|
0 commit comments