| name | blueplane |
| description | Manage Blueplane telemetry server using server_ctl.py for starting, stopping, restarting, viewing logs, and checking system status. Essential for development workflow and debugging. |
Blueplane Server Management
Overview
The Blueplane telemetry processing server is controlled via scripts/server_ctl.py. This skill covers all server lifecycle operations, log monitoring, and status checking.
Quick Reference
# Start/Stop/Restart
python scripts/server_ctl.py start # Start in foreground
python scripts/server_ctl.py start --daemon # Start in background (daemon)
python scripts/server_ctl.py stop # Graceful shutdown
python scripts/server_ctl.py stop --force # Force kill
python scripts/server_ctl.py restart # Stop then start
python scripts/server_ctl.py restart --daemon # Restart as daemon
# Status & Monitoring
python scripts/server_ctl.py status # Check if running
python scripts/server_ctl.py status --verbose # Detailed status
# View Logs
tail -f ~/.blueplane/server.log # Live log monitoring
tail -n 100 ~/.blueplane/server.log # Last 100 lines
Commands
start - Start Server
Starts the Blueplane telemetry processing server.
Usage:
python scripts/server_ctl.py start [--daemon] [--verbose]
Options:
--daemon, -d: Run server in background (daemon mode)--verbose, -v: Enable verbose output
Examples:
# Start in foreground (good for debugging)
python scripts/server_ctl.py start
# Start as daemon (good for production)
python scripts/server_ctl.py start --daemon
python scripts/server_ctl.py start -d
# Start with verbose output
python scripts/server_ctl.py start -d -v
When to Use:
- Foreground: When debugging, testing, or need immediate feedback
- Daemon: For long-running operation, production, or background processing
stop - Stop Server
Gracefully stops the running server with optional force kill.
Usage:
python scripts/server_ctl.py stop [--force] [--timeout TIMEOUT] [--verbose]
Options:
--force, -f: Force kill if graceful shutdown fails--timeout TIMEOUT, -t TIMEOUT: Timeout in seconds (default: 30)--verbose, -v: Enable verbose output
Examples:
# Graceful shutdown (preferred)
python scripts/server_ctl.py stop
# Force kill if stuck
python scripts/server_ctl.py stop --force
python scripts/server_ctl.py stop -f
# Custom timeout
python scripts/server_ctl.py stop --timeout 60
# Verbose stop with force fallback
python scripts/server_ctl.py stop -v -f
Shutdown Process:
- Sends SIGTERM (graceful shutdown signal)
- Waits for timeout period (default 30s)
- If
--forcespecified and still running, sends SIGKILL - Cleans up PID file
restart - Restart Server
Stops the server (if running) and starts it again.
Usage:
python scripts/server_ctl.py restart [--daemon] [--force] [--timeout TIMEOUT] [--verbose]
Options:
- Combines all options from
stopandstart --daemon, -d: Restart in daemon mode--force, -f: Force kill during stop if needed--timeout TIMEOUT, -t TIMEOUT: Stop timeout in seconds--verbose, -v: Enable verbose output
Examples:
# Restart in foreground
python scripts/server_ctl.py restart
# Restart as daemon (most common)
python scripts/server_ctl.py restart --daemon
python scripts/server_ctl.py restart -d
# Force restart with custom timeout
python scripts/server_ctl.py restart -d -f -t 60
# Verbose restart
python scripts/server_ctl.py restart -d -v
When to Restart:
- After code changes
- After configuration updates
- After Redis schema changes
- When server is unresponsive but
stopalone won't work
status - Check Server Status
Check if the server is running and get health information.
Usage:
python scripts/server_ctl.py status [--verbose]
Options:
--verbose, -v: Show detailed status information
Examples:
# Basic status check
python scripts/server_ctl.py status
# Detailed status with health checks
python scripts/server_ctl.py status --verbose
python scripts/server_ctl.py status -v
Output Includes:
- Process status (running/stopped)
- PID information
- Server uptime
- Verbose mode adds:
- Redis connection status
- Database file status
- Consumer group information
- Recent activity metrics
Log Management
Log File Location
~/.blueplane/server.log
Common Log Commands
# Watch logs in real-time (best for monitoring)
tail -f ~/.blueplane/server.log
# Last N lines
tail -n 50 ~/.blueplane/server.log # Last 50 lines
tail -n 100 ~/.blueplane/server.log # Last 100 lines
# Search logs
grep "ERROR" ~/.blueplane/server.log
grep "Claude Code" ~/.blueplane/server.log
grep -i "redis" ~/.blueplane/server.log # Case insensitive
# Filter by component
grep "event_consumer" ~/.blueplane/server.log
grep "jsonl_monitor" ~/.blueplane/server.log
grep "database_monitor" ~/.blueplane/server.log
# View logs with timestamps
tail -f ~/.blueplane/server.log | grep "$(date +%Y-%m-%d)"
# Count errors
grep -c "ERROR" ~/.blueplane/server.log
grep -c "WARNING" ~/.blueplane/server.log
Log Levels
Logs use Python logging levels:
- DEBUG: Detailed diagnostic information
- INFO: General informational messages
- WARNING: Warning messages for potential issues
- ERROR: Error messages for failures
- CRITICAL: Critical failures
Background Log Monitoring
# Run tail in background and monitor periodically
tail -f ~/.blueplane/server.log &
# Kill background tail
pkill -f "tail -f.*server.log"
System Health Checks
Check Redis Streams
# Check stream lengths
redis-cli XLEN telemetry:message_queue
redis-cli XLEN telemetry:message_queue
redis-cli XLEN cdc:events
# Check consumer groups
redis-cli XINFO GROUPS telemetry:message_queue
redis-cli XINFO GROUPS cdc:events
# Check pending messages
redis-cli XPENDING telemetry:message_queue processors
Check Database
# Check database file
ls -lh ~/.blueplane/telemetry.db
# SQLite query examples
sqlite3 ~/.blueplane/telemetry.db "SELECT COUNT(*) FROM claude_raw_traces;"
sqlite3 ~/.blueplane/telemetry.db "SELECT COUNT(*) FROM cursor_raw_traces;"
Check Process
# Check if process is running
ps aux | grep server.py
# Check PID file
cat ~/.blueplane/server.pid
# Check resource usage
ps aux | grep server.py | awk '{print $3, $4, $11}' # CPU, MEM, COMMAND
Typical Workflows
Development Workflow
# 1. Make code changes
# 2. Restart server to pick up changes
python scripts/server_ctl.py restart --daemon
# 3. Monitor logs for issues
tail -f ~/.blueplane/server.log
# 4. Check status
python scripts/server_ctl.py status --verbose
Debugging Issues
# 1. Check if server is running
python scripts/server_ctl.py status -v
# 2. View recent logs
tail -n 200 ~/.blueplane/server.log | grep -i error
# 3. Stop server
python scripts/server_ctl.py stop
# 4. Clear any stale state (optional)
rm ~/.blueplane/server.pid
# 5. Start in foreground to see live output
python scripts/server_ctl.py start
# 6. Once working, restart as daemon
python scripts/server_ctl.py restart -d
Production Deployment
# 1. Stop existing server gracefully
python scripts/server_ctl.py stop --timeout 60
# 2. Verify stopped
python scripts/server_ctl.py status
# 3. Start as daemon
python scripts/server_ctl.py start --daemon
# 4. Verify running
python scripts/server_ctl.py status --verbose
# 5. Monitor logs briefly
tail -n 50 ~/.blueplane/server.log
After Configuration Changes
# Changes to config files in ~/.blueplane/ or config/
python scripts/server_ctl.py restart --daemon
# Monitor to ensure clean restart
tail -f ~/.blueplane/server.log
# Look for "Server started successfully" message
Important Files & Directories
~/.blueplane/
├── server.log # Main log file
├── server.pid # PID file (JSON format with metadata)
├── telemetry.db # SQLite database
├── config.yaml # Configuration (if present)
└── workspace_cache.db # Workspace mappings cache
scripts/
├── server_ctl.py # Server control CLI (this skill)
└── start_server.py # Actual server implementation
Troubleshooting
Server Won't Start
# Check if already running
python scripts/server_ctl.py status
# Check for stale PID file
cat ~/.blueplane/server.pid
ps aux | grep $(cat ~/.blueplane/server.pid | jq -r .pid)
# Force cleanup
python scripts/server_ctl.py stop --force
rm ~/.blueplane/server.pid
# Try starting again
python scripts/server_ctl.py start
Server Won't Stop
# Try force stop
python scripts/server_ctl.py stop --force
# If still stuck, manual kill
kill -9 $(cat ~/.blueplane/server.pid | jq -r .pid)
rm ~/.blueplane/server.pid
Server Running But Not Processing
# Check status with verbose
python scripts/server_ctl.py status --verbose
# Check Redis connection
redis-cli PING
# Check consumer groups
redis-cli XINFO GROUPS telemetry:message_queue
# Restart server
python scripts/server_ctl.py restart --daemon
High CPU/Memory Usage
# Check resource usage
ps aux | grep server.py
# Check stream lengths (may be backlog)
redis-cli XLEN telemetry:message_queue
redis-cli XLEN cdc:events
# Check logs for errors
grep -i "error\|warning" ~/.blueplane/server.log | tail -50
# Consider restarting
python scripts/server_ctl.py restart --daemon
Best Practices
Always use daemon mode for long-running operation
python scripts/server_ctl.py restart --daemonUse foreground mode when debugging
python scripts/server_ctl.py start # No --daemonCheck status after restart
python scripts/server_ctl.py restart -d && sleep 2 && python scripts/server_ctl.py status -vMonitor logs after changes
python scripts/server_ctl.py restart -d && tail -f ~/.blueplane/server.logGraceful shutdown preferred over force
# Good python scripts/server_ctl.py stop # Only if stuck python scripts/server_ctl.py stop --forceUse verbose mode for detailed debugging
python scripts/server_ctl.py status --verbose
Integration with Development
Git Workflow
After pulling changes:
git pull
python scripts/server_ctl.py restart --daemon
tail -f ~/.blueplane/server.log
Testing Changes
# Stop server
python scripts/server_ctl.py stop
# Run tests
pytest tests/
# Restart server
python scripts/server_ctl.py start --daemon
Pre-commit
Before committing changes that affect the server:
# Restart to verify changes work
python scripts/server_ctl.py restart --daemon
# Check logs for errors
tail -n 100 ~/.blueplane/server.log | grep -i error
# Commit if clean
git add . && git commit
Database Overview
Blueplane uses a hybrid storage approach with SQLite for persistent storage and Redis for message queuing and real-time metrics.
Storage Architecture
~/.blueplane/
├── telemetry.db # SQLite database (primary storage)
├── server.log # Server logs
├── server.pid # Process ID file
└── config.yaml # User configuration (optional)
SQLite Database Schema
The SQLite database (~/.blueplane/telemetry.db) contains the following main tables:
1. claude_raw_traces - Claude Code Events
Stores all events from Claude Code JSONL transcripts.
Key Fields:
sequence- Auto-incrementing primary keyevent_id- Unique event identifierexternal_id- Claude session/conversation IDevent_type- Type of event (message, tool_use, system_event, etc.)platform- Always 'claude_code'timestamp- Event timestampuuid- Claude event UUID (for threading)parent_uuid- Parent event UUID (for threading)workspace_hash- Workspace identifierproject_name- Human-readable project namemessage_role- user/assistant (for message events)message_model- Model used (e.g., claude-sonnet-4.5)input_tokens,output_tokens- Token usageevent_data- Compressed full event (zlib)
2. cursor_raw_traces - Cursor Events
Stores all events from Cursor database monitoring.
Key Fields:
sequence- Auto-incrementing primary keyevent_id- Unique event identifierexternal_session_id- Cursor session IDevent_type- Type of eventtimestamp- Event timestampworkspace_hash- Workspace identifierdatabase_table- Source table in Cursor DBgeneration_uuid- AI generation identifiercomposer_id- Composer session identifierbubble_id- Chat bubble identifierevent_data- Compressed full event (zlib)
3. conversations - Unified Conversations Table
Tracks conversations across both platforms.
Key Fields:
id- Internal conversation ID (UUID)session_id- NULL for Claude Code, references cursor_sessions.id for Cursorexternal_id- Platform-specific external IDplatform- 'claude_code' or 'cursor'workspace_hash- Workspace identifierworkspace_name- Human-readable workspace namestarted_at- Conversation start timestampended_at- Conversation end timestamp (NULL if active)interaction_count- Number of interactionsacceptance_rate- Code acceptance ratetotal_tokens- Total tokens usedtotal_changes- Total code changes
Important Platform Differences:
- Claude Code:
session_idis always NULL (sessions = conversations) - Cursor:
session_idreferences acursor_sessionsentry
4. cursor_sessions - Cursor IDE Sessions
Stores Cursor IDE window sessions (Cursor only, no Claude Code sessions).
Key Fields:
id- Internal session ID (UUID)external_session_id- Session ID from Cursor extensionworkspace_hash- Workspace identifierworkspace_name- Human-readable workspace nameworkspace_path- Full workspace pathstarted_at- Session start timestampended_at- Session end timestamp (NULL if active)
Redis Streams
Redis streams are used for message queuing and event processing:
telemetry:message_queue- Main event stream (from capture → processing)telemetry:message_queue- Legacy stream namecdc:events- Change data capture events (database updates)
Decompressing Event Data
The event_data field in raw trace tables is compressed with zlib. To decompress and view full event data:
import sqlite3
import zlib
import json
from pathlib import Path
db_path = Path.home() / '.blueplane' / 'telemetry.db'
conn = sqlite3.connect(str(db_path))
# Get an event
cursor = conn.execute("""
SELECT event_data FROM claude_raw_traces
WHERE sequence = ?
""", (1,))
row = cursor.fetchone()
if row:
compressed_data = row[0]
decompressed = zlib.decompress(compressed_data)
event = json.loads(decompressed)
print(json.dumps(event, indent=2))
See Also
- Redis Streams: Check stream health and consumer groups
- Database Schema: Check SQLite database for data integrity
- Configuration:
~/.blueplane/config.yamlorconfig/config.yaml - Log Analysis: Search and filter logs for specific issues
- Session & Conversation Schema: See
docs/SESSION_CONVERSATION_SCHEMA.mdfor detailed schema design