class Resilient::CircuitBreaker::Metrics

Constants

StorageFailureKeys
StorageKeys
StorageSuccessKeys

Attributes

bucket_size_in_seconds[R]
buckets[R]
storage[R]
window_size_in_seconds[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 24
def initialize(options = {})
  @window_size_in_seconds = options.fetch(:window_size_in_seconds, 60)
  @bucket_size_in_seconds = options.fetch(:bucket_size_in_seconds, 10)
  @window_size = WindowSize.new(@window_size_in_seconds)
  @bucket_size = BucketSize.new(@bucket_size_in_seconds)
  @storage = options.fetch(:storage) { Storage::Memory.new }
  @buckets = []
end

Public Instance Methods

failure() click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 47
def failure
  @storage.increment(current_bucket, StorageFailureKeys)
  prune_buckets
  nil
end
reset() click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 53
def reset
  @storage.prune(@buckets, StorageKeys)
  nil
end
success() click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 41
def success
  @storage.increment(current_bucket, StorageSuccessKeys)
  prune_buckets
  nil
end
under_error_threshold_percentage?(error_threshold_percentage) click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 37
def under_error_threshold_percentage?(error_threshold_percentage)
  error_percentage < error_threshold_percentage
end
under_request_volume_threshold?(request_volume_threshold) click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 33
def under_request_volume_threshold?(request_volume_threshold)
  requests < request_volume_threshold
end

Private Instance Methods

current_bucket(timestamp = Time.now.to_i) click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 82
def current_bucket(timestamp = Time.now.to_i)
  bucket = @buckets.detect { |bucket| bucket.include?(timestamp) }
  return bucket if bucket

  bucket = @bucket_size.bucket(timestamp)
  @buckets.push bucket

  bucket
end
error_percentage() click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 69
def error_percentage
  prune_buckets

  result = @storage.sum(@buckets, StorageKeys)
  successes = result[:successes]
  failures = result[:failures]

  requests = successes + failures
  return 0 if failures == 0 || requests == 0

  (failures / requests.to_f) * 100
end
prune_buckets(timestamp = Time.now.to_i) click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 92
def prune_buckets(timestamp = Time.now.to_i)
  pruned_buckets = []
  bucket_range = BucketRange.generate(timestamp, @window_size, @bucket_size)

  @buckets.delete_if { |bucket|
    if bucket_range.prune?(bucket)
      pruned_buckets << bucket
      true
    end
  }

  if pruned_buckets.any?
    @storage.prune(pruned_buckets, StorageKeys)
  end
end
requests() click to toggle source
# File lib/resilient/circuit_breaker/metrics.rb, line 60
def requests
  prune_buckets
  requests = 0
  @storage.sum(@buckets, StorageKeys).each do |key, value|
    requests += value
  end
  requests
end