prefab-cloud-ruby 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b73b4ea9cec303d84c4e8cd05458a8373cfcb0b7
4
- data.tar.gz: 243c8d3dda441efd9b3f5741c6b52355a2256665
3
+ metadata.gz: 97b59b6c120b77f619a5ab78cd291dd984cc1332
4
+ data.tar.gz: 5c80408af949c1fe4a952ae5930c3d40e114af1b
5
5
  SHA512:
6
- metadata.gz: a2375b7451fcd3623a14dd74cdaf568521baa5e554b15f67d1675570a89783f5212938d6f5e2dc44afa4544709cda070d4b59c72dd7124a3f881f3d8ef34f02e
7
- data.tar.gz: b1032ec6c8953b2c0896367bd1276315271ba75c68b3f57134b082d35f8b2b972bf36e76546cf34bad48286eadba4cff4d32b2d774403cc550f6d26841a3ef6a
6
+ metadata.gz: b508f4349be914f86a3ee649c68e5c36f9331ac5088f59619517460773501c880c42c62249cc2b28698e1ad936a99a6a8e69bf5cede528ee5aa2202140494561
7
+ data.tar.gz: e0da01fbd83a8d55684daca9fa81327a2606ddc8d1cc5dce55e0d9167d02b8aca74b307de18999d1f5b5593e30c4fa8a4f562ec00b16fb60a2b9ad0f76975591
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.15
1
+ 0.0.16
data/lib/prefab/client.rb CHANGED
@@ -7,7 +7,7 @@ module Prefab
7
7
  attr_reader :account_id, :shared_cache, :stats, :namespace, :creds, :interceptor
8
8
 
9
9
  def initialize(api_key: ENV['PREFAB_API_KEY'],
10
- logger: nil,
10
+ logdev: nil,
11
11
  stats: nil, # receives increment("prefab.limitcheck", {:tags=>["policy_group:page_view", "pass:true"]})
12
12
  shared_cache: nil, # Something that quacks like Rails.cache ideally memcached
13
13
  local: false,
@@ -15,9 +15,7 @@ module Prefab
15
15
  )
16
16
  raise "No API key. Set PREFAB_API_KEY env var" if api_key.empty?
17
17
 
18
- @logger = (logger || Logger.new($stdout)).tap do |log|
19
- log.progname = "Prefab" if log.respond_to? :progname=
20
- end
18
+ @logdev = (logdev || $stdout)
21
19
  @local = local
22
20
  @stats = (stats || NoopStats.new)
23
21
  @shared_cache = (shared_cache || NoopCache.new)
@@ -48,12 +46,12 @@ module Prefab
48
46
  @feature_flag_client ||= Prefab::FeatureFlagClient.new(self)
49
47
  end
50
48
 
51
- def log(base_logger = @logger)
52
- @logger_client ||= Prefab::LoggerClient.new(base_logger)
49
+ def log
50
+ @logger_client ||= Prefab::LoggerClient.new(@logdev)
53
51
  end
54
52
 
55
53
  def log_internal(level, msg)
56
- log.log_for level, msg, "prefab"
54
+ log.log_internal msg, "prefab", nil, level
57
55
  end
58
56
 
59
57
  def request(service, method, req_options: {}, params: {})
@@ -67,7 +65,7 @@ module Prefab
67
65
  return stub_for(service, opts[:timeout]).send(method, *params)
68
66
  rescue => exception
69
67
 
70
- log_internal :warn, exception
68
+ log_internal Logger::WARN, exception
71
69
 
72
70
  if Time.now - start_time > opts[:timeout]
73
71
  raise exception
@@ -75,7 +73,7 @@ module Prefab
75
73
  sleep_seconds = [BASE_SLEEP_SEC * (2 ** (attempts - 1)), MAX_SLEEP_SEC].min
76
74
  sleep_seconds = sleep_seconds * (0.5 * (1 + rand()))
77
75
  sleep_seconds = [BASE_SLEEP_SEC, sleep_seconds].max
78
- log_internal :info, "Sleep #{sleep_seconds} and Reset #{service} #{method}"
76
+ log_internal Logger::INFO, "Sleep #{sleep_seconds} and Reset #{service} #{method}"
79
77
  sleep sleep_seconds
80
78
  reset!
81
79
  retry
@@ -75,11 +75,11 @@ module Prefab
75
75
  deltas.deltas.each do |delta|
76
76
  @config_loader.set(delta)
77
77
  end
78
- @base_client.log_internal :info, "Found checkpoint with highwater id #{@config_loader.highwater_mark}"
78
+ @base_client.log_internal Logger::INFO, "Found checkpoint with highwater id #{@config_loader.highwater_mark}"
79
79
  @config_resolver.update
