fix: Add data transformer to resolve metrics dashboard template mismatch

Root cause: Template expects flat structure (metrics.database.count) but
monitoring module provides nested structure (metrics.by_type.database.count)
with different field names (avg_duration_ms vs avg).

Solution: Route Adapter Pattern - transformer function maps data structure
at presentation layer.

Changes:
- Add transform_metrics_for_template() function to admin.py
- Update metrics_dashboard() route to use transformer
- Provide safe defaults for missing/empty metrics data
- Handle all operation types: database, http, render

Testing: All 32 admin route tests passing

Documentation:
- Updated implementation report with actual fix details
- Created consolidated hotfix design documentation
- Architectural review by architect (approved with minor concerns)

Technical debt: Adapter layer should be replaced with proper data
contracts in v1.2.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-25 21:24:47 -07:00
parent 2ca6ecc28f
commit d565721cdb
7 changed files with 846 additions and 34 deletions

View File

@@ -10,12 +10,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.1.1-rc.2] - 2025-11-25
### Fixed
- **CRITICAL**: Resolved route conflict causing 500 error on /admin/dashboard
- **CRITICAL**: Resolved template/data mismatch causing 500 error on metrics dashboard
- Fixed Jinja2 UndefinedError: `'dict object' has no attribute 'database'`
- Added `transform_metrics_for_template()` function to map data structure
- Transforms `metrics.by_type.database``metrics.database` for template compatibility
- Maps field names: `avg_duration_ms``avg`, `min_duration_ms``min`, etc.
- Provides safe defaults for missing/empty metrics data
- Renamed metrics dashboard route from `/admin/dashboard` to `/admin/metrics-dashboard`
- Added defensive imports to handle missing monitoring module gracefully
- All existing `url_for("admin.dashboard")` calls continue to work correctly
- Notes dashboard at `/admin/` remains unchanged and functional
- See ADR-022 for design rationale
- See ADR-022 and ADR-060 for design rationale
## [1.1.1] - 2025-11-25