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