class MetricsLogger::MetricsLogger

Constants

TIMEOUT

Public Class Methods

configuration() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 11
def self.configuration
  @configuration ||= Configuration.new
end
configure() { |configuration| ... } click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 15
def self.configure
  yield(configuration)
end
enqueue(type, metric) click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 40
def self.enqueue(type, metric)
  key = metric.to_a[0][0]
  value = metric.to_a[0][1]
  puts caller.inspect if value.nil?

  sub_type = "#{type}.#{key}"

  if queue[sub_type].nil?
    Mutex.new.synchronize do
      queue[sub_type] ||= ThreadSafe::Array.new
    end
  end

  queue[sub_type].push value
  nil
end
log(type, metrics) click to toggle source

Class Methods

# File lib/metrics_logger/metrics_logger.rb, line 28
def self.log(type, metrics)
  metrics.each do |key, value|
    self.enqueue(type, key => value)
  end
end
log_duration(type) { || ... } click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 34
def self.log_duration(type, &blk)
  logger = self.new
  yield
  logger.log_duration(type)
end
new() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 7
def initialize
  @start_time_in_milliseconds = Time.now.to_f * 1000
end
queue() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 57
def self.queue
  if @queue.nil?
    Mutex.new.synchronize do
      @queue ||= ThreadSafe::Hash.new
    end
  else
    @queue
  end
end
reset() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 77
def self.reset
  @queue = ThreadSafe::Hash.new
  @sampling_definitions = ThreadSafe::Array.new
end
sample(name, options = {}) click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 119
def self.sample(name, options = {})
  sampling_definitions << {name: name, object: options[:object], method: options[:method]}
end
sampling_definitions() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 67
def self.sampling_definitions
  if @sampling_definitions.nil?
    Mutex.new.synchronize do
      @sampling_definitions ||= ThreadSafe::Array.new
    end
  else
    @sampling_definitions
  end
end
send_data(data) click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 107
def self.send_data(data)
  begin
    Timeout::timeout(TIMEOUT) { Faraday.post(configuration.endpoint, data.to_json) }
  rescue
    begin
      Timeout::timeout(TIMEOUT) { Faraday.post(configuration.backup_endpoint, data.to_json) }
    rescue
      puts "#{Time.now} Cannot reach metrics server."
    end
  end
end
start() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 123
def self.start
  raise "Must specify app name in MetricsLogger configuration" unless configuration.app_name
  raise "Must specify endpoint in MetricsLogger configuration" unless configuration.endpoint

  while true
    sleep configuration.sync_interval
    sync
  end
end
sync() click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 82
def self.sync
  @queue, batched_data = ThreadSafe::Hash.new, queue

  data = []
  timestamp = (Time.now.to_f * 1000).to_i
  app_name = configuration.app_name

  batched_data.each do |sub_type, values|
    total = values.compact.inject(:+)
    count = values.count
    average = total.to_f / count

    data << {metric: "#{app_name}.#{sub_type}.total", timestamp: timestamp, value: total, tags: configuration.tags}
    data << {metric: "#{app_name}.#{sub_type}.count", timestamp: timestamp, value: count, tags: configuration.tags}
    data << {metric: "#{app_name}.#{sub_type}.average", timestamp: timestamp, value: average, tags: configuration.tags}
  end

  sampling_definitions.each do |defintion|
    value = defintion[:object].send(defintion[:method])
    data << {metric: "#{app_name}.#{defintion[:name]}", timestamp: timestamp, value: value, tags: configuration.tags}
  end

  send_data(data) if data[0]
end

Public Instance Methods

log_duration(type) click to toggle source
# File lib/metrics_logger/metrics_logger.rb, line 19
def log_duration(type)
  end_time = Time.now
  end_time_in_milliseconds = end_time.to_f * 1000
  duration = end_time_in_milliseconds - @start_time_in_milliseconds
  metric = {duration: duration}
  self.class.enqueue(type, metric)
end