From 97f873869c0f5927d926f515138ec4f4e3407e4c Mon Sep 17 00:00:00 2001 From: Julik Tarkhanov Date: Fri, 2 Mar 2018 00:08:11 +0100 Subject: [PATCH] Use Logger block form calls When blocks are used, and the set logging level of the Logger object is above that of the call, the block will not be executed. This prevents string allocations in log messages that would not be retained anyway, which can be especially significant when calling `inspect` on large-ish objects. For rationale, see http://hawkins.io/2013/08/using-the-ruby-logger/ and https://stackoverflow.com/questions/30144317 --- lib/ldclient-rb/evaluation.rb | 2 +- lib/ldclient-rb/events.rb | 8 ++++---- lib/ldclient-rb/ldclient.rb | 30 +++++++++++++++--------------- lib/ldclient-rb/polling.rb | 12 ++++++------ lib/ldclient-rb/redis_store.rb | 16 ++++++++-------- lib/ldclient-rb/requestor.rb | 8 ++++---- lib/ldclient-rb/stream.rb | 18 +++++++++--------- 7 files changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/ldclient-rb/evaluation.rb b/lib/ldclient-rb/evaluation.rb index 5ff32dc4..2b98c648 100644 --- a/lib/ldclient-rb/evaluation.rb +++ b/lib/ldclient-rb/evaluation.rb @@ -156,7 +156,7 @@ def eval_internal(flag, user, store, events) failed_prereq = true end rescue => exn - @config.logger.error("[LDClient] Error evaluating prerequisite: #{exn.inspect}") + @config.logger.error { "[LDClient] Error evaluating prerequisite: #{exn.inspect}" } failed_prereq = true end end diff --git a/lib/ldclient-rb/events.rb b/lib/ldclient-rb/events.rb index f4874538..84ea0275 100644 --- a/lib/ldclient-rb/events.rb +++ b/lib/ldclient-rb/events.rb @@ -50,9 +50,9 @@ def post_flushed_events(events) req.options.open_timeout = @config.connect_timeout end if res.status < 200 || res.status >= 300 - @config.logger.error("[LDClient] Unexpected status code while processing events: #{res.status}") + @config.logger.error { "[LDClient] Unexpected status code while processing events: #{res.status}" } if res.status == 401 - @config.logger.error("[LDClient] Received 401 error, no further events will be posted since SDK key is invalid") + @config.logger.error { "[LDClient] Received 401 error, no further events will be posted since SDK key is invalid" } stop end end @@ -78,14 +78,14 @@ def add_event(event) if @queue.length < @config.capacity event[:creationDate] = (Time.now.to_f * 1000).to_i - @config.logger.debug("[LDClient] Enqueueing event: #{event.to_json}") + @config.logger.debug { "[LDClient] Enqueueing event: #{event.to_json}" } @queue.push(event) if !@worker.alive? @worker = create_worker end else - @config.logger.warn("[LDClient] Exceeded event queue capacity. Increase capacity to avoid dropping events.") + @config.logger.warn { "[LDClient] Exceeded event queue capacity. Increase capacity to avoid dropping events." } end end diff --git a/lib/ldclient-rb/ldclient.rb b/lib/ldclient-rb/ldclient.rb index 973b043c..2c91bd60 100644 --- a/lib/ldclient-rb/ldclient.rb +++ b/lib/ldclient-rb/ldclient.rb @@ -31,7 +31,7 @@ def initialize(sdk_key, config = Config.default, wait_for_sec = 5) @event_processor = EventProcessor.new(sdk_key, config) if @config.use_ldd? - @config.logger.info("[LDClient] Started LaunchDarkly Client in LDD mode") + @config.logger.info { "[LDClient] Started LaunchDarkly Client in LDD mode" } return # requestor and update processor are not used in this mode end @@ -41,8 +41,8 @@ def initialize(sdk_key, config = Config.default, wait_for_sec = 5) if @config.stream? @update_processor = StreamProcessor.new(sdk_key, config, requestor) else - @config.logger.info("Disabling streaming API") - @config.logger.warn("You should only disable the streaming API if instructed to do so by LaunchDarkly support") + @config.logger.info { "Disabling streaming API" } + @config.logger.warn { "You should only disable the streaming API if instructed to do so by LaunchDarkly support" } @update_processor = PollingProcessor.new(config, requestor) end @update_processor.start @@ -54,7 +54,7 @@ def initialize(sdk_key, config = Config.default, wait_for_sec = 5) initialized? end rescue WaitUtil::TimeoutError - @config.logger.error("[LDClient] Timeout encountered waiting for LaunchDarkly client initialization") + @config.logger.error { "[LDClient] Timeout encountered waiting for LaunchDarkly client initialization" } end end end @@ -64,7 +64,7 @@ def flush end def toggle?(key, user, default = False) - @config.logger.warn("[LDClient] toggle? is deprecated. Use variation instead") + @config.logger.warn { "[LDClient] toggle? is deprecated. Use variation instead" } variation(key, user, default) end @@ -114,16 +114,16 @@ def variation(key, user, default) return default if @config.offline? unless user - @config.logger.error("[LDClient] Must specify user") + @config.logger.error { "[LDClient] Must specify user" } @event_processor.add_event(kind: "feature", key: key, value: default, default: default, user: user) return default end if !initialized? if @store.initialized? - @config.logger.warn("[LDClient] Client has not finished initializing; using last known values from feature store") + @config.logger.warn { "[LDClient] Client has not finished initializing; using last known values from feature store" } else - @config.logger.error("[LDClient] Client has not finished initializing; feature store unavailable, returning default value") + @config.logger.error { "[LDClient] Client has not finished initializing; feature store unavailable, returning default value" } @event_processor.add_event(kind: "feature", key: key, value: default, default: default, user: user) return default end @@ -133,7 +133,7 @@ def variation(key, user, default) feature = @store.get(FEATURES, key) if feature.nil? - @config.logger.info("[LDClient] Unknown feature flag #{key}. Returning default value") + @config.logger.info { "[LDClient] Unknown feature flag #{key}. Returning default value" } @event_processor.add_event(kind: "feature", key: key, value: default, default: default, user: user) return default end @@ -149,12 +149,12 @@ def variation(key, user, default) @event_processor.add_event(kind: "feature", key: key, user: user, value: res[:value], default: default, version: feature[:version]) return res[:value] else - @config.logger.debug("[LDClient] Result value is null in toggle") + @config.logger.debug { "[LDClient] Result value is null in toggle" } @event_processor.add_event(kind: "feature", key: key, user: user, value: default, default: default, version: feature[:version]) return default end rescue => exn - @config.logger.warn("[LDClient] Error evaluating feature flag: #{exn.inspect}. \nTrace: #{exn.backtrace}") + @config.logger.warn { "[LDClient] Error evaluating feature flag: #{exn.inspect}. \nTrace: #{exn.backtrace}" } @event_processor.add_event(kind: "feature", key: key, user: user, value: default, default: default, version: feature[:version]) return default end @@ -192,7 +192,7 @@ def all_flags(user) return Hash.new if @config.offline? unless user - @config.logger.error("[LDClient] Must specify user in all_flags") + @config.logger.error { "[LDClient] Must specify user in all_flags" } return Hash.new end @@ -202,7 +202,7 @@ def all_flags(user) # TODO rescue if necessary Hash[features.map{ |k, f| [k, evaluate(f, user, @store)[:value]] }] rescue => exn - @config.logger.warn("[LDClient] Error evaluating all flags: #{exn.inspect}. \nTrace: #{exn.backtrace}") + @config.logger.warn { "[LDClient] Error evaluating all flags: #{exn.inspect}. \nTrace: #{exn.backtrace}" } return Hash.new end end @@ -212,7 +212,7 @@ def all_flags(user) # # @return [void] def close - @config.logger.info("[LDClient] Closing LaunchDarkly client...") + @config.logger.info { "[LDClient] Closing LaunchDarkly client..." } if not @config.offline? @update_processor.stop end @@ -223,7 +223,7 @@ def close def log_exception(caller, exn) error_traceback = "#{exn.inspect} #{exn}\n\t#{exn.backtrace.join("\n\t")}" error = "[LDClient] Unexpected exception in #{caller}: #{error_traceback}" - @config.logger.error(error) + @config.logger.error { error } end def sanitize_user(user) diff --git a/lib/ldclient-rb/polling.rb b/lib/ldclient-rb/polling.rb index 00cf5e8e..cc391bca 100644 --- a/lib/ldclient-rb/polling.rb +++ b/lib/ldclient-rb/polling.rb @@ -17,7 +17,7 @@ def initialized? def start return unless @started.make_true - @config.logger.info("[LDClient] Initializing polling connection") + @config.logger.info { "[LDClient] Initializing polling connection" } create_worker end @@ -26,7 +26,7 @@ def stop if @worker && @worker.alive? @worker.raise "shutting down client" end - @config.logger.info("[LDClient] Polling connection stopped") + @config.logger.info { "[LDClient] Polling connection stopped" } end end @@ -38,14 +38,14 @@ def poll SEGMENTS => all_data[:segments] }) if @initialized.make_true - @config.logger.info("[LDClient] Polling connection initialized") + @config.logger.info { "[LDClient] Polling connection initialized" } end end end def create_worker @worker = Thread.new do - @config.logger.debug("[LDClient] Starting polling worker") + @config.logger.debug { "[LDClient] Starting polling worker" } while !@stopped.value do begin started_at = Time.now @@ -55,10 +55,10 @@ def create_worker sleep(delta) end rescue InvalidSDKKeyError - @config.logger.error("[LDClient] Received 401 error, no further polling requests will be made since SDK key is invalid"); + @config.logger.error { "[LDClient] Received 401 error, no further polling requests will be made since SDK key is invalid" }; stop rescue StandardError => exn - @config.logger.error("[LDClient] Exception while polling: #{exn.inspect}") + @config.logger.error { "[LDClient] Exception while polling: #{exn.inspect}" } # TODO: log_exception(__method__.to_s, exn) end end diff --git a/lib/ldclient-rb/redis_store.rb b/lib/ldclient-rb/redis_store.rb index 2374eb23..ad2991f2 100644 --- a/lib/ldclient-rb/redis_store.rb +++ b/lib/ldclient-rb/redis_store.rb @@ -94,12 +94,12 @@ def self.default_prefix def get(kind, key) f = @cache[cache_key(kind, key)] if f.nil? - @logger.debug("RedisFeatureStore: no cache hit for #{key} in '#{kind[:namespace]}', requesting from Redis") + @logger.debug { "RedisFeatureStore: no cache hit for #{key} in '#{kind[:namespace]}', requesting from Redis" } f = with_connection do |redis| begin get_redis(kind, redis, key.to_sym) rescue => e - @logger.error("RedisFeatureStore: could not retrieve #{key} from Redis in '#{kind[:namespace]}', with error: #{e}") + @logger.error { "RedisFeatureStore: could not retrieve #{key} from Redis in '#{kind[:namespace]}', with error: #{e}" } nil end end @@ -108,10 +108,10 @@ def get(kind, key) end end if f.nil? - @logger.debug("RedisFeatureStore: #{key} not found in '#{kind[:namespace]}'") + @logger.debug { "RedisFeatureStore: #{key} not found in '#{kind[:namespace]}'" } nil elsif f[:deleted] - @logger.debug("RedisFeatureStore: #{key} was deleted in '#{kind[:namespace]}', returning nil") + @logger.debug { "RedisFeatureStore: #{key} was deleted in '#{kind[:namespace]}', returning nil" } nil else f @@ -124,7 +124,7 @@ def all(kind) begin hashfs = redis.hgetall(items_key(kind)) rescue => e - @logger.error("RedisFeatureStore: could not retrieve all '#{kind[:namespace]}' items from Redis with error: #{e}; returning none") + @logger.error { "RedisFeatureStore: could not retrieve all '#{kind[:namespace]}' items from Redis with error: #{e}; returning none" } hashfs = {} end hashfs.each do |k, jsonItem| @@ -169,7 +169,7 @@ def init(all_data) end end @inited.set(true) - @logger.info("RedisFeatureStore: initialized with #{count} items") + @logger.info { "RedisFeatureStore: initialized with #{count} items" } end def upsert(kind, item) @@ -219,7 +219,7 @@ def get_redis(kind, redis, key) json_item = redis.hget(items_key(kind), key) JSON.parse(json_item, symbolize_names: true) if json_item rescue => e - @logger.error("RedisFeatureStore: could not retrieve #{key} from Redis, error: #{e}") + @logger.error { "RedisFeatureStore: could not retrieve #{key} from Redis, error: #{e}" } nil end end @@ -232,7 +232,7 @@ def put_redis_and_cache(kind, redis, key, item) begin redis.hset(items_key(kind), key, item.to_json) rescue => e - @logger.error("RedisFeatureStore: could not store #{key} in Redis, error: #{e}") + @logger.error { "RedisFeatureStore: could not store #{key} in Redis, error: #{e}" } end put_cache(kind, key.to_sym, item) end diff --git a/lib/ldclient-rb/requestor.rb b/lib/ldclient-rb/requestor.rb index 27ce822e..abaab854 100644 --- a/lib/ldclient-rb/requestor.rb +++ b/lib/ldclient-rb/requestor.rb @@ -42,20 +42,20 @@ def make_request(path) end end - @config.logger.debug("[LDClient] Got response from uri: #{uri}\n\tstatus code: #{res.status}\n\theaders: #{res.headers}\n\tbody: #{res.body}") + @config.logger.debug { "[LDClient] Got response from uri: #{uri}\n\tstatus code: #{res.status}\n\theaders: #{res.headers}\n\tbody: #{res.body}" } if res.status == 401 - @config.logger.error("[LDClient] Invalid SDK key") + @config.logger.error { "[LDClient] Invalid SDK key" } raise InvalidSDKKeyError end if res.status == 404 - @config.logger.error("[LDClient] Resource not found") + @config.logger.error { "[LDClient] Resource not found" } return nil end if res.status < 200 || res.status >= 300 - @config.logger.error("[LDClient] Unexpected status code #{res.status}") + @config.logger.error { "[LDClient] Unexpected status code #{res.status}" } return nil end diff --git a/lib/ldclient-rb/stream.rb b/lib/ldclient-rb/stream.rb index 1986abf7..4ec1052a 100644 --- a/lib/ldclient-rb/stream.rb +++ b/lib/ldclient-rb/stream.rb @@ -33,7 +33,7 @@ def initialized? def start return unless @started.make_true - @config.logger.info("[LDClient] Initializing stream connection") + @config.logger.info { "[LDClient] Initializing stream connection" } headers = { @@ -48,9 +48,9 @@ def start conn.on(INDIRECT_PUT) { |message| process_message(message, INDIRECT_PUT) } conn.on(INDIRECT_PATCH) { |message| process_message(message, INDIRECT_PATCH) } conn.on_error { |err| - @config.logger.error("[LDClient] Unexpected status code #{err[:status_code]} from streaming connection") + @config.logger.error { "[LDClient] Unexpected status code #{err[:status_code]} from streaming connection" } if err[:status_code] == 401 - @config.logger.error("[LDClient] Received 401 error, no further streaming connection will be made since SDK key is invalid") + @config.logger.error { "[LDClient] Received 401 error, no further streaming connection will be made since SDK key is invalid" } stop end } @@ -60,21 +60,21 @@ def start def stop if @stopped.make_true @es.close - @config.logger.info("[LDClient] Stream connection stopped") + @config.logger.info { "[LDClient] Stream connection stopped" } end end def stop if @stopped.make_true @es.close - @config.logger.info("[LDClient] Stream connection stopped") + @config.logger.info { "[LDClient] Stream connection stopped" } end end private def process_message(message, method) - @config.logger.debug("[LDClient] Stream received #{method} message: #{message.data}") + @config.logger.debug { "[LDClient] Stream received #{method} message: #{message.data}" } if method == PUT message = JSON.parse(message.data, symbolize_names: true) @feature_store.init({ @@ -82,7 +82,7 @@ def process_message(message, method) SEGMENTS => message[:data][:segments] }) @initialized.make_true - @config.logger.info("[LDClient] Stream initialized") + @config.logger.info { "[LDClient] Stream initialized" } elsif method == PATCH message = JSON.parse(message.data, symbolize_names: true) for kind in [FEATURES, SEGMENTS] @@ -108,7 +108,7 @@ def process_message(message, method) SEGMENTS => all_data[:segments] }) @initialized.make_true - @config.logger.info("[LDClient] Stream initialized (via indirect message)") + @config.logger.info { "[LDClient] Stream initialized (via indirect message)" } elsif method == INDIRECT_PATCH key = key_for_path(FEATURES, message.data) if key @@ -120,7 +120,7 @@ def process_message(message, method) end end else - @config.logger.warn("[LDClient] Unknown message received: #{method}") + @config.logger.warn { "[LDClient] Unknown message received: #{method}" } end end