80
80
  finish_init!
81
81
  else
82
- @base_client.log_internal :info, "No checkpoint"
82
+ @base_client.log_internal Logger::INFO, "No checkpoint"
83
83
  end
84
84
  end
85
85
 
@@ -88,11 +88,11 @@ module Prefab
88
88
  def save_checkpoint
89
89
  begin
90
90
  deltas = @config_resolver.export_api_deltas
91
- @base_client.log_internal :debug, "Save Checkpoint #{@config_loader.highwater_mark} Thread #{Thread.current.object_id}"
91
+ @base_client.log_internal Logger::DEBUG, "Save Checkpoint #{@config_loader.highwater_mark} Thread #{Thread.current.object_id}"
92
92
  @base_client.shared_cache.write(checkpoint_cache_key, Prefab::ConfigDeltas.encode(deltas))
93
93
  @base_client.shared_cache.write(checkpoint_highwater_cache_key, @config_loader.highwater_mark)
94
94
  rescue StandardError => exn
95
- @base_client.log_internal :info, "Issue Saving Checkpoint #{exn.message}"
95
+ @base_client.log_internal Logger::INFO, "Issue Saving Checkpoint #{exn.message}"
96
96
  end
97
97
  end
98
98
 
@@ -109,7 +109,7 @@ module Prefab
109
109
  sleep(delta)
110
110
  end
111
111
  rescue StandardError => exn
112
- @base_client.log_internal :info, "Issue Checkpointing #{exn.message}"
112
+ @base_client.log_internal Logger::INFO, "Issue Checkpointing #{exn.message}"
113
113
  end
114
114
  end
115
115
  end
@@ -122,20 +122,20 @@ module Prefab
122
122
  # one process "double check" by restarting the API thread
123
123
  def checkpoint_if_needed
124
124
  shared_highwater_mark = get_shared_highwater_mark
125
- @base_client.log_internal :debug, "Checkpoint_if_needed apx ahead/behind #{(@config_loader.highwater_mark - shared_highwater_mark) / (1000 * 10000)}"
125
+ @base_client.log_internal Logger::DEBUG, "Checkpoint_if_needed apx ahead/behind #{(@config_loader.highwater_mark - shared_highwater_mark) / (1000 * 10000)}"
126
126
 
127
127
  if shared_highwater_mark > @config_loader.highwater_mark
128
- @base_client.log_internal :debug, "We were behind, loading checkpoint"
128
+ @base_client.log_internal Logger::DEBUG, "We were behind, loading checkpoint"
129
129
  load_checkpoint
130
130
  elsif shared_highwater_mark < @config_loader.highwater_mark
131
- @base_client.log_internal :debug, "Saving off checkpoint"
131
+ @base_client.log_internal Logger::DEBUG, "Saving off checkpoint"
132
132
  save_checkpoint
133
133
  elsif shared_highwater_is_old?
134
134
  if get_shared_lock?
135
- @base_client.log_internal :debug, "Shared highwater mark > PREFAB_CHECKPOINT_MAX_AGE #{@checkpoint_max_age_secs}. We have been chosen to run suspenders"
135
+ @base_client.log_internal Logger::DEBUG, "Shared highwater mark > PREFAB_CHECKPOINT_MAX_AGE #{@checkpoint_max_age_secs}. We have been chosen to run suspenders"
136
136
  reset_api_connection
137
137
  else
138
- @base_client.log_internal :debug, "Shared highwater mark > PREFAB_CHECKPOINT_MAX_AGE #{@checkpoint_max_age_secs}. Other process is running suspenders"
138
+ @base_client.log_internal Logger::DEBUG, "Shared highwater mark > PREFAB_CHECKPOINT_MAX_AGE #{@checkpoint_max_age_secs}. Other process is running suspenders"
139
139
  end
140
140
  end
141
141
  end
@@ -146,7 +146,7 @@ module Prefab
146
146
 
147
147
  def shared_highwater_is_old?
148
148
  age = current_time_as_id - get_shared_highwater_mark
149
- @base_client.log_internal :debug, "shared_highwater_is_old? apx #{age / (1000 * 10000)}" if age > @checkpoint_max_age
149
+ @base_client.log_internal Logger::DEBUG, "shared_highwater_is_old? apx #{age / (1000 * 10000)}" if age > @checkpoint_max_age
150
150
  age > @checkpoint_max_age_secs
151
151
  end
152
152
 
@@ -181,7 +181,7 @@ module Prefab
181
181
  def start_api_connection_thread(start_at_id)
182
182
  config_req = Prefab::ConfigServicePointer.new(account_id: @base_client.account_id,
183
183
  start_at_id: start_at_id)
