module L2Metable

Constants

VERSION

Public Instance Methods

count(subcomponent, value=1, extras ={}) click to toggle source
# File lib/l2metable.rb, line 64
def count(subcomponent, value=1, extras ={})
  comp = log_component(subcomponent)
  log_hash({("count#"+ comp) => value}.merge(extras))
end
dotted(*pieces) click to toggle source
# File lib/l2metable.rb, line 106
def dotted(*pieces)
  (pieces.reject { |e| e.nil? || (e.respond_to?('empty?') && e.empty?) }).join('.')
end
join_hash(hash = {}) click to toggle source
# File lib/l2metable.rb, line 90
def join_hash(hash = {})
  hash.map do |k, v|
    if v.is_a? Float
      # workaround for old Ruby version on Bamboo not having parameterized round()
      v = (v * 1000).round() / 1000.0
    elsif v.to_s =~ /\s/
      v = "\"#{v}\""
    end
    "#{k}=#{v}"
  end.join(" ")
end
log_base_hash() click to toggle source

Descendants should override and implement a specific base hash for all log lines, if applicable e.g. {:app_id => @app_id, :xid => context.xid}

# File lib/l2metable.rb, line 15
def log_base_hash()
  {}
end
log_component(subcomponent) click to toggle source

Descendants should override and implement a specific component prefix for all log lines e.g. “widget#{subcomponent}”

# File lib/l2metable.rb, line 8
def log_component(subcomponent)
  subcomponent
end
log_exception(subcomponent, e, extras = {}) click to toggle source
# File lib/l2metable.rb, line 69
def log_exception(subcomponent, e, extras = {})
  exception_suffix = "exception"
  extras = {:at => dotted(log_component(subcomponent), exception_suffix)}.merge(extras)

  if e.nil? || !e.is_a?(Exception)
    measure(exception_suffix, 1, extras)
    return
  end

  exception_id = e.object_id.abs
  trace = e.backtrace.reduce do |memo, line|
    memo + line.gsub(/[`'"]/, "") + "\n"
  end
  measure(exception_suffix, 1, {
    :exception_id => exception_id,
    :class => e.class,
    :message => e.message,
    :trace => trace
  }.merge(extras))
end
log_hash(hash = {}) click to toggle source
# File lib/l2metable.rb, line 102
def log_hash(hash = {})
  log_write(join_hash(log_base_hash.merge(hash)))
end
log_write(msg) click to toggle source

Descendants should override and implement a specific log handler e.g. @logger.write(full_msg)

# File lib/l2metable.rb, line 22
def log_write(msg)
  puts msg
end
measure(subcomponent, value, extras = {}) click to toggle source
# File lib/l2metable.rb, line 54
def measure(subcomponent, value, extras = {})
  comp = log_component(subcomponent)
  log_hash({("measure#"+ comp) => value}.merge(extras))
end
monitor(subcomponent, extras = {}) { || ... } click to toggle source
# File lib/l2metable.rb, line 26
def monitor(subcomponent, extras = {}, &blk)
  unless block_given?
    # should never enter, but logging with something obvious instead of blowing up at runtime
    measure(dotted(subcomponent, "MONITOR_WITHOUT_BLOCK"), 1, extras)
    return
  end

  start = Time.now
  measure(dotted(subcomponent, "start"), 1, extras)

  res = nil
  ex = nil
  begin
    res = yield
  rescue => e
    log_exception(subcomponent, e, extras)
    ex = e
  end

  measure(dotted(subcomponent, "time"), Time.now - start, extras)

  if ex
    raise(ex)
  else
    res
  end
end
sample(subcomponent, value, extras = {}) click to toggle source
# File lib/l2metable.rb, line 59
def sample(subcomponent, value, extras = {})
  comp = log_component(subcomponent)
  log_hash({("sample#"+ comp) => value}.merge(extras))
end