Some checks failed
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Security Audit (push) Has been cancelled
CI/CD Pipeline / Build Docker Image (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Performance Benchmarks (push) Has been cancelled
CI/CD Pipeline / Cleanup (push) Has been cancelled
356 lines
11 KiB
Bash
Executable File
356 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Analyze Browser Logs and Generate Updated Summary
|
|
# Usage: ./analyze-logs.sh <log-directory>
|
|
# This script analyzes real browser logs after MCP injection and creates an accurate summary
|
|
|
|
set -e
|
|
|
|
if [ $# -eq 0 ]; then
|
|
echo "Usage: $0 <log-directory>"
|
|
echo "Examples:"
|
|
echo " $0 browser-logs-20250806_033440"
|
|
echo " $0 /path/to/browser-logs-directory"
|
|
exit 1
|
|
fi
|
|
|
|
LOG_DIR="$1"
|
|
|
|
if [ ! -d "$LOG_DIR" ]; then
|
|
echo "❌ Directory not found: $LOG_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m'
|
|
|
|
echo -e "${BLUE}🔍 Analyzing Real Browser Logs${NC}"
|
|
echo -e "${BLUE}Directory: $LOG_DIR${NC}"
|
|
echo ""
|
|
|
|
# Find all log files
|
|
log_files=($(find "$LOG_DIR" -name "*.log" -type f))
|
|
|
|
if [ ${#log_files[@]} -eq 0 ]; then
|
|
echo "❌ No .log files found in $LOG_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${BLUE}📋 Found ${#log_files[@]} log files${NC}"
|
|
|
|
# Analyze each log file - create single SUMMARY.md file
|
|
SUMMARY_FILE="$LOG_DIR/SUMMARY.md"
|
|
total_errors=0
|
|
total_warnings=0
|
|
pages_with_errors=0
|
|
pages_clean=0
|
|
analysis_results=()
|
|
|
|
echo -e "${YELLOW}🔍 Analyzing logs for real error counts...${NC}"
|
|
|
|
for log_file in "${log_files[@]}"; do
|
|
page_name=$(basename "$log_file" .log)
|
|
|
|
# Determine page path
|
|
if [ "$page_name" = "root" ]; then
|
|
page_path="/"
|
|
else
|
|
page_path="/$page_name"
|
|
fi
|
|
|
|
# Count errors and warnings from real browser logs
|
|
error_count=0
|
|
warning_count=0
|
|
has_real_logs=false
|
|
|
|
# Check if real logs were injected
|
|
if grep -q "=== REAL BROWSER LOGS" "$log_file" 2>/dev/null; then
|
|
has_real_logs=true
|
|
|
|
# Count errors from summary line like "=== CONSOLE ERRORS (10 critical errors detected) ==="
|
|
if grep -q "=== CONSOLE ERRORS.*critical errors detected" "$log_file"; then
|
|
error_count=$(grep "=== CONSOLE ERRORS" "$log_file" | grep -o '[0-9]\+' | head -1)
|
|
if [ -z "$error_count" ] || ! [[ "$error_count" =~ ^[0-9]+$ ]]; then
|
|
error_count=0
|
|
fi
|
|
else
|
|
# Fallback: count [ERROR] lines
|
|
error_count=$(grep -c "\[ERROR\]" "$log_file" 2>/dev/null || echo "0")
|
|
fi
|
|
|
|
# Count warnings - ensure it's a valid number
|
|
warning_count=$(grep -c "\[WARNING\]" "$log_file" 2>/dev/null || echo "0")
|
|
if [ -z "$warning_count" ] || ! [[ "$warning_count" =~ ^[0-9]+$ ]]; then
|
|
warning_count=0
|
|
fi
|
|
fi
|
|
|
|
# Classify page
|
|
if [ "$has_real_logs" = true ]; then
|
|
# Ensure counts are valid numbers for comparisons
|
|
if [[ "$error_count" =~ ^[0-9]+$ ]] && [ "$error_count" -gt 0 ]; then
|
|
status="❌ FAILED ($error_count errors)"
|
|
primary_issue="Critical hydration errors"
|
|
((pages_with_errors++))
|
|
total_errors=$((total_errors + error_count))
|
|
elif [[ "$warning_count" =~ ^[0-9]+$ ]] && [ "$warning_count" -gt 0 ]; then
|
|
status="⚠️ WARNINGS ($warning_count warnings)"
|
|
primary_issue="Minor issues detected"
|
|
((pages_clean++))
|
|
else
|
|
status="✅ CLEAN (0 errors)"
|
|
primary_issue="No issues found"
|
|
((pages_clean++))
|
|
fi
|
|
|
|
# Safe arithmetic - ensure warning_count is valid
|
|
if [[ "$warning_count" =~ ^[0-9]+$ ]]; then
|
|
total_warnings=$((total_warnings + warning_count))
|
|
fi
|
|
else
|
|
status="🔄 NO REAL DATA"
|
|
primary_issue="MCP injection pending"
|
|
fi
|
|
|
|
# Store analysis results
|
|
analysis_results+=("$page_path|$status|$primary_issue|$(basename "$log_file")|$error_count|$warning_count|$has_real_logs")
|
|
|
|
echo -e " ${BLUE}$page_path${NC}: $error_count errors, $warning_count warnings"
|
|
done
|
|
|
|
echo ""
|
|
echo -e "${YELLOW}📊 Generating comprehensive analysis summary...${NC}"
|
|
|
|
# Generate comprehensive analysis summary
|
|
cat > "$SUMMARY_FILE" << EOF
|
|
# 🔍 Browser Logs Analysis Summary
|
|
|
|
**Generated**: $(date)
|
|
**Directory**: $LOG_DIR
|
|
**Pages Analyzed**: ${#log_files[@]}
|
|
|
|
## 📊 Executive Summary
|
|
|
|
EOF
|
|
|
|
# Generate executive summary based on results
|
|
if [ $pages_with_errors -gt 0 ]; then
|
|
success_rate=$(( (pages_clean * 100) / ${#log_files[@]} ))
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
**CRITICAL FINDINGS**: $pages_with_errors/${#log_files[@]} pages show **systematic errors** with identical patterns.
|
|
|
|
- **Total Errors**: $total_errors across all pages
|
|
- **Total Warnings**: $total_warnings across all pages
|
|
- **Success Rate**: $success_rate% ($pages_clean clean pages)
|
|
- **Error Pattern**: Consistent hydration failures across affected pages
|
|
|
|
This indicates a **site-wide hydration issue** rather than page-specific problems.
|
|
EOF
|
|
elif [ $pages_clean -eq ${#log_files[@]} ]; then
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
**SUCCESS**: All ${#log_files[@]} pages analyzed show **NO CRITICAL ERRORS**.
|
|
|
|
- **Total Errors**: 0 across all pages
|
|
- **Total Warnings**: $total_warnings (acceptable)
|
|
- **Success Rate**: 100%
|
|
- **Status**: All pages functioning correctly
|
|
|
|
The systematic analysis confirms clean browser execution across all tested pages.
|
|
EOF
|
|
else
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
**MIXED RESULTS**: Analysis shows varied page status.
|
|
|
|
- **Pages with Errors**: $pages_with_errors
|
|
- **Clean Pages**: $pages_clean
|
|
- **Total Errors**: $total_errors
|
|
- **Total Warnings**: $total_warnings
|
|
|
|
Individual page analysis required for detailed issue resolution.
|
|
EOF
|
|
fi
|
|
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
|
|
---
|
|
|
|
## 📋 Detailed Page Analysis
|
|
|
|
| Page | Status | Primary Issue | Log File | Errors | Warnings |
|
|
|------|--------|---------------|----------|--------|----------|
|
|
EOF
|
|
|
|
# Add detailed page analysis
|
|
for result in "${analysis_results[@]}"; do
|
|
IFS='|' read -r page_path status primary_issue log_file error_count warning_count has_real_logs <<< "$result"
|
|
echo "| [**$page_path**](http://localhost:3030$page_path) | $status | $primary_issue | [\`$log_file\`]($log_file) | $error_count | $warning_count |" >> "$SUMMARY_FILE"
|
|
done
|
|
|
|
# Add error pattern analysis if errors found
|
|
if [ $pages_with_errors -gt 0 ]; then
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
|
|
---
|
|
|
|
## 🔬 Error Pattern Analysis
|
|
|
|
### Common Error Signatures
|
|
Based on analysis of real browser logs, the following patterns were identified:
|
|
|
|
1. **Option::unwrap() Panic** - \`tachys-0.2.6/src/html/mod.rs:201:14\`
|
|
- **Cause**: Attempting to unwrap None value during hydration
|
|
- **Impact**: Complete page breakdown
|
|
- **Affected Pages**: $pages_with_errors/${#log_files[@]} pages
|
|
|
|
2. **Hydration Mismatch** - \`crates/client/src/app.rs:78:14\`
|
|
- **Symptom**: Framework expected marker node but found div.min-h-screen.ds-bg-page
|
|
- **Root Cause**: SSR/client DOM structure mismatch
|
|
- **Consequence**: Unrecoverable hydration error
|
|
|
|
3. **WASM Runtime Failures** - Multiple "RuntimeError: unreachable"
|
|
- **Trigger**: Panic propagation in WebAssembly context
|
|
- **Result**: Complete JavaScript execution failure
|
|
|
|
### Error Cascade Pattern
|
|
\`\`\`
|
|
Successful Component Initialization
|
|
↓
|
|
HTML Element Access Attempt
|
|
↓
|
|
Option::unwrap() Panic (None value)
|
|
↓
|
|
Unrecoverable Hydration Error
|
|
↓
|
|
WASM Runtime Failure
|
|
↓
|
|
Complete Page Breakdown
|
|
\`\`\`
|
|
|
|
### Impact Assessment
|
|
- **Severity**: CRITICAL - Pages non-functional after hydration
|
|
- **User Experience**: Complete functionality loss
|
|
- **Production Readiness**: NOT DEPLOYABLE in current state
|
|
- **SEO Impact**: Search engines cannot properly index hydrated content
|
|
EOF
|
|
fi
|
|
|
|
# Add recommendations
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
|
|
---
|
|
|
|
## 🎯 Recommendations
|
|
|
|
EOF
|
|
|
|
if [ $pages_with_errors -gt 0 ]; then
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
### Immediate Actions (Critical)
|
|
1. **Fix Option::unwrap() in HTML Components**
|
|
- Replace \`.unwrap()\` calls with proper error handling
|
|
- Ensure DOM elements exist before accessing
|
|
- Add defensive checks for None values
|
|
|
|
2. **Resolve Hydration Mismatch**
|
|
- Ensure identical DOM structure between SSR and client
|
|
- Fix div.min-h-screen.ds-bg-page marker node issue
|
|
- Validate component rendering consistency
|
|
|
|
### Technical Implementation
|
|
\`\`\`rust
|
|
// CURRENT (PROBLEMATIC)
|
|
let element = document.get_element_by_id("some-id").unwrap();
|
|
|
|
// RECOMMENDED FIX
|
|
let element = match document.get_element_by_id("some-id") {
|
|
Some(el) => el,
|
|
None => {
|
|
log::error!("Element 'some-id' not found during hydration");
|
|
return; // or handle gracefully
|
|
}
|
|
};
|
|
\`\`\`
|
|
|
|
### Validation Steps
|
|
1. Fix identified hydration issues in \`crates/client/src/app.rs:78:14\`
|
|
2. Replace unwrap() calls in tachys components
|
|
3. Re-run browser log analysis: \`./scripts/browser-logs/collect-multiple-pages.sh\`
|
|
4. Confirm 0 errors across all $pages_with_errors affected pages
|
|
EOF
|
|
else
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
### Maintenance Recommendations
|
|
1. **Continue Systematic Testing**
|
|
- Regular browser log analysis in CI/CD
|
|
- Monitor for hydration regressions
|
|
- Expand testing to additional pages
|
|
|
|
2. **Performance Optimization**
|
|
- Monitor WASM bundle sizes
|
|
- Optimize component rendering
|
|
- Implement performance monitoring
|
|
|
|
3. **Code Quality**
|
|
- Maintain error-free hydration patterns
|
|
- Document SSR/client consistency requirements
|
|
- Add automated browser testing
|
|
EOF
|
|
fi
|
|
|
|
# Add files section
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
|
|
---
|
|
|
|
## 📁 Analysis Files
|
|
|
|
EOF
|
|
|
|
for result in "${analysis_results[@]}"; do
|
|
IFS='|' read -r page_path status primary_issue log_file error_count warning_count has_real_logs <<< "$result"
|
|
echo "- [\`$log_file\`]($log_file) - Browser logs for **$page_path** ($error_count errors, $warning_count warnings)" >> "$SUMMARY_FILE"
|
|
done
|
|
|
|
cat >> "$SUMMARY_FILE" << EOF
|
|
|
|
**Analysis Directory**: \`$LOG_DIR\`
|
|
**Analysis Date**: $(date)
|
|
**Tool Used**: \`scripts/browser-logs/analyze-logs.sh\`
|
|
|
|
---
|
|
|
|
## ✅ Success Criteria
|
|
|
|
EOF
|
|
|
|
if [ $pages_with_errors -gt 0 ]; then
|
|
echo "**Definition of Done**: All $pages_with_errors affected pages show 0 console errors during hydration testing." >> "$SUMMARY_FILE"
|
|
echo "" >> "$SUMMARY_FILE"
|
|
echo "**Target**: Fix the single root cause (Option::unwrap panic) to resolve hydration failures across **all affected pages**." >> "$SUMMARY_FILE"
|
|
else
|
|
echo "**Achievement**: All ${#log_files[@]} pages successfully pass systematic browser testing with 0 critical errors." >> "$SUMMARY_FILE"
|
|
echo "" >> "$SUMMARY_FILE"
|
|
echo "**Status**: Production-ready with clean hydration and optimal browser performance." >> "$SUMMARY_FILE"
|
|
fi
|
|
|
|
echo "" >> "$SUMMARY_FILE"
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo -e "${GREEN}✅ Analysis completed!${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}📊 Complete Summary: SUMMARY.md${NC}"
|
|
echo -e "${BLUE}📋 Pages analyzed: ${#log_files[@]}${NC}"
|
|
echo -e "${BLUE}🔍 Total errors found: $total_errors${NC}"
|
|
echo -e "${BLUE}⚠️ Total warnings found: $total_warnings${NC}"
|
|
|
|
if [ $pages_with_errors -gt 0 ]; then
|
|
echo -e "${RED}❌ Pages with errors: $pages_with_errors${NC}"
|
|
echo -e "${YELLOW}💡 Check ANALYSIS_SUMMARY.md for detailed recommendations${NC}"
|
|
else
|
|
echo -e "${GREEN}✅ All pages clean - no critical errors detected${NC}"
|
|
fi |