Class: CanvasStatsd::BlockTracking

Inherits:
Object
  • Object
show all
Defined in:
lib/canvas_statsd/block_tracking.rb

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.loggerObject

Returns the value of attribute logger.



6
7
8
# File 'lib/canvas_statsd/block_tracking.rb', line 6

def logger
  @logger
end

Class Method Details

.track(key, category: nil, statsd: CanvasStatsd::Statsd, only: nil) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/canvas_statsd/block_tracking.rb', line 8

def track(key, category: nil, statsd: CanvasStatsd::Statsd, only: nil)
  cookies = if only
              Array(only).map { |name| [name, Counter.counters[name].start] }
            else
              Counter.counters.map { |(name, counter)| [name, counter.start] }
            end
  block_stat = CanvasStatsd::BlockStat.new(key, statsd)
  stack(category).push(block_stat) if category

  result = nil
  elapsed = Benchmark.realtime do
    result = yield
  end
  # to be consistent with ActionPack, measure in milliseconds
  elapsed *= 1000

  block_stat.stats = cookies.map { |(name, cookie)| [name, Counter.counters[name].finalize_count(cookie)] }.to_h
  block_stat.stats['total'] = elapsed
  # we need to make sure to report exclusive timings, even if nobody called us re-entrantly
  block_stat.subtract_exclusives({}) if category
  block_stat.report
  logger.log(block_stat, "STATSD #{key}") if logger
  # -1 is ourselves; we want to subtract from the block above us
  stack(category)[-2].subtract_exclusives(block_stat.stats) if category && stack(category)[-2]

  result
ensure
  stack(category).pop if category && stack(category).last == block_stat
end