# Timer Sensor Quick Start Guide **Last Updated:** 2025-01-27 **Audience:** Developers ## Overview This guide will help you get the timer sensor up and running for development and testing. ## Prerequisites - Rust 1.70+ installed - PostgreSQL 14+ running - RabbitMQ 3.12+ running - Attune API service running ## Step 1: Start Dependencies ### Using Docker Compose ```bash # From project root docker-compose up -d postgres rabbitmq ``` ### Manual Setup ```bash # PostgreSQL (already running on localhost:5432) # RabbitMQ (already running on localhost:5672) ``` Verify services are running: ```bash # PostgreSQL psql -h localhost -U postgres -c "SELECT version();" # RabbitMQ rabbitmqadmin list queues ``` ## Step 2: Start the API Service ```bash # Terminal 1 cd attune make run-api # Or manually: cd crates/api cargo run ``` Verify API is running: ```bash curl http://localhost:8080/health ``` ## Step 3: Create a Service Account for the Sensor **NOTE:** Service accounts are not yet implemented. This step will be available after implementing the service account system. For now, you'll need to use a user token or skip authentication during development. ### When Service Accounts Are Implemented ```bash # Get admin token (from login or existing session) export ADMIN_TOKEN="your_admin_token_here" # Create sensor service account curl -X POST http://localhost:8080/service-accounts \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "name": "sensor:core.timer", "scope": "sensor", "description": "Timer sensor for development", "ttl_days": 90, "metadata": { "trigger_types": ["core.timer"] } }' # Save the returned token export SENSOR_TOKEN="eyJhbGci..." ``` ## Step 4: Start the Timer Sensor ```bash # Terminal 2 cd attune # Set environment variables export ATTUNE_API_URL="http://localhost:8080" export ATTUNE_API_TOKEN="your_sensor_token_here" # Or user token for now export ATTUNE_SENSOR_REF="core.timer" export ATTUNE_MQ_URL="amqp://localhost:5672" export ATTUNE_LOG_LEVEL="debug" # Run the sensor cargo run --package core-timer-sensor ``` You should see output like: ```json {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Starting Attune Timer Sensor"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Configuration loaded successfully","sensor_ref":"core.timer","api_url":"http://localhost:8080"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"API connectivity verified"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Timer manager initialized"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Connected to RabbitMQ"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Started consuming messages from queue 'sensor.core.timer'"} ``` ## Step 5: Create a Timer-Based Rule ### Via API ```bash # Create a simple timer rule that fires every 5 seconds curl -X POST http://localhost:8080/rules \ -H "Authorization: Bearer ${TOKEN}" \ -H "Content-Type: application/json" \ -d '{ "ref": "timer_every_5s", "label": "Timer Every 5 Seconds", "description": "Test timer that fires every 5 seconds", "pack": "core", "trigger_type": "core.timer", "trigger_params": { "type": "interval", "interval": 5, "unit": "seconds" }, "action_ref": "core.echo", "action_params": { "message": "Timer fired!" }, "enabled": true }' ``` ### Via CLI ```bash # Not yet implemented # attune rule create timer_every_5s --trigger core.timer --action core.echo ``` ## Step 6: Watch the Sensor Logs In the sensor terminal, you should see: ```json {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Handling RuleCreated","rule_id":123,"ref":"timer_every_5s"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Starting timer for rule 123"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Timer started for rule 123"} {"timestamp":"2025-01-27T12:34:56Z","level":"info","message":"Interval timer loop started for rule 123","interval":5} ``` After 5 seconds: ```json {"timestamp":"2025-01-27T12:35:01Z","level":"info","message":"Timer fired for rule 123, created event 456"} ``` ## Step 7: Verify Events Are Created ```bash # List events curl http://localhost:8080/events \ -H "Authorization: Bearer ${TOKEN}" # Should show events with trigger_type "core.timer" ``` ## Step 8: Test Rule Disable/Enable ### Disable the rule ```bash curl -X POST http://localhost:8080/rules/timer_every_5s/disable \ -H "Authorization: Bearer ${TOKEN}" ``` Sensor logs should show: ```json {"timestamp":"2025-01-27T12:35:10Z","level":"info","message":"Handling RuleDisabled","rule_id":123} {"timestamp":"2025-01-27T12:35:10Z","level":"info","message":"Stopped timer for rule 123"} ``` ### Re-enable the rule ```bash curl -X POST http://localhost:8080/rules/timer_every_5s/enable \ -H "Authorization: Bearer ${TOKEN}" ``` Sensor logs should show: ```json {"timestamp":"2025-01-27T12:35:20Z","level":"info","message":"Handling RuleEnabled","rule_id":123} {"timestamp":"2025-01-27T12:35:20Z","level":"info","message":"Starting timer for rule 123"} ``` ## Step 9: Test Different Timer Types ### Every 1 minute ```json { "trigger_params": { "type": "interval", "interval": 1, "unit": "minutes" } } ``` ### Every 1 hour ```json { "trigger_params": { "type": "interval", "interval": 1, "unit": "hours" } } ``` ### One-time at specific datetime ```json { "trigger_params": { "type": "date_time", "fire_at": "2025-01-27T15:00:00Z" } } ``` ## Development Workflow ### Making Changes to the Sensor ```bash # 1. Make code changes in crates/core-timer-sensor/src/ # 2. Build and check for errors cargo build --package core-timer-sensor # 3. Run tests cargo test --package core-timer-sensor # 4. Restart the sensor # Stop with Ctrl+C, then: cargo run --package core-timer-sensor ``` ### Testing Edge Cases 1. **Sensor restart with active rules:** - Create a rule - Stop the sensor (Ctrl+C) - Start the sensor again - Verify it loads and starts the timer for existing rules 2. **Multiple rules with different intervals:** - Create 3 rules with 5s, 10s, and 15s intervals - Verify all timers fire independently 3. **Rule updates:** - Update a rule's trigger_params - Currently requires disable/enable cycle - Future: should handle updates automatically 4. **Network failures:** - Stop the API service - Observe sensor logs (should show retry attempts) - Restart API - Verify sensor reconnects ## Debugging ### Enable Debug Logging ```bash export ATTUNE_LOG_LEVEL="debug" cargo run --package core-timer-sensor ``` ### Common Issues **"Failed to connect to Attune API"** - Verify API is running: `curl http://localhost:8080/health` - Check `ATTUNE_API_URL` is correct **"Failed to connect to RabbitMQ"** - Verify RabbitMQ is running: `rabbitmqctl status` - Check `ATTUNE_MQ_URL` is correct - Try: `amqp://guest:guest@localhost:5672/%2F` **"Insufficient permissions to create event"** - Service account system not yet implemented - Use a user token temporarily - Or wait for service account implementation **"Timer not firing"** - Check sensor logs for "Timer started for rule X" - Verify rule is enabled - Check trigger_params format is correct - Enable debug logging to see more details **"No timers loaded on startup"** - API endpoint `/rules?trigger_type=core.timer` not yet implemented - Create a rule after sensor starts - Timers will be managed via RabbitMQ messages ## Next Steps 1. **Implement Service Account System** - See `docs/service-accounts.md` 2. **Add Cron Timer Support** - Implement cron parsing and scheduling 3. **Add Tests** - Integration tests for full sensor workflow 4. **Add Metrics** - Prometheus metrics for monitoring 5. **Production Deployment** - systemd service, Docker image, Kubernetes deployment ## Resources - [Sensor Interface Specification](./sensor-interface.md) - [Service Accounts Documentation](./service-accounts.md) - [Timer Sensor README](../../crates/core-timer-sensor/README.md) - [Sensor Authentication Overview](./sensor-authentication-overview.md) ## Troubleshooting Tips ### View RabbitMQ Queues ```bash # List all queues rabbitmqadmin list queues # Should see: sensor.core.timer # View messages in queue rabbitmqadmin get queue=sensor.core.timer count=10 ``` ### View Sensor Queue Bindings ```bash # List bindings for sensor queue rabbitmqadmin list bindings | grep sensor.core.timer # Should see bindings for: # - rule.created # - rule.enabled # - rule.disabled # - rule.deleted ``` ### Monitor API Logs ```bash # In API terminal, should see: # "Published RuleCreated message for rule timer_every_5s" # "Published RuleEnabled message for rule timer_every_5s" # "Published RuleDisabled message for rule timer_every_5s" ``` ### Test Token Manually ```bash # Decode JWT to inspect claims echo "eyJhbGci..." | jq -R 'split(".") | .[1] | @base64d | fromjson' # Should show: { "sub": "sensor:core.timer", "scope": "sensor", "metadata": { "trigger_types": ["core.timer"] } } ``` ## Happy Hacking! 🚀