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 +4 -4
- data/VERSION +1 -1
- data/lib/prefab/client.rb +7 -9
- data/lib/prefab/config_client.rb +13 -13
- data/lib/prefab/config_loader.rb +2 -2
- data/lib/prefab/logger_client.rb +60 -50
- data/prefab-cloud-ruby.gemspec +5 -4
- data/test/test_logger.rb +47 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97b59b6c120b77f619a5ab78cd291dd984cc1332
|
4
|
+
data.tar.gz: 5c80408af949c1fe4a952ae5930c3d40e114af1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b508f4349be914f86a3ee649c68e5c36f9331ac5088f59619517460773501c880c42c62249cc2b28698e1ad936a99a6a8e69bf5cede528ee5aa2202140494561
|
7
|
+
data.tar.gz: e0da01fbd83a8d55684daca9fa81327a2606ddc8d1cc5dce55e0d9167d02b8aca74b307de18999d1f5b5593e30c4fa8a4f562ec00b16fb60a2b9ad0f76975591
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
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
|
-
|
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
|
-
@
|
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
|
52
|
-
@logger_client ||= Prefab::LoggerClient.new(
|
49
|
+
def log
|
50
|
+
@logger_client ||= Prefab::LoggerClient.new(@logdev)
|
53
51
|
end
|
54
52
|
|
55
53
|
def log_internal(level, msg)
|
56
|
-
log.
|
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
|
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
|
76
|
+
log_internal Logger::INFO, "Sleep #{sleep_seconds} and Reset #{service} #{method}"
|
79
77
|
sleep sleep_seconds
|
80
78
|
reset!
|
81
79
|
retry
|
data/lib/prefab/config_client.rb
CHANGED
@@ -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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
data/lib/prefab/config_loader.rb
CHANGED
@@ -66,10 +66,10 @@ module Prefab
|
|
66
66
|
|
67
67
|
def load(filename)
|
68
68
|
if File.exist? filename
|
69
|
-
@base_client.log_internal
|
69
|
+
@base_client.log_internal Logger::INFO, "Load #{filename}"
|
70
70
|
YAML.load_file(filename)
|
71
71
|
else
|
72
|
-
@base_client.log_internal
|
72
|
+
@base_client.log_internal Logger::INFO, "No file #{filename}"
|
73
73
|
{}
|
74
74
|
end
|
75
75
|
end
|
data/lib/prefab/logger_client.rb
CHANGED
@@ -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(
|
8
|
-
|
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
|
13
|
-
pf_log :debug, msg, caller_locations(1, 1)[0]
|
14
|
-
end
|
16
|
+
def add(severity, message = nil, progname = nil)
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
end
|
18
|
+
loc = caller_locations(2, 1)[0]
|
19
|
+
path = get_path(loc.absolute_path, loc.base_label)
|
19
20
|
|
20
|
-
|
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
|
25
|
-
|
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
|
29
|
-
|
49
|
+
def debug?
|
50
|
+
true;
|
30
51
|
end
|
31
52
|
|
32
|
-
def
|
33
|
-
|
53
|
+
def info?
|
54
|
+
true;
|
34
55
|
end
|
35
56
|
|
36
|
-
def
|
37
|
-
|
57
|
+
def warn?
|
58
|
+
true;
|
38
59
|
end
|
39
60
|
|
40
|
-
def
|
41
|
-
|
61
|
+
def error?
|
62
|
+
true;
|
42
63
|
end
|
43
64
|
|
44
|
-
def
|
45
|
-
true
|
65
|
+
def fatal?
|
66
|
+
true;
|
46
67
|
end
|
47
68
|
|
48
|
-
def
|
49
|
-
|
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
|
-
|
59
|
-
|
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
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
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
|
|
data/prefab-cloud-ruby.gemspec
CHANGED
@@ -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.
|
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.
|
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-
|
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]
|
data/test/test_logger.rb
ADDED
@@ -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.
|
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-
|
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
|