184
- @base_client.log_internal :debug, "start api connection thread #{start_at_id}"
184
+ @base_client.log_internal Logger::DEBUG, "start api connection thread #{start_at_id}"
185
185
  @api_connection_thread = Thread.new do
186
186
  while true do
187
187
  begin
@@ -194,7 +194,7 @@ module Prefab
194
194
  finish_init!
195
195
  end
196
196
  rescue => e
197
- @base_client.log_internal :info, ("config client encountered #{e.message} pausing #{RECONNECT_WAIT}")
197
+ @base_client.log_internal Logger::INFO, ("config client encountered #{e.message} pausing #{RECONNECT_WAIT}")
198
198
  reset
199
199
  sleep(RECONNECT_WAIT)
200
200
  end
@@ -66,10 +66,10 @@ module Prefab
66
66
 
67
67
  def load(filename)
68
68
  if File.exist? filename
69
- @base_client.log_internal :info, "Load #{filename}"
69
+ @base_client.log_internal Logger::INFO, "Load #{filename}"
70
70
  YAML.load_file(filename)
71
71
  else
72
- @base_client.log_internal :info, "No file #{filename}"
72
+ @base_client.log_internal Logger::INFO, "No file #{filename}"
73
73
  {}
74
74
  end
75
75
  end
@@ -1,52 +1,73 @@
1
1
  module Prefab
2
- class LoggerClient
2
+ class LoggerClient < Logger
3
3
 
4
4
  SEP = ".".freeze
5
5
  BASE = "log_level".freeze
6
6
 
7
- def initialize(base_logger)
8
- @base_logger = base_logger
7
+ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
8
+ progname: nil, formatter: nil, datetime_format: nil,
9
+ shift_period_suffix: '%Y%m%d')
10
+ super(logdev, shift_age, shift_size, { level: level,
11
+ progname: progname, formatter: formatter, datetime_format: datetime_format,
12
+ shift_period_suffix: shift_period_suffix })
9
13
  @config_client = BootstrappingConfigClient.new
10
14
  end
11
15
 
12
- def debug msg
13
- pf_log :debug, msg, caller_locations(1, 1)[0]
14
- end
16
+ def add(severity, message = nil, progname = nil)
15
17
 
16
- def info msg
17
- pf_log :info, msg, caller_locations(1, 1)[0]
18
- end
18
+ loc = caller_locations(2, 1)[0]
19
+ path = get_path(loc.absolute_path, loc.base_label)
19
20
 
20
- def warn msg
21
- pf_log :warn, msg, caller_locations(1, 1)[0]
21
+ return log_internal(message, path, progname, severity)
22
22
  end
23
23
 
24
- def error msg
25
- pf_log :error, msg, caller_locations(1, 1)[0]
24
+ def log_internal(message, path, progname, severity)
25
+ level = level_of(path)
26
+ progname = "#{path}: #{progname}"
27
+
28
+
29
+ severity ||= UNKNOWN
30
+ if @logdev.nil? or severity < level
31
+ return true
32
+ end
33
+ if progname.nil?
34
+ progname = @progname
35
+ end
36
+ if message.nil?
37
+ if block_given?
38
+ message = yield
39
+ else
40
+ message = progname
41
+ progname = @progname
42
+ end
43
+ end
44
+ @logdev.write(
45
+ format_message(format_severity(severity), Time.now, progname, message))
46
+ true
26
47
  end
27
48
 
28
- def log_for level, msg, loc
29
- pf_log_internal level, msg, "", loc
49
+ def debug?
50
+ true;
30
51
  end
31
52
 
32
- def level= lvl
33
- #noop
53
+ def info?
54
+ true;
34
55
  end
35
56
 
36
- def formatter
37
- @formatter ||= ActiveSupport::Logger::SimpleFormatter.new
57
+ def warn?
58
+ true;
38
59
  end
39
60
 
40
- def level
41
- :debug
61
+ def error?
62
+ true;
42
63
  end
43
64
 
44
- def debug?
45
- true
65
+ def fatal?
66
+ true;
46
67
  end
47
68
 
48
- def info?
49
- true
69
+ def level
70
+ DEBUG
50
71
  end
51
72
 
52
73
  def set_config_client(config_client)
@@ -55,18 +76,8 @@ module Prefab
55
76
 
56
77
  private
57
78
 
58
- def pf_log(level, msg, loc)
59
- pf_log_internal level, msg, loc.absolute_path, loc.base_label
60
- end
61
-
62
- def pf_log_internal(level, msg, absolute_path, base_label)
63
-
64
- path = absolute_path + ""
65
- path.slice! Dir.pwd
66
-
67
- path = "#{path.gsub("/", SEP).gsub(".rb", "")}#{SEP}#{base_label}"
68
- path.slice! SEP
69
-
79
+ # Find the closest match to 'log_level.path' in config
80
+ def level_of(path)
70
81
  closest_log_level_match = @config_client.get(BASE) || :warn
