Enhance Metrics Collection System
Summary
Expand the metrics collection system to provide comprehensive observability for Runner-Q, taking inspiration from Temporal's metrics approach. Currently, only 4 basic counters are tracked. This enhancement will add duration metrics, gauges, histograms, and labeled metrics for better monitoring and debugging.
Current State
The system currently tracks only these metrics:
activity_completed - Activities completed successfully
activity_retry - Activities requesting retry
activity_failed_non_retry - Permanent failures
activity_timeout - Activities that timed out
Proposed Metrics
1. Activity Lifecycle Metrics (Counters)
2. Activity Execution Metrics (Durations/Histograms)
3. Queue Depth and Health (Gauges)
4. Worker Metrics
5. Retry and Failure Metrics
6. Redis/Queue Operations (Durations)
7. Scheduled Activities Processor
8. Reaper Metrics
9. Activity Type Metrics (Labeled/Tagged)
10. Idempotency Metrics
11. Error Classification
12. Throughput and Rate Metrics
Implementation Requirements
Phase 1: Core Infrastructure (High Priority)
-
Extend MetricsSink trait to support:
- Gauges (for current values like queue depth)
- Histograms (for duration distributions)
- Labels/tags (for activity_type, priority, etc.)
-
Add duration tracking at key points:
- Activity execution start/end
- Queue wait time (enqueue → start)
- Redis operation timings
-
Add gauge updates for:
- Queue depths (pending, processing, scheduled, dead_letter)
- Worker counts (active, idle)
- Priority breakdowns
Phase 2: Enhanced Metrics (Medium Priority)
- Add labeled metrics for activity type breakdown
- Add histogram metrics for latency distributions
- Add rate calculations for throughput metrics
Phase 3: Advanced Metrics (Low Priority)
- Add Redis operation metrics
- Add processor-specific metrics (scheduled, reaper)
- Add idempotency metrics
API Design Considerations
Option 1: Extend Current Trait
pub trait MetricsSink: Send + Sync + 'static {
fn inc_counter(&self, name: &str, value: u64);
fn observe_duration(&self, name: &str, duration: Duration);
// New methods
fn set_gauge(&self, name: &str, value: f64);
fn observe_histogram(&self, name: &str, value: f64);
fn inc_counter_with_labels(&self, name: &str, value: u64, labels: &[(&str, &str)]);
}
Option 2: Separate Traits
pub trait CounterSink: Send + Sync + 'static { ... }
pub trait GaugeSink: Send + Sync + 'static { ... }
pub trait HistogramSink: Send + Sync + 'static { ... }
Example Metric Names (Prometheus-style)
runnerq_activity_enqueued_total{activity_type="send_email",priority="high"}
runnerq_activity_completed_total{activity_type="send_email",status="success"}
runnerq_activity_duration_seconds{activity_type="send_email",quantile="0.95"}
runnerq_queue_depth{queue="pending",priority="critical"}
runnerq_worker_active_count
runnerq_activity_retry_count{activity_type="send_email",attempt="1"}
runnerq_redis_operation_duration_seconds{operation="enqueue"}
Priority Metrics to Implement First
- ✅ Activity execution duration (histogram)
- ✅ Queue wait time (histogram)
- ✅ Queue depth gauges (by status and priority)
- ✅ Activity type breakdown (labeled counters)
- ✅ Worker utilization (gauge)
- ✅ Retry attempt distribution (histogram)
Testing Considerations
- Ensure metrics don't impact performance significantly
- Test with NoopMetrics to verify zero overhead
- Add integration tests for metrics collection
- Verify metrics are correctly labeled and aggregated
Documentation
- Update README with new metrics
- Add examples for Prometheus integration
- Document metric naming conventions
- Provide guidance on metric interpretation
Related Issues
- Consider if this relates to any existing observability work
- May need to coordinate with UI dashboard updates
Acceptance Criteria
Enhance Metrics Collection System
Summary
Expand the metrics collection system to provide comprehensive observability for Runner-Q, taking inspiration from Temporal's metrics approach. Currently, only 4 basic counters are tracked. This enhancement will add duration metrics, gauges, histograms, and labeled metrics for better monitoring and debugging.
Current State
The system currently tracks only these metrics:
activity_completed- Activities completed successfullyactivity_retry- Activities requesting retryactivity_failed_non_retry- Permanent failuresactivity_timeout- Activities that timed outProposed Metrics
1. Activity Lifecycle Metrics (Counters)
activity_enqueued- Total activities enqueuedactivity_dequeued- Activities dequeued from queueactivity_started- Activities started executionactivity_scheduled- Activities scheduled for future executionactivity_requeued- Activities requeued (lease expiry, etc.)activity_dead_letter- Activities moved to dead letter queueactivity_lease_extended- Lease extensions2. Activity Execution Metrics (Durations/Histograms)
activity_execution_duration- Handler execution time (histogram)activity_queue_wait_time- Time from enqueue to start (histogram)activity_total_time- End-to-end time from enqueue to completion (histogram)activity_retry_delay- Backoff delay before retry (histogram)activity_schedule_delay- Time until scheduled execution (histogram)3. Queue Depth and Health (Gauges)
queue_pending_count- Current pending activitiesqueue_processing_count- Currently processing activitiesqueue_scheduled_count- Scheduled activities countqueue_dead_letter_count- Dead letter queue sizequeue_by_priority_{critical,high,normal,low}- Counts by priority level4. Worker Metrics
worker_active_count- Number of active workersworker_idle_count- Number of idle workersworker_utilization- Percentage of workers busyworker_dequeue_attempts- Dequeue attempts (with success/failure)worker_dequeue_empty- Empty queue polls5. Retry and Failure Metrics
activity_retry_count- Total retries (histogram by attempt number)activity_failure_rate- Failure rate by activity typeactivity_retry_rate- Retry rate by activity typeactivity_max_retries_exceeded- Activities that exceeded max retries6. Redis/Queue Operations (Durations)
redis_enqueue_duration- Enqueue operation timeredis_dequeue_duration- Dequeue operation timeredis_snapshot_write_duration- Snapshot write timeredis_snapshot_read_duration- Snapshot read timeredis_connection_pool_wait- Connection pool wait time7. Scheduled Activities Processor
scheduled_activities_processed- Scheduled activities moved to queuescheduled_activities_processor_duration- Processing cycle timescheduled_activities_processor_errors- Errors during processing8. Reaper Metrics
reaper_items_requeued- Items requeued from expired leasesreaper_cycle_duration- Reaper cycle timereaper_errors- Reaper errors9. Activity Type Metrics (Labeled/Tagged)
activity_type_{type}_completed- Completed by typeactivity_type_{type}_failed- Failed by typeactivity_type_{type}_duration- Execution duration by typeactivity_type_{type}_retry_count- Retries by type10. Idempotency Metrics
idempotency_key_conflicts- Idempotency conflictsidempotency_key_reused- Key reuse eventsidempotency_evaluation_duration- Idempotency check time11. Error Classification
error_type_retryable- Retryable errorserror_type_non_retryable- Non-retryable errorserror_type_timeout- Timeout errorserror_type_handler_not_found- Missing handler errors12. Throughput and Rate Metrics
activities_per_second- Throughput rateactivities_completed_per_second- Completion rateactivities_failed_per_second- Failure rateImplementation Requirements
Phase 1: Core Infrastructure (High Priority)
Extend MetricsSink trait to support:
Add duration tracking at key points:
Add gauge updates for:
Phase 2: Enhanced Metrics (Medium Priority)
Phase 3: Advanced Metrics (Low Priority)
API Design Considerations
Option 1: Extend Current Trait
Option 2: Separate Traits
Example Metric Names (Prometheus-style)
Priority Metrics to Implement First
Testing Considerations
Documentation
Related Issues
Acceptance Criteria