From c8d354a3f722465f9aa80c44930c17871ec7a00d Mon Sep 17 00:00:00 2001 From: Eric Lindvall Date: Thu, 22 Mar 2012 23:27:20 -0700 Subject: [PATCH 1/2] Experiment with making the logger write on a time rounded to the interval --- lib/metriks/reporter/logger.rb | 38 ++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/metriks/reporter/logger.rb b/lib/metriks/reporter/logger.rb index 596db13..9ae7425 100644 --- a/lib/metriks/reporter/logger.rb +++ b/lib/metriks/reporter/logger.rb @@ -7,22 +7,20 @@ def initialize(options = {}) @log_level = options[:log_level] || ::Logger::INFO @prefix = options[:prefix] || 'metriks:' - @registry = options[:registry] || Metriks::Registry.default - @interval = options[:interval] || 60 - @on_error = options[:on_error] || proc { |ex| } + @registry = options[:registry] || Metriks::Registry.default + @time_tracker = TimeTracker.new(options[:interval] || 60) + @on_error = options[:on_error] || proc { |ex| } end def start @thread ||= Thread.new do loop do - sleep @interval - - Thread.new do - begin - write - rescue Exception => ex - @on_error[ex] rescue nil - end + @time_tracker.sleep + + begin + write + rescue Exception => ex + @on_error[ex] rescue nil end end end @@ -114,5 +112,23 @@ def format_message(args) end end.join(' ') end + + class TimeTracker + def initialize(interval) + @interval = interval + @next_time = Time.now.to_f + end + + def sleep + sleep_time = next_time - Time.now.to_f + Kernel.sleep(sleep_time) + end + + def next_time + now = Time.now.to_f + @next_time = now if @next_time <= now + @next_time += @interval - (@next_time % @interval) + end + end end end \ No newline at end of file From 087e606d4de935198814423178d91bd5cf19dcd2 Mon Sep 17 00:00:00 2001 From: Eric Lindvall Date: Thu, 22 Mar 2012 23:29:57 -0700 Subject: [PATCH 2/2] Make sure the sleep time is positive before sleeping --- lib/metriks/reporter/logger.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/metriks/reporter/logger.rb b/lib/metriks/reporter/logger.rb index 9ae7425..6c7135b 100644 --- a/lib/metriks/reporter/logger.rb +++ b/lib/metriks/reporter/logger.rb @@ -121,7 +121,9 @@ def initialize(interval) def sleep sleep_time = next_time - Time.now.to_f - Kernel.sleep(sleep_time) + if sleep_time > 0 + Kernel.sleep(sleep_time) + end end def next_time