Module: Philiprehberger::JobMeter

Defined in:
lib/philiprehberger/job_meter.rb,
lib/philiprehberger/job_meter/stats.rb,
lib/philiprehberger/job_meter/bucket.rb,
lib/philiprehberger/job_meter/report.rb,
lib/philiprehberger/job_meter/version.rb,
lib/philiprehberger/job_meter/exporter.rb,
lib/philiprehberger/job_meter/collector.rb,
lib/philiprehberger/job_meter/histogram.rb

Defined Under Namespace

Modules: Exporter, Histogram, Report, Stats Classes: Bucket, Collector

Constant Summary collapse

VERSION =
'0.4.0'

Class Method Summary collapse

Class Method Details

.clear!(job_class) ⇒ Object



43
44
45
46
47
48
# File 'lib/philiprehberger/job_meter.rb', line 43

def clear!(job_class)
  cleared = @collector.clear!(job_class)
  bucket = @buckets.delete(job_class)
  bucket&.reset!
  cleared
end

.histogram(job_class, buckets:) ⇒ Object



68
69
70
71
72
73
# File 'lib/philiprehberger/job_meter.rb', line 68

def histogram(job_class, buckets:)
  data = @collector.entries(job_class)
  return nil unless data

  Histogram.compute(data[:durations], buckets)
end

.measure(job_class, tags: {}) ⇒ Object

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/philiprehberger/job_meter.rb', line 23

def measure(job_class, tags: {})
  raise ArgumentError, 'measure requires a block' unless block_given?

  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  success = true
  begin
    yield
  rescue StandardError
    success = false
    raise
  ensure
    duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
    record(job_class, duration: duration, success: success, tags: tags)
  end
end

.record(job_class, duration:, success:, tags: {}) ⇒ Object



18
19
20
21
# File 'lib/philiprehberger/job_meter.rb', line 18

def record(job_class, duration:, success:, tags: {})
  @collector.record(job_class, duration: duration, success: success, tags: tags)
  (@buckets[job_class] ||= Bucket.new).record(duration: duration, success: success)
end

.reset!Object



91
92
93
94
95
# File 'lib/philiprehberger/job_meter.rb', line 91

def reset!
  @collector.reset!
  @buckets.each_value(&:reset!)
  @buckets.clear
end

.stats(job_class, tags: {}) ⇒ Object



61
62
63
64
65
66
# File 'lib/philiprehberger/job_meter.rb', line 61

def stats(job_class, tags: {})
  data = @collector.entries(job_class, tags: tags)
  return nil unless data

  Stats.compute(data[:durations], data[:successes])
end

.tag_values(job_class, key) ⇒ Object



39
40
41
# File 'lib/philiprehberger/job_meter.rb', line 39

def tag_values(job_class, key)
  @collector.tag_values(job_class, key)
end

.to_json_exportObject



79
80
81
# File 'lib/philiprehberger/job_meter.rb', line 79

def to_json_export
  Exporter.to_json_export(@collector)
end

.to_prometheusObject



75
76
77
# File 'lib/philiprehberger/job_meter.rb', line 75

def to_prometheus
  Exporter.to_prometheus(@collector)
end

.top_failing(num = 5) ⇒ Object



87
88
89
# File 'lib/philiprehberger/job_meter.rb', line 87

def top_failing(num = 5)
  Report.top_failing(@collector, num)
end

.top_slowest(num = 5) ⇒ Object



83
84
85
# File 'lib/philiprehberger/job_meter.rb', line 83

def top_slowest(num = 5)
  Report.top_slowest(@collector, num)
end


50
51
52
53
54
55
56
57
58
59
# File 'lib/philiprehberger/job_meter.rb', line 50

def trending(job_class)
  bucket = @buckets[job_class]
  unless bucket
    return Bucket::WINDOWS.each_with_object({}) do |(label, _), h|
      h[label] = { avg_duration: 0.0, success_rate: 0.0, total: 0, failed: 0 }
    end
  end

  bucket.trending
end