Class: EventMeter::Reports

Inherits:
Object
  • Object
show all
Defined in:
lib/event_meter/reports.rb

Constant Summary collapse

DEFAULT_SERIES_SECONDS =
3600

Instance Method Summary collapse

Constructor Details

#initialize(configuration:, rollup_storage:) ⇒ Reports

Returns a new instance of Reports.



7
8
9
10
# File 'lib/event_meter/reports.rb', line 7

def initialize(configuration:, rollup_storage:)
  @configuration = configuration
  @rollup_storage = rollup_storage
end

Instance Method Details

#compare(name, version:, before:, after:, by: {}) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/event_meter/reports.rb', line 44

def compare(name, version:, before:, after:, by: {})
  before_from, before_to = comparison_window(before)
  after_from, after_to = comparison_window(after)

  {
    before: summary(name, version: version, from: before_from, to: before_to, by: by),
    after: summary(name, version: version, from: after_from, to: after_to, by: by)
  }
end

#series(name, version:, from: nil, to: nil, every: :minute, by: {}) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/event_meter/reports.rb', line 25

def series(name, version:, from: nil, to: nil, every: :minute, by: {})
  every = TimeBuckets.normalize(every)
  to = to ? time_value(to) : TimeBuckets.time(Time.now.utc, every) + TimeBuckets.seconds(every)
  from = time_value(from) if from
  from ||= to - DEFAULT_SERIES_SECONDS
  validate_window!(from, to)

  definition = report_definition(name, version)
  index = definition.index_for!(by)
  buckets = TimeBuckets.between(from, to, every)
  keys = buckets.map { |bucket| rollup_key(definition, every, bucket, index) }
  raw_rollups = @rollup_storage.hgetall_many(keys)
  seconds = TimeBuckets.seconds(every)

  buckets.zip(raw_rollups).map do |bucket, raw|
    Rollup.from_hash(raw).to_h(seconds: seconds).merge(bucket: bucket.iso8601)
  end
end

#summary(name, version:, from: nil, to: nil, by: {}) ⇒ Object

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/event_meter/reports.rb', line 12

def summary(name, version:, from: nil, to: nil, by: {})
  raise ArgumentError, "pass both from: and to:, or neither" if from.nil? != to.nil?
  from = time_value(from) if from
  to = time_value(to) if to
  validate_window!(from, to) if from && to

  definition = report_definition(name, version)
  index = definition.index_for!(by)
  keys, seconds = summary_keys(definition, from: from, to: to, index: index)

  Rollup.combine(@rollup_storage.hgetall_many(keys)).to_h(seconds: seconds)
end