blueplane
Manage Blueplane telemetry server using server_ctl.py for starting, stopping, restarting, viewing logs, and checking system status. Essential for development workflow and debugging.
When & Why to Use This Skill
The Blueplane skill is a comprehensive management and diagnostic tool for telemetry servers. it provides a robust interface for controlling server lifecycles (start, stop, restart), monitoring real-time logs, and performing deep system health checks. By integrating commands for Redis stream analysis and SQLite database inspection, it empowers developers and SREs to maintain high system availability and streamline debugging workflows.
Use Cases
- Server Lifecycle Management: Easily start, stop, or restart the Blueplane telemetry server in both foreground and daemon modes for different environment needs.
- Real-time Debugging: Monitor live server logs with advanced filtering to quickly identify and resolve errors or performance bottlenecks.
- System Health Auditing: Perform detailed status checks including Redis connection status, consumer group health, and SQLite database integrity.
- Incident Response: Troubleshoot unresponsive services using forced shutdown options and automated PID file cleanup to restore system operations.
- Post-Deployment Verification: Validate successful deployments by checking server uptime and recent activity metrics through verbose status reports.
| 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