Class: AppMap::HookLog

Inherits:
Object show all
Defined in:
lib/appmap/hook_log.rb

Constant Summary collapse

LOG =
(ENV['APPMAP_DEBUG'] == 'true' || ENV['DEBUG'] == 'true')
LOG_HOOK =
(ENV['DEBUG_HOOK'] == 'true' || ENV['APPMAP_LOG_HOOK'] == 'true')
LOG_HOOK_FILE =
(ENV['APPMAP_LOG_HOOK_FILE'] || 'appmap_hook.log')

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeHookLog

Returns a new instance of HookLog.



7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/appmap/hook_log.rb', line 7

def initialize
  @file_handle = self.class.send :open_log_file
  @elapsed = Hash.new { |h, k| h[k] = [] }

  at_exit do
    @file_handle.puts 'Elapsed time:'
    @elapsed.keys.each do |k|
      @file_handle.puts "#{k}:\t#{@elapsed[k].sum}"
    end
    @file_handle.flush
    @file_handle.close
  end
end

Class Method Details

.builtin(class_name, &block) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/appmap/hook_log.rb', line 40

def builtin(class_name, &block)
  return yield unless enabled?

  begin
    log "eager\tbegin\tInitiating eager hook for #{class_name}"
    @hook_log.start_time :eager

    yield
  ensure
    @hook_log.end_time :eager
    log "eager\tend\tCompleted eager hook for #{class_name}"
  end
end

.enabled?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/appmap/hook_log.rb', line 36

def enabled?
  LOG || LOG_HOOK
end

.load_error(name, msg) ⇒ Object



68
69
70
# File 'lib/appmap/hook_log.rb', line 68

def load_error(name, msg)
  log "load_error\t#{name}\t#{msg}"
end

.log(msg) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/appmap/hook_log.rb', line 72

def log(msg)
  unless HookLog.enabled?
    warn "AppMap: HookLog is not enabled. Disregarding message #{msg}"
    return
  end

  @hook_log ||= HookLog.new
  @hook_log.log msg
end

.on_load(location, &block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/appmap/hook_log.rb', line 54

def on_load(location, &block)
  return yield unless enabled?

  begin
    log "on-load\tbegin\tInitiating on-load hook for class or module defined at location #{location}"
    @hook_log.start_time :on_load

    yield
  ensure
    @hook_log.end_time :on_load
    log "on-load\tend\tCompleted on-load hook for location #{location}"
  end
end

Instance Method Details

#end_time(timer) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/appmap/hook_log.rb', line 25

def end_time(timer)
  unless @elapsed[timer].last.is_a?(Array)
    warn "AppMap: Unbalanced timing data in hook log"
    @elapsed[timer].pop
    return
  end

  @elapsed[timer][-1] = Util.gettime - @elapsed[timer].last[0]
end

#log(msg) ⇒ Object



91
92
93
94
95
96
97
# File 'lib/appmap/hook_log.rb', line 91

def log(msg)
  if LOG_HOOK_FILE == 'stderr'
    msg = "AppMap: #{msg}"
  end
  msg = "#{Util.gettime}\t#{msg}"
  @file_handle.puts(msg)
end

#start_time(timer) ⇒ Object



21
22
23
# File 'lib/appmap/hook_log.rb', line 21

def start_time(timer)
  @elapsed[timer] << [Util.gettime]
end