Class: Collavre::Orchestration::ResourceTracker
- Inherits:
-
Object
- Object
- Collavre::Orchestration::ResourceTracker
- Defined in:
- app/services/collavre/orchestration/resource_tracker.rb
Overview
ResourceTracker tracks per-agent resource usage for scheduling decisions.
Tracks:
-
Active jobs count (concurrency)
-
Daily token usage (quota)
-
Request rate (rate limiting)
Uses Rails.cache by default (memory-based). Can be extended to use Redis for multi-server deployments.
Usage:
tracker = ResourceTracker.for(agent)
tracker.active_jobs # => 2
tracker.can_accept_work? # => true/false
tracker.reserve!(job_id)
tracker.release!(job_id, tokens_used: 1500)
Constant Summary collapse
- CACHE_EXPIRY_ACTIVE_JOBS =
1.hour
- CACHE_EXPIRY_TOKENS =
2.days
- CACHE_EXPIRY_RATE =
2.minutes
Class Method Summary collapse
Instance Method Summary collapse
-
#active_jobs ⇒ Object
Current number of active jobs for this agent.
-
#initialize(agent) ⇒ ResourceTracker
constructor
A new instance of ResourceTracker.
-
#rate_limited?(limit) ⇒ Boolean
Check if rate limited (exceeds requests per minute).
-
#release!(job_id, tokens_used: 0) ⇒ Object
Release resources after job completion.
-
#requests_this_minute ⇒ Object
Requests in the current minute window.
-
#reserve!(job_id) ⇒ Object
Reserve resources for a job (call before starting work).
-
#reset! ⇒ Object
Reset all tracking (useful for testing).
-
#status ⇒ Object
Get current resource status.
-
#tokens_today ⇒ Object
Total tokens used today.
Constructor Details
#initialize(agent) ⇒ ResourceTracker
Returns a new instance of ResourceTracker.
33 34 35 36 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 33 def initialize(agent) @agent = agent @key_prefix = "orchestrator:agent:#{agent.id}" end |
Class Method Details
.for(agent) ⇒ Object
28 29 30 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 28 def for(agent) new(agent) end |
Instance Method Details
#active_jobs ⇒ Object
Current number of active jobs for this agent
39 40 41 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 39 def active_jobs active_job_set.size end |
#rate_limited?(limit) ⇒ Boolean
Check if rate limited (exceeds requests per minute)
54 55 56 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 54 def rate_limited?(limit) requests_this_minute >= limit end |
#release!(job_id, tokens_used: 0) ⇒ Object
Release resources after job completion
71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 71 def release!(job_id, tokens_used: 0) # Remove from active jobs jobs = active_job_set jobs.delete(job_id.to_s) cache_write(active_jobs_key, jobs, expires_in: CACHE_EXPIRY_ACTIVE_JOBS) # Add to daily token usage if tokens_used.positive? current_tokens = tokens_today cache_write(tokens_today_key, current_tokens + tokens_used, expires_in: CACHE_EXPIRY_TOKENS) end true end |
#requests_this_minute ⇒ Object
Requests in the current minute window
49 50 51 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 49 def requests_this_minute cache_read(rate_limit_key) || 0 end |
#reserve!(job_id) ⇒ Object
Reserve resources for a job (call before starting work)
59 60 61 62 63 64 65 66 67 68 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 59 def reserve!(job_id) jobs = active_job_set jobs.add(job_id.to_s) cache_write(active_jobs_key, jobs, expires_in: CACHE_EXPIRY_ACTIVE_JOBS) # Increment rate counter increment_rate_counter true end |
#reset! ⇒ Object
Reset all tracking (useful for testing)
96 97 98 99 100 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 96 def reset! Rails.cache.delete(active_jobs_key) Rails.cache.delete(tokens_today_key) Rails.cache.delete(rate_limit_key) end |
#status ⇒ Object
Get current resource status
87 88 89 90 91 92 93 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 87 def status { active_jobs: active_jobs, tokens_today: tokens_today, requests_this_minute: requests_this_minute } end |
#tokens_today ⇒ Object
Total tokens used today
44 45 46 |
# File 'app/services/collavre/orchestration/resource_tracker.rb', line 44 def tokens_today cache_read(tokens_today_key) || 0 end |