Usage Tracking Debug Report¶
Problem¶
MySQL database tables remain empty - no usage tracking data is being recorded from Kubernetes deployment.
Investigation Results¶
Configuration ✅¶
Kubernetes ConfigMap (deployment/k8s_templates/mbasic-configmap.yaml):
"usage_tracking": {
"enabled": true,
"mysql": {
"host": "${MYSQL_HOST}",
"port": 3306,
"user": "${MYSQL_USER}",
"password": "${MYSQL_PASSWORD}",
"database": "mbasic_logs",
"disable_ssl": true
}
}
Environment Variables ✅¶
Deployment (deployment/k8s_templates/mbasic-deployment.yaml):
- MYSQL_HOST - from secrets
- MYSQL_USER - from secrets
- MYSQL_PASSWORD - from secrets
✅ Environment variables properly configured from Kubernetes secrets
Dependencies ✅¶
requirements.txt:
✅ MySQL connector is installed in Docker imageCode Integration ✅¶
Web backend (src/ui/web/nicegui_backend.py):
- Line 3811-3818: Initializes UsageTracker from config
- Line 3852-3862: Tracks IDE session start
- Line 1187: Tracks program execution
✅ Tracking code is integrated
Usage Tracker Implementation ✅¶
src/usage_tracker.py:
- Implements all tracking methods
- Has error handling with logging
- Connects to MySQL on initialization
✅ Implementation looks correct
Suspected Issues¶
1. Silent Failures¶
The usage tracker catches exceptions and logs to logger.error() but:
- Logging might not be configured properly in production
- stderr writes may not appear in Kubernetes logs
- Errors are silently swallowed with self.enabled = False
2. Logging Visibility¶
The initialization logs to sys.stderr:
But these may not be visible in kubectl logs if stderr is not captured.
3. Database Connection Errors¶
Possible connection issues:
- SSL certificate verification (though disable_ssl: true is set)
- Network connectivity to MySQL service
- MySQL credentials invalid
- Database/tables don't exist
- Connection timeout
4. No Health Check¶
The health check endpoint (/health) checks MySQL for error logging but not for usage tracking:
# Only checks error_logging_backend, not usage tracker!
if hasattr(multiuser_backend, 'error_logging_backend'):
...
Recommended Fixes¶
1. Enhanced Logging¶
Add explicit logging to Python's logging system (not just stderr): - Log usage tracker initialization success/failure at INFO level - Log each tracking attempt (at DEBUG level) - Log connection parameters (without passwords) - Add logging configuration to NiceGUI app
2. Health Check Enhancement¶
Add usage tracker health check to /health endpoint:
# Check usage tracking
tracker = get_usage_tracker()
if tracker and tracker.enabled:
try:
# Test connection
tracker._execute_query("SELECT 1", ())
except Exception as e:
health_details["usage_tracking"] = "unhealthy"
3. Startup Verification¶
Add verification on startup: - Test database connection immediately after init - Log connection success/failure - Try a test INSERT to verify write permissions - Check that tables exist
4. Better Error Messages¶
Instead of silently disabling on error:
except Exception as e:
logger.error(f"Failed to initialize usage tracking: {e}")
logger.error(f"Connection params: host={host}, port={port}, database={db}")
self.enabled = False
Add detailed error information that helps diagnose the problem.
Next Steps¶
- Add comprehensive logging - Make sure all initialization and tracking attempts are logged
- Check pod logs -
kubectl logs -n mbasic <pod-name>to see what's actually happening - Verify MySQL connectivity - Test connection from within a pod
- Check database/tables exist - Verify schema was created
- Test locally - Try usage tracking on local dev environment with MySQL
Testing Plan¶
Local Test¶
- Set up local MySQL with mbasic_logs database
- Run schema creation script
- Configure multiuser.json with local MySQL
- Start web UI and verify tracking works
- Check tables have data
Kubernetes Test¶
- Port-forward to MySQL pod to test connectivity
- Check pod logs for initialization messages
- Test health endpoint
- Manually INSERT test data to verify permissions
- Check application logs for tracking attempts
Files to Check¶
- Pod logs:
kubectl logs -n mbasic deployment/mbasic-web - MySQL connectivity:
kubectl exec -n mbasic -it <mysql-pod> -- mysql -u root -p - Tables:
SHOW TABLES; SELECT * FROM page_visits; - Secrets:
kubectl get secret -n mbasic mbasic-secrets -o yaml