class ZSpec::Tracker

Attributes

alltime_failures_hash_name[R]
current_failures_hash_name[R]
runtimes_hash_name[R]
threshold[R]

Public Class Methods

new(build_prefix:, sink:, threshold:, hostname:) click to toggle source
# File lib/zspec/tracker.rb, line 5
def initialize(build_prefix:, sink:, threshold:, hostname:)
  @sink                       = sink
  @threshold                  = threshold
  @hostname                   = hostname
  @runtimes_hash_name         = "runtimes:v1"
  @alltime_failures_hash_name = "failures:v1"
  @current_failures_hash_name = build_prefix + ":failures"
  @sequence_hash_name         = build_prefix + ":sequence"
end

Public Instance Methods

all_runtimes() click to toggle source
# File lib/zspec/tracker.rb, line 36
def all_runtimes
  @sink.hgetall(@runtimes_hash_name)
end
alltime_failures() click to toggle source
# File lib/zspec/tracker.rb, line 40
def alltime_failures
  parse_failures(
    @sink.hgetall(@alltime_failures_hash_name)
  )
  .select(&method(:filter_by_threshold))
  .sort_by(&method(:failure_count))
  .reverse
end
cleanup(expire_seconds = EXPIRE_SECONDS) click to toggle source
# File lib/zspec/tracker.rb, line 57
def cleanup(expire_seconds = EXPIRE_SECONDS)
  @sink.expire(@current_failures_hash_name, expire_seconds)
  @sink.expire(@sequence_hash_name, expire_seconds)
end
count_key(message) click to toggle source
# File lib/zspec/tracker.rb, line 66
def count_key(message)
  "#{message}:count"
end
current_failures() click to toggle source
# File lib/zspec/tracker.rb, line 49
def current_failures
  parse_failures(
    @sink.hgetall(@current_failures_hash_name)
  )
  .sort_by(&method(:failure_count))
  .reverse
end
sequence_key(message) click to toggle source
# File lib/zspec/tracker.rb, line 70
def sequence_key(message)
  "#{message}:sequence"
end
time_key(message) click to toggle source
# File lib/zspec/tracker.rb, line 62
def time_key(message)
  "#{message}:time"
end
track_failures(failures) click to toggle source
# File lib/zspec/tracker.rb, line 25
def track_failures(failures)
  failures.map { |h| h[:id] }.each do |message|
    @sink.hincrby(@alltime_failures_hash_name, count_key(message), 1)
    @sink.hset(@alltime_failures_hash_name, time_key(message), @sink.time.first)

    @sink.hincrby(@current_failures_hash_name, count_key(message), 1)
    @sink.hset(@current_failures_hash_name, time_key(message), @sink.time.first)
    @sink.hset(@current_failures_hash_name, sequence_key(message), sequence)
  end
end
track_runtime(message, runtime) click to toggle source
# File lib/zspec/tracker.rb, line 21
def track_runtime(message, runtime)
  @sink.hset(@runtimes_hash_name, message, runtime)
end
track_sequence(message) click to toggle source
# File lib/zspec/tracker.rb, line 15
def track_sequence(message)
  sequence = (@sink.hget(@sequence_hash_name, @hostname) || "").split(",")
  sequence << message
  @sink.hset(@sequence_hash_name, @hostname, sequence.join(","))
end

Private Instance Methods

failure_count(failure) click to toggle source
# File lib/zspec/tracker.rb, line 97
def failure_count(failure)
  failure["count"].to_i
end
filter_by_threshold(failure) click to toggle source
# File lib/zspec/tracker.rb, line 93
def filter_by_threshold(failure)
  (@sink.time.first - failure["last_failure"].to_i) < @threshold
end
parse_failures(failures) click to toggle source
# File lib/zspec/tracker.rb, line 80
def parse_failures(failures)
  memo = {}
  failures.each do |key, value|
    message = key.gsub(/\:time|\:count|\:sequence/, '')
    memo[message] ||= {}
    memo[message]["message"] = message
    memo[message]["count"] = value.to_i if key.end_with?(":count")
    memo[message]["last_failure"] = value.to_i if key.end_with?(":time")
    memo[message]["sequence"] = value.split(",") if key.end_with?(":sequence")
  end
  memo.values
end
sequence() click to toggle source
# File lib/zspec/tracker.rb, line 76
def sequence
  @sink.hget(@sequence_hash_name, @hostname) || ""
end