Class: Collavre::Orchestration::ResourceTracker

Inherits:
Object
  • Object
show all
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

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_jobsObject

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)

Returns:

  • (Boolean)


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_minuteObject

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

#statusObject

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_todayObject

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