- Add CLI reference documentation with command examples - Add CLI quick reference card for quick lookups - Add troubleshooting guide for common issues - Add GitHub Actions release workflow for binary builds - Add CHANGELOG.md for release tracking - Add webhook integration examples - Add setup and verification script - Update README with installation instructions and CLI overview Addresses ELF-169: Document CLI and add standalone binary releases Co-Authored-By: Paperclip <noreply@paperclip.ing>
670 lines
11 KiB
Markdown
670 lines
11 KiB
Markdown
# CLI Troubleshooting Guide
|
|
|
|
Comprehensive troubleshooting guide for Hatch CLI issues.
|
|
|
|
## Quick Diagnostics
|
|
|
|
### Health Check
|
|
|
|
First, verify the Hatch server is running and accessible:
|
|
|
|
```bash
|
|
# Check if server is responding
|
|
curl -s http://localhost:8080/healthz
|
|
|
|
# Expected output: ok
|
|
|
|
# If using custom URL
|
|
curl -s $HATCH_URL/healthz
|
|
```
|
|
|
|
### Version Check
|
|
|
|
Verify you're using the correct version:
|
|
|
|
```bash
|
|
hatch version
|
|
# Expected output: hatch v0.1.0
|
|
|
|
# Check if binary is working
|
|
hatch --help
|
|
```
|
|
|
|
### Connectivity Test
|
|
|
|
Test network connectivity to the server:
|
|
|
|
```bash
|
|
# Test with verbose output
|
|
curl -v http://localhost:8080/healthz
|
|
|
|
# Test with specific timeout
|
|
curl --connect-timeout 5 http://localhost:8080/healthz
|
|
```
|
|
|
|
## Common Error Messages
|
|
|
|
### Connection Issues
|
|
|
|
#### `Error: request failed: connection refused`
|
|
|
|
**Cause:** The Hatch server is not running or not accessible.
|
|
|
|
**Solutions:**
|
|
|
|
1. Start the Hatch server:
|
|
```bash
|
|
hatch serve
|
|
```
|
|
|
|
2. Check if the server is listening on the expected port:
|
|
```bash
|
|
# Linux/macOS
|
|
netstat -tlnp | grep 8080
|
|
# or
|
|
lsof -i :8080
|
|
|
|
# Windows
|
|
netstat -ano | findstr :8080
|
|
```
|
|
|
|
3. Verify the HATCH_URL environment variable:
|
|
```bash
|
|
echo $HATCH_URL
|
|
# Should be http://localhost:8080 or your server URL
|
|
```
|
|
|
|
4. Check firewall settings:
|
|
```bash
|
|
# Linux
|
|
sudo iptables -L -n | grep 8080
|
|
|
|
# macOS
|
|
sudo pfctl -sr | grep 8080
|
|
```
|
|
|
|
#### `Error: request failed: dial tcp: lookup localhost: no such host`
|
|
|
|
**Cause:** DNS resolution failure.
|
|
|
|
**Solutions:**
|
|
|
|
1. Use IP address instead of hostname:
|
|
```bash
|
|
export HATCH_URL=http://127.0.0.1:8080
|
|
```
|
|
|
|
2. Check `/etc/hosts` file:
|
|
```bash
|
|
grep localhost /etc/hosts
|
|
# Should contain: 127.0.0.1 localhost
|
|
```
|
|
|
|
#### `Error: request failed: context deadline exceeded`
|
|
|
|
**Cause:** Request timeout.
|
|
|
|
**Solutions:**
|
|
|
|
1. Check server load:
|
|
```bash
|
|
top -bn1 | grep hatch
|
|
```
|
|
|
|
2. Increase timeout (if using curl):
|
|
```bash
|
|
curl --max-time 30 http://localhost:8080/healthz
|
|
```
|
|
|
|
3. Check network latency:
|
|
```bash
|
|
ping localhost
|
|
```
|
|
|
|
### Authentication Errors
|
|
|
|
#### `Error (HTTP 401): unauthorized`
|
|
|
|
**Cause:** Authentication required but not provided.
|
|
|
|
**Solutions:**
|
|
|
|
1. Check if authentication is enabled:
|
|
```bash
|
|
# Check server configuration
|
|
docker exec hatch-container env | grep AUTH
|
|
```
|
|
|
|
2. Provide authentication token:
|
|
```bash
|
|
# For API requests
|
|
curl -H "Authorization: Bearer $HATCH_AUTH_TOKEN" http://localhost:8080/v1/endpoints
|
|
```
|
|
|
|
3. For development, disable authentication:
|
|
```bash
|
|
# Start server without auth
|
|
HATCH_AUTH_ENABLED=false hatch serve
|
|
```
|
|
|
|
#### `Error (HTTP 403): forbidden`
|
|
|
|
**Cause:** Insufficient permissions.
|
|
|
|
**Solutions:**
|
|
|
|
1. Check user roles and permissions
|
|
2. Verify API token has required scopes
|
|
3. Contact administrator for access
|
|
|
|
### Request/Response Errors
|
|
|
|
#### `Error (HTTP 400): bad request`
|
|
|
|
**Cause:** Invalid request format.
|
|
|
|
**Solutions:**
|
|
|
|
1. Validate JSON format:
|
|
```bash
|
|
echo '{"invalid":json}' | jq .
|
|
# Should show parse error
|
|
```
|
|
|
|
2. Check Content-Type header:
|
|
```bash
|
|
curl -H "Content-Type: application/json" -d '{"valid":"json"}' ...
|
|
```
|
|
|
|
3. Verify request body size:
|
|
```bash
|
|
# Check body size
|
|
echo -n '{"data":"..."}' | wc -c
|
|
```
|
|
|
|
#### `Error (HTTP 404): endpoint not found`
|
|
|
|
**Cause:** Requested resource doesn't exist.
|
|
|
|
**Solutions:**
|
|
|
|
1. List available endpoints:
|
|
```bash
|
|
curl http://localhost:8080/v1/endpoints
|
|
```
|
|
|
|
2. Check endpoint ID spelling:
|
|
```bash
|
|
# Case-sensitive
|
|
hatch inspect MyEndpoint # Wrong
|
|
hatch inspect myendpoint # Correct
|
|
```
|
|
|
|
3. Verify endpoint has captured requests:
|
|
```bash
|
|
hatch inspect myendpoint -limit 1
|
|
```
|
|
|
|
#### `Error (HTTP 413): payload too large`
|
|
|
|
**Cause:** Request body exceeds size limit.
|
|
|
|
**Solutions:**
|
|
|
|
1. Reduce request body size
|
|
2. Compress data before sending
|
|
3. Split into smaller chunks
|
|
|
|
#### `Error (HTTP 429): too many requests`
|
|
|
|
**Cause:** Rate limiting.
|
|
|
|
**Solutions:**
|
|
|
|
1. Implement backoff:
|
|
```bash
|
|
# Exponential backoff script
|
|
for i in {1..5}; do
|
|
sleep $((2**i))
|
|
hatch capture /api -body '{"retry":'$i'}' && break
|
|
done
|
|
```
|
|
|
|
2. Check rate limit headers:
|
|
```bash
|
|
curl -I http://localhost:8080/v1/endpoints
|
|
# Look for X-RateLimit-* headers
|
|
```
|
|
|
|
### Data Errors
|
|
|
|
#### `Error: invalid character '}' looking for beginning of value`
|
|
|
|
**Cause:** Malformed JSON in request body.
|
|
|
|
**Solutions:**
|
|
|
|
1. Validate JSON:
|
|
```bash
|
|
echo '{"key":"value"}' | jq .
|
|
```
|
|
|
|
2. Use proper escaping:
|
|
```bash
|
|
# Bash
|
|
hatch capture /api -body '{"key":"value with \"quotes\""}'
|
|
|
|
# Use file input
|
|
echo '{"key":"value"}' > request.json
|
|
hatch capture /api -body @request.json
|
|
```
|
|
|
|
3. Check for invisible characters:
|
|
```bash
|
|
cat -A request.json
|
|
```
|
|
|
|
#### `Error: unexpected end of JSON input`
|
|
|
|
**Cause:** Incomplete JSON response.
|
|
|
|
**Solutions:**
|
|
|
|
1. Check server logs for errors
|
|
2. Verify network connection wasn't interrupted
|
|
3. Try with smaller payload
|
|
|
|
### Storage Errors
|
|
|
|
#### `Error: database is locked`
|
|
|
|
**Cause:** SQLite database contention.
|
|
|
|
**Solutions:**
|
|
|
|
1. Reduce concurrent operations
|
|
2. Check for long-running transactions:
|
|
```bash
|
|
# Monitor database locks
|
|
sqlite3 hatch.db "PRAGMA journal_mode=WAL;"
|
|
```
|
|
|
|
3. Consider using PostgreSQL for production
|
|
|
|
#### `Error: no space left on device`
|
|
|
|
**Cause:** Disk space exhausted.
|
|
|
|
**Solutions:**
|
|
|
|
1. Check disk space:
|
|
```bash
|
|
df -h
|
|
du -sh /var/lib/hatch
|
|
```
|
|
|
|
2. Clean old data:
|
|
```bash
|
|
# Remove requests older than 7 days
|
|
curl -X DELETE "http://localhost:8080/v1/endpoints/myendpoint/requests?older_than=7d"
|
|
```
|
|
|
|
3. Configure data retention:
|
|
```bash
|
|
# Set retention policy
|
|
HATCH_RETENTION_DAYS=30 hatch serve
|
|
```
|
|
|
|
## Platform-Specific Issues
|
|
|
|
### Linux
|
|
|
|
#### Permission Denied
|
|
|
|
```bash
|
|
# Fix binary permissions
|
|
chmod +x /usr/local/bin/hatch
|
|
|
|
# Or install to user directory
|
|
mkdir -p ~/.local/bin
|
|
mv hatch ~/.local/bin/
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
```
|
|
|
|
#### SELinux Issues
|
|
|
|
```bash
|
|
# Check SELinux status
|
|
getenforce
|
|
|
|
# If enabled, add context
|
|
sudo semanage fcontext -a -t bin_t /usr/local/bin/hatch
|
|
sudo restorecon -v /usr/local/bin/hatch
|
|
```
|
|
|
|
### macOS
|
|
|
|
#### Gatekeeper Blocked
|
|
|
|
```bash
|
|
# Remove quarantine attribute
|
|
xattr -d com.apple.quarantine /usr/local/bin/hatch
|
|
|
|
# Or allow in System Preferences > Security & Privacy
|
|
```
|
|
|
|
#### Homebrew Path Issues
|
|
|
|
```bash
|
|
# Ensure Homebrew bin is in PATH
|
|
export PATH="/usr/local/bin:$PATH"
|
|
|
|
# Or create symlink
|
|
ln -s /usr/local/bin/hatch /opt/homebrew/bin/hatch
|
|
```
|
|
|
|
### Windows
|
|
|
|
#### Windows Defender Blocked
|
|
|
|
1. Open Windows Security
|
|
2. Go to Virus & threat protection
|
|
3. Allow app through firewall
|
|
|
|
#### PowerShell Execution Policy
|
|
|
|
```bash
|
|
# Run as Administrator
|
|
Set-ExecutionPolicy RemoteSigned
|
|
|
|
# Or bypass for current session
|
|
powershell -ExecutionPolicy Bypass -File script.ps1
|
|
```
|
|
|
|
#### PATH Not Updated
|
|
|
|
```bash
|
|
# Add to PATH permanently
|
|
$env:PATH += ";C:\path\to\hatch"
|
|
|
|
# Or use System Properties > Environment Variables
|
|
```
|
|
|
|
## Performance Issues
|
|
|
|
### Slow Response Times
|
|
|
|
#### Diagnose
|
|
|
|
```bash
|
|
# Measure response time
|
|
time curl -s http://localhost:8080/v1/endpoints > /dev/null
|
|
|
|
# Check server resources
|
|
top -bn1 | grep hatch
|
|
|
|
# Monitor network
|
|
iftop -i eth0
|
|
```
|
|
|
|
#### Solutions
|
|
|
|
1. **Increase server resources:**
|
|
```bash
|
|
# Docker
|
|
docker update --cpus="2.0" --memory="2g" hatch-container
|
|
```
|
|
|
|
2. **Optimize database:**
|
|
```bash
|
|
# Vacuum SQLite database
|
|
sqlite3 hatch.db "VACUUM;"
|
|
```
|
|
|
|
3. **Enable caching:**
|
|
```bash
|
|
HATCH_CACHE_TTL=300 hatch serve
|
|
```
|
|
|
|
### High Memory Usage
|
|
|
|
#### Diagnose
|
|
|
|
```bash
|
|
# Check memory usage
|
|
ps aux | grep hatch
|
|
pmap -x $(pgrep hatch) | tail -1
|
|
|
|
# Monitor over time
|
|
while true; do
|
|
echo "$(date): $(ps -o rss= -p $(pgrep hatch))KB"
|
|
sleep 60
|
|
done
|
|
```
|
|
|
|
#### Solutions
|
|
|
|
1. **Limit request history:**
|
|
```bash
|
|
HATCH_MAX_REQUESTS=10000 hatch serve
|
|
```
|
|
|
|
2. **Enable pagination:**
|
|
```bash
|
|
hatch inspect myendpoint -limit 100
|
|
```
|
|
|
|
3. **Restart periodically:**
|
|
```bash
|
|
# Cron job
|
|
0 0 * * * systemctl restart hatch
|
|
```
|
|
|
|
### High CPU Usage
|
|
|
|
#### Diagnose
|
|
|
|
```bash
|
|
# Check CPU usage
|
|
top -bn1 | grep hatch
|
|
|
|
# Profile if needed
|
|
go tool pprof http://localhost:6060/debug/pprof/profile
|
|
```
|
|
|
|
#### Solutions
|
|
|
|
1. **Reduce logging:**
|
|
```bash
|
|
HATCH_LOG_LEVEL=warn hatch serve
|
|
```
|
|
|
|
2. **Limit concurrent connections:**
|
|
```bash
|
|
HATCH_MAX_CONNECTIONS=100 hatch serve
|
|
```
|
|
|
|
## Network Issues
|
|
|
|
### Proxy Configuration
|
|
|
|
```bash
|
|
# Set proxy environment variables
|
|
export HTTP_PROXY=http://proxy.example.com:8080
|
|
export HTTPS_PROXY=http://proxy.example.com:8080
|
|
export NO_PROXY=localhost,127.0.0.1
|
|
|
|
# Or configure in hatch
|
|
HATCH_PROXY=$HTTP_PROXY hatch serve
|
|
```
|
|
|
|
### SSL/TLS Issues
|
|
|
|
```bash
|
|
# Skip SSL verification (development only)
|
|
curl -k https://hatch.example.com/healthz
|
|
|
|
# Or add certificate
|
|
curl --cacert /path/to/ca.crt https://hatch.example.com/healthz
|
|
|
|
# For self-signed certificates
|
|
export CURL_CA_BUNDLE=/path/to/cert.pem
|
|
```
|
|
|
|
### DNS Resolution
|
|
|
|
```bash
|
|
# Test DNS resolution
|
|
nslookup localhost
|
|
dig localhost
|
|
|
|
# Use IP address
|
|
export HATCH_URL=http://127.0.0.1:8080
|
|
```
|
|
|
|
## Docker Issues
|
|
|
|
### Container Won't Start
|
|
|
|
```bash
|
|
# Check container logs
|
|
docker logs hatch-container
|
|
|
|
# Check container status
|
|
docker ps -a | grep hatch
|
|
|
|
# Inspect container
|
|
docker inspect hatch-container
|
|
```
|
|
|
|
### Port Conflicts
|
|
|
|
```bash
|
|
# Find what's using port 8080
|
|
lsof -i :8080
|
|
netstat -tlnp | grep 8080
|
|
|
|
# Use different port
|
|
docker run -p 9090:8080 hatch:latest
|
|
```
|
|
|
|
### Volume Mount Issues
|
|
|
|
```bash
|
|
# Check volume permissions
|
|
ls -la /path/to/volume
|
|
|
|
# Fix permissions
|
|
sudo chown -R 1000:1000 /path/to/volume
|
|
|
|
# Test mount
|
|
docker run -v /path/to/volume:/data busybox ls -la /data
|
|
```
|
|
|
|
## Debugging Techniques
|
|
|
|
### Enable Debug Logging
|
|
|
|
```bash
|
|
# Set debug level
|
|
DEBUG=true hatch serve
|
|
|
|
# Or use environment variable
|
|
HATCH_LOG_LEVEL=debug hatch serve
|
|
```
|
|
|
|
### Verbose Output
|
|
|
|
```bash
|
|
# Use curl verbose mode
|
|
curl -v http://localhost:8080/v1/endpoints
|
|
|
|
# Capture full request/response
|
|
curl -v -w '\n' http://localhost:8080/v1/endpoints > debug.txt 2>&1
|
|
```
|
|
|
|
### Network Tracing
|
|
|
|
```bash
|
|
# Linux
|
|
strace -e trace=network hatch serve
|
|
|
|
# macOS
|
|
dtruss -n hatch
|
|
|
|
# Windows
|
|
netsh trace start capture=yes tracefile=trace.etl
|
|
```
|
|
|
|
### Core Dumps
|
|
|
|
```bash
|
|
# Enable core dumps
|
|
ulimit -c unlimited
|
|
|
|
# Run with core dump
|
|
hatch serve &
|
|
echo $! > /tmp/hatch.pid
|
|
|
|
# If crash occurs, analyze
|
|
gdb /usr/local/bin/hatch core
|
|
```
|
|
|
|
## Getting Help
|
|
|
|
### Documentation
|
|
|
|
- [CLI Reference](cli.md) - Command documentation
|
|
- [Examples](../../examples/) - Usage examples
|
|
- [Architecture](hatch-architecture.md) - System design
|
|
|
|
### Community
|
|
|
|
- [GitHub Issues](https://github.com/elfoundation/hatch/issues) - Bug reports
|
|
- [Discussions](https://github.com/elfoundation/hatch/discussions) - Questions
|
|
|
|
### Logs
|
|
|
|
```bash
|
|
# Check application logs
|
|
docker logs -f hatch-container
|
|
|
|
# Check system logs
|
|
journalctl -u hatch -f
|
|
|
|
# Check access logs
|
|
tail -f /var/log/hatch/access.log
|
|
```
|
|
|
|
## Reporting Issues
|
|
|
|
When reporting issues, include:
|
|
|
|
1. **Environment details:**
|
|
```bash
|
|
hatch version
|
|
go version
|
|
uname -a # Linux/macOS
|
|
systeminfo # Windows
|
|
```
|
|
|
|
2. **Configuration:**
|
|
```bash
|
|
env | grep HATCH
|
|
```
|
|
|
|
3. **Reproduction steps:**
|
|
- Exact commands run
|
|
- Expected behavior
|
|
- Actual behavior
|
|
|
|
4. **Logs:**
|
|
```bash
|
|
# Attach relevant logs
|
|
docker logs hatch-container > hatch.log 2>&1
|
|
```
|
|
|
|
5. **Network info:**
|
|
```bash
|
|
curl -v http://localhost:8080/healthz > network-debug.txt 2>&1
|
|
``` |