Rustelo/scripts/testing/browser/analyze-logs.sh
Jesús Pérez 7cab57b645
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
chore: update layout and files
2026-02-08 20:18:46 +00:00

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