392 lines
9.0 KiB
Markdown
392 lines
9.0 KiB
Markdown
# 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! 🚀 |