prefab-cloud-ruby 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
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