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 +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
|