202 lines
5.2 KiB
Markdown
Executable File
202 lines
5.2 KiB
Markdown
Executable File
# Debugging and Optimization Guide
|
|
|
|
This document describes the debugging and optimization features added to the docker-tools bash scripts.
|
|
|
|
## Debug Mode
|
|
|
|
Enable comprehensive debugging with the `--debug` or `-d` flag:
|
|
|
|
```bash
|
|
./docker-backup.sh --debug --all
|
|
./docker-migrate.sh --debug --service myapp --dest user@host
|
|
```
|
|
|
|
### What Debug Mode Does
|
|
|
|
1. **Enables `set -x` (xtrace)**: Shows every command executed with line numbers
|
|
2. **Function tracing**: Shows function entry points with file:line information
|
|
3. **Stack traces**: On errors, shows call stack
|
|
4. **Detailed logging**: All operations log debug information
|
|
5. **Verbose output**: Shows internal state and decisions
|
|
|
|
### Debug Output Format
|
|
|
|
```
|
|
+ [script.sh:123] function_name(): Command being executed
|
|
[DEBUG] script.sh:123 function_name()
|
|
[DEBUG] Validating stack name: 'myapp'
|
|
[DEBUG] Stack name validation passed
|
|
```
|
|
|
|
## Verbose Mode
|
|
|
|
Enable verbose logging without full xtrace:
|
|
|
|
```bash
|
|
./docker-backup.sh --verbose --all
|
|
```
|
|
|
|
Verbose mode provides:
|
|
- Function entry/exit logging
|
|
- Operation details
|
|
- State information
|
|
- Without the command-level tracing of debug mode
|
|
|
|
## Debug Logging Functions
|
|
|
|
### `log_debug()`
|
|
Logs debug messages (only shown in DEBUG or VERBOSE mode):
|
|
```bash
|
|
log_debug "Processing stack: $stack"
|
|
```
|
|
|
|
### `log_verbose()`
|
|
Logs verbose messages (only shown in VERBOSE mode):
|
|
```bash
|
|
log_verbose "Found ${#stacks[@]} stacks"
|
|
```
|
|
|
|
### `debug_trace()`
|
|
Automatically called in functions to show entry points:
|
|
- Shows file, line number, and function name
|
|
- Only active when DEBUG or VERBOSE is enabled
|
|
|
|
## Error Handling Improvements
|
|
|
|
### Better Error Messages
|
|
- More descriptive error messages with context
|
|
- Shows what was attempted and why it failed
|
|
- Includes relevant variable values
|
|
|
|
### Exit Codes
|
|
- Consistent exit codes across scripts
|
|
- `0`: Success
|
|
- `1`: General error
|
|
- `2`: Invalid arguments
|
|
- `3`: Dependency missing
|
|
|
|
### Error Stack Traces
|
|
In DEBUG mode, errors show call stack:
|
|
```
|
|
[ERROR] Stack directory not found: /opt/stacks/myapp
|
|
-> docker-backup.sh:248 backup_stack()
|
|
-> docker-backup.sh:510 main()
|
|
```
|
|
|
|
## Performance Optimizations
|
|
|
|
### Reduced Redundant Operations
|
|
- Docker commands cached where appropriate
|
|
- Stack discovery optimized
|
|
- Parallel operations properly throttled
|
|
|
|
### Improved Logging
|
|
- Log file writes are non-blocking
|
|
- Fallback to /tmp if primary log location fails
|
|
- Automatic log directory creation
|
|
|
|
### Spinner Optimization
|
|
- Spinner disabled in DEBUG mode (would interfere with output)
|
|
- Proper cleanup on exit
|
|
|
|
## Common Debugging Scenarios
|
|
|
|
### Stack Not Found
|
|
```bash
|
|
DEBUG=true ./docker-backup.sh --stack myapp
|
|
# Shows:
|
|
# [DEBUG] Discovering stacks in: /opt/stacks
|
|
# [DEBUG] Found directory: myapp
|
|
# [DEBUG] Validating stack name: 'myapp'
|
|
# [ERROR] Stack directory not found: /opt/stacks/myapp
|
|
```
|
|
|
|
### Docker Connection Issues
|
|
```bash
|
|
DEBUG=true ./docker-backup.sh --all
|
|
# Shows:
|
|
# [DEBUG] Checking Docker installation and daemon status
|
|
# [DEBUG] Docker command found: /usr/bin/docker
|
|
# [DEBUG] Docker version: Docker version 24.0.5
|
|
# [ERROR] Docker daemon not running or not accessible.
|
|
# [DEBUG] Attempting to get more details...
|
|
```
|
|
|
|
### Transfer Failures
|
|
```bash
|
|
DEBUG=true ./docker-migrate.sh --service myapp --dest user@host
|
|
# Shows:
|
|
# [DEBUG] Executing SSH command: host=host, port=22, user=user
|
|
# [DEBUG] SSH connection: user@host:22
|
|
# [DEBUG] SSH command exit code: 255
|
|
# [ERROR] SSH connection failed
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
You can also set debug mode via environment variables:
|
|
|
|
```bash
|
|
export DEBUG=true
|
|
./docker-backup.sh --all
|
|
|
|
export VERBOSE=true
|
|
./docker-migrate.sh --service myapp --dest user@host
|
|
```
|
|
|
|
## Log Files
|
|
|
|
Debug information is written to log files:
|
|
- Default: `/tmp/docwell/docwell.log`
|
|
- Script-specific: `/tmp/docwell/docker-{script}.log`
|
|
- Fallback: `/tmp/docwell/fallback.log` (if primary location fails)
|
|
|
|
Log format:
|
|
```
|
|
2025-02-18 10:30:45 [DEBUG] Validating stack name: 'myapp'
|
|
2025-02-18 10:30:45 [INFO] Starting backup for myapp
|
|
2025-02-18 10:30:46 [OK] Backup complete: myapp
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Use DEBUG for troubleshooting**: When something fails unexpectedly
|
|
2. **Use VERBOSE for monitoring**: When you want to see what's happening without full trace
|
|
3. **Check log files**: Even without DEBUG, errors are logged
|
|
4. **Combine with dry-run**: `--debug --dry-run` to see what would happen
|
|
5. **Redirect output**: `--debug 2>debug.log` to save debug output
|
|
|
|
## Troubleshooting Tips
|
|
|
|
### Script Hangs
|
|
- Enable DEBUG to see where it's stuck
|
|
- Check for SSH timeouts or network issues
|
|
- Look for spinner processes that didn't clean up
|
|
|
|
### Permission Errors
|
|
- DEBUG shows exact commands being run
|
|
- Check if sudo is needed (shown in debug output)
|
|
- Verify file/directory permissions
|
|
|
|
### Unexpected Behavior
|
|
- Compare DEBUG output with expected behavior
|
|
- Check environment variables (shown at script start)
|
|
- Verify configuration file values
|
|
|
|
## Performance Monitoring
|
|
|
|
With VERBOSE mode, you can see:
|
|
- How many stacks were discovered
|
|
- Time spent on each operation
|
|
- Parallel job status
|
|
- Resource usage
|
|
|
|
Example:
|
|
```bash
|
|
VERBOSE=true ./docker-backup.sh --all
|
|
# Shows:
|
|
# [VERBOSE] Found 5 directories, 5 valid stacks
|
|
# [VERBOSE] Total stacks discovered: 5 (0 from docker ps)
|
|
# [VERBOSE] Processing stack 1/5: myapp
|
|
```
|