71
82
  path.split(SEP).inject([BASE]) do |memo, n|
72
83
  memo << n
@@ -76,23 +87,22 @@ module Prefab
76
87
  end
77
88
  memo
78
89
  end
90
+ val(closest_log_level_match)
91
+ end
79
92
 
80
- if val(closest_log_level_match) <= val(level)
81
- @base_logger.unknown "#{level.to_s.upcase.ljust(5)} #{path} #{msg}"
82
- end
93
+ # sanitize & clean the path of the caller so the key
94
+ # looks like log_level.app.models.user
95
+ def get_path(absolute_path, base_label)
96
+ path = absolute_path + ""
97
+ path.slice! Dir.pwd
98
+
99
+ path = "#{path.gsub("/", SEP).gsub(".rb", "")}#{SEP}#{base_label}"
100
+ path.slice! SEP
101
+ path
83
102
  end
84
103
 
85
104
  def val level
86
- case level.to_sym
87
- when :debug then
88
- 1
89
- when :info then
90
- 2
91
- when :warn then
92
- 3
93
- when :error then
94
- 4
95
- end
105
+ return Object.const_get("Logger::#{level.upcase}")
96
106
  end
97
107
  end
98
108
 
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: prefab-cloud-ruby 0.0.15 ruby lib
5
+ # stub: prefab-cloud-ruby 0.0.16 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "prefab-cloud-ruby".freeze
9
- s.version = "0.0.15"
9
+ s.version = "0.0.16"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jeff Dwyer".freeze]
14
- s.date = "2018-03-08"
14
+ s.date = "2018-03-12"
15
15
  s.description = "RateLimits & Config as a service".freeze
16
16
  s.email = "jdwyer@prefab.cloud".freeze
17
17
  s.extra_rdoc_files = [
@@ -44,7 +44,8 @@ Gem::Specification.new do |s|
44
44
  "test/test_config_loader.rb",
45
45
  "test/test_config_resolver.rb",
46
46
  "test/test_feature_flag_client.rb",
47
- "test/test_helper.rb"
47
+ "test/test_helper.rb",
48
+ "test/test_logger.rb"
48
49
  ]
49
50
  s.homepage = "http://github.com/prefab-cloud/prefab-cloud-ruby".freeze
50
51
  s.licenses = ["MIT".freeze]
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class TestCLogger < Minitest::Test
4
+ def setup
5
+ Prefab::LoggerClient.send(:public, :get_path)
6
+ Prefab::LoggerClient.send(:public, :level_of)
7
+ @logger = Prefab::LoggerClient.new($stdout)
8
+ end
9
+
10
+ def test_get_path
11
+ assert_equal "lib.test_l.foo_warn",
12
+ @logger.get_path("/Users/jeffdwyer/Documents/workspace/RateLimitInc/prefab-cloud-ruby/lib/test_l.rb",
13
+ "foo_warn")
14
+ end
15
+
16
+ def test_level_of
17
+ assert_equal Logger::INFO,
18
+ @logger.level_of("app.models.user"), "PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL is info"
19
+
20
+ @logger.set_config_client(MockConfigClient.new({}))
21
+ assert_equal Logger::WARN,
22
+ @logger.level_of("app.models.user"), "default is warn"
23
+
24
+ @logger.set_config_client(MockConfigClient.new("log_level.app" => "info"))
25
+ assert_equal Logger::INFO,
26
+ @logger.level_of("app.models.user")
27
+
28
+ @logger.set_config_client(MockConfigClient.new("log_level.app" => "debug"))
29
+ assert_equal Logger::DEBUG,
30
+ @logger.level_of("app.models.user")
31
+
32
+ @logger.set_config_client(MockConfigClient.new("log_level.app" => "debug",
33
+ "log_level.app.models" => "warn"))
34
+ assert_equal Logger::WARN,
35
+ @logger.level_of("app.models.user")
36
+ end
37
+ end
38
+
39
+ class MockConfigClient
40
+ def initialize(hash)
41
+ @hash = hash
42
+ end
43
+
44
+ def get(key)
45
+ @hash[key]
46
+ end
47
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prefab-cloud-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Dwyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-08 00:00:00.000000000 Z
11
+ date: 2018-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -162,6 +162,7 @@ files:
162
162
  - test/test_config_resolver.rb
163
163
  - test/test_feature_flag_client.rb
164
164
  - test/test_helper.rb
165
+ - test/test_logger.rb
165
166
  homepage: http://github.com/prefab-cloud/prefab-cloud-ruby
166
167
  licenses:
167
168
  - MIT