prefab-cloud-ruby 0.24.2 → 0.24.4
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/.github/workflows/ruby.yml +1 -1
- data/.rubocop.yml +13 -0
- data/CHANGELOG.md +76 -0
- data/Gemfile.lock +4 -4
- data/VERSION +1 -1
- data/bin/console +21 -0
- data/compile_protos.sh +6 -0
- data/lib/prefab/client.rb +25 -4
- data/lib/prefab/config_client.rb +16 -6
- data/lib/prefab/config_loader.rb +1 -1
- data/lib/prefab/config_resolver.rb +2 -4
- data/lib/prefab/config_value_wrapper.rb +18 -0
- data/lib/prefab/context.rb +22 -2
- data/lib/prefab/context_shape.rb +20 -0
- data/lib/prefab/context_shape_aggregator.rb +63 -0
- data/lib/prefab/criteria_evaluator.rb +61 -41
- data/lib/prefab/evaluated_configs_aggregator.rb +60 -0
- data/lib/prefab/evaluated_keys_aggregator.rb +41 -0
- data/lib/prefab/local_config_parser.rb +13 -13
- data/lib/prefab/log_path_aggregator.rb +64 -0
- data/lib/prefab/logger_client.rb +29 -16
- data/lib/prefab/options.rb +46 -1
- data/lib/prefab/periodic_sync.rb +51 -0
- data/lib/prefab/time_helpers.rb +7 -0
- data/lib/prefab-cloud-ruby.rb +8 -1
- data/lib/prefab_pb.rb +33 -220
- data/prefab-cloud-ruby.gemspec +21 -5
- data/test/test_config_loader.rb +15 -15
- data/test/test_config_resolver.rb +102 -102
- data/test/test_config_value_unwrapper.rb +13 -13
- data/test/test_context.rb +42 -0
- data/test/test_context_shape.rb +51 -0
- data/test/test_context_shape_aggregator.rb +137 -0
- data/test/test_criteria_evaluator.rb +253 -150
- data/test/test_evaluated_configs_aggregator.rb +254 -0
- data/test/test_evaluated_keys_aggregator.rb +54 -0
- data/test/test_helper.rb +34 -2
- data/test/test_log_path_aggregator.rb +57 -0
- data/test/test_logger.rb +61 -76
- data/test/test_weighted_value_resolver.rb +2 -2
- metadata +21 -5
- data/lib/prefab/log_path_collector.rb +0 -102
- data/test/test_log_path_collector.rb +0 -58
data/test/test_logger.rb
CHANGED
@@ -10,10 +10,10 @@ class TestLogger < Minitest::Test
|
|
10
10
|
WRONG_ENV_VALUE = 'ERROR'
|
11
11
|
PROJECT_ENV_ID = 1
|
12
12
|
|
13
|
-
DEFAULT_ROW =
|
13
|
+
DEFAULT_ROW = PrefabProto::ConfigRow.new(
|
14
14
|
values: [
|
15
|
-
|
16
|
-
value:
|
15
|
+
PrefabProto::ConditionalValue.new(
|
16
|
+
value: PrefabProto::ConfigValue.new(log_level: DEFAULT_VALUE)
|
17
17
|
)
|
18
18
|
]
|
19
19
|
)
|
@@ -85,46 +85,47 @@ class TestLogger < Minitest::Test
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def test_log_internal
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
prefab, io = captured_logger
|
89
|
+
prefab.log.log_internal('test message', 'test.path', '', ::Logger::WARN)
|
90
|
+
assert_logged io, 'WARN', "cloud.prefab.client.test.path", "test message"
|
91
91
|
end
|
92
92
|
|
93
93
|
def test_log_internal_unknown
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
prefab, io = captured_logger
|
95
|
+
prefab.log.log_internal('test message', 'test.path', '', ::Logger::UNKNOWN)
|
96
|
+
assert_logged io, 'ANY', "cloud.prefab.client.test.path", "test message"
|
97
97
|
end
|
98
98
|
|
99
99
|
def test_log_internal_silencing
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
logger.log_internal('should not log', 'test.path', '', ::Logger::WARN)
|
100
|
+
prefab, io = captured_logger
|
101
|
+
prefab.log.silence do
|
102
|
+
prefab.log.log_internal('should not log', 'test.path', '', ::Logger::WARN)
|
104
103
|
end
|
105
|
-
|
106
|
-
|
104
|
+
prefab.log.log_internal('should log', 'test.path', '', ::Logger::WARN)
|
105
|
+
assert_logged io, 'WARN', "cloud.prefab.client.test.path", "should log"
|
106
|
+
refute_logged io, 'should not log'
|
107
107
|
end
|
108
108
|
|
109
109
|
def test_log
|
110
|
-
|
111
|
-
|
112
|
-
|
110
|
+
prefab, io = captured_logger
|
111
|
+
prefab.log.log('test message', 'test.path', '', ::Logger::WARN)
|
112
|
+
assert_logged io, 'WARN', "test.path", "test message"
|
113
113
|
end
|
114
114
|
|
115
115
|
def test_log_unknown
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
prefab, io = captured_logger
|
117
|
+
prefab.log.log('test message', 'test.path', '', ::Logger::UNKNOWN)
|
118
|
+
assert_logged io, 'ANY', "test.path", "test message"
|
119
119
|
end
|
120
120
|
|
121
121
|
def test_log_silencing
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
prefab, io = captured_logger
|
123
|
+
prefab.log.silence do
|
124
|
+
prefab.log.log('should not log', 'test.path', '', ::Logger::WARN)
|
125
125
|
end
|
126
|
-
|
127
|
-
|
126
|
+
prefab.log.log('should log', 'test.path', '', ::Logger::WARN)
|
127
|
+
assert_logged io, 'WARN', "test.path", "should log"
|
128
|
+
refute_logged io, 'should not log'
|
128
129
|
end
|
129
130
|
|
130
131
|
def test_logging_with_prefix
|
@@ -163,7 +164,7 @@ class TestLogger < Minitest::Test
|
|
163
164
|
prefab.log.progname = 'MY_PROGNAME'
|
164
165
|
prefab.log.error message
|
165
166
|
|
166
|
-
assert_logged io, 'ERROR', 'MY_PROGNAME test.test_logger.test_logging_with_a_progname', message
|
167
|
+
assert_logged io, 'ERROR', 'MY_PROGNAME: test.test_logger.test_logging_with_a_progname', message
|
167
168
|
end
|
168
169
|
|
169
170
|
def test_logging_with_a_progname_and_no_message
|
@@ -172,50 +173,50 @@ class TestLogger < Minitest::Test
|
|
172
173
|
prefab.log.progname = 'MY_PROGNAME'
|
173
174
|
prefab.log.error
|
174
175
|
|
175
|
-
assert_logged io, 'ERROR', 'MY_PROGNAME test.test_logger.test_logging_with_a_progname_and_no_message', 'MY_PROGNAME'
|
176
|
+
assert_logged io, 'ERROR', 'MY_PROGNAME: test.test_logger.test_logging_with_a_progname_and_no_message', 'MY_PROGNAME'
|
176
177
|
end
|
177
178
|
|
178
179
|
def test_logging_with_criteria_on_top_level_key
|
179
180
|
prefix = 'my.own.prefix'
|
180
181
|
|
181
|
-
config =
|
182
|
+
config = PrefabProto::Config.new(
|
182
183
|
key: 'log-level',
|
183
184
|
rows: [
|
184
185
|
DEFAULT_ROW,
|
185
186
|
|
186
187
|
# wrong env
|
187
|
-
|
188
|
+
PrefabProto::ConfigRow.new(
|
188
189
|
project_env_id: TEST_ENV_ID,
|
189
190
|
values: [
|
190
|
-
|
191
|
+
PrefabProto::ConditionalValue.new(
|
191
192
|
criteria: [
|
192
|
-
|
193
|
-
operator:
|
193
|
+
PrefabProto::Criterion.new(
|
194
|
+
operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
|
194
195
|
value_to_match: string_list(['hotmail.com', 'gmail.com']),
|
195
196
|
property_name: 'user.email_suffix'
|
196
197
|
)
|
197
198
|
],
|
198
|
-
value:
|
199
|
+
value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
|
199
200
|
)
|
200
201
|
]
|
201
202
|
),
|
202
203
|
|
203
204
|
# correct env
|
204
|
-
|
205
|
+
PrefabProto::ConfigRow.new(
|
205
206
|
project_env_id: PROJECT_ENV_ID,
|
206
207
|
values: [
|
207
|
-
|
208
|
+
PrefabProto::ConditionalValue.new(
|
208
209
|
criteria: [
|
209
|
-
|
210
|
-
operator:
|
210
|
+
PrefabProto::Criterion.new(
|
211
|
+
operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
|
211
212
|
value_to_match: string_list(['hotmail.com', 'gmail.com']),
|
212
213
|
property_name: 'user.email_suffix'
|
213
214
|
)
|
214
215
|
],
|
215
|
-
value:
|
216
|
+
value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
|
216
217
|
),
|
217
|
-
|
218
|
-
value:
|
218
|
+
PrefabProto::ConditionalValue.new(
|
219
|
+
value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
|
219
220
|
)
|
220
221
|
]
|
221
222
|
)
|
@@ -271,56 +272,56 @@ class TestLogger < Minitest::Test
|
|
271
272
|
def test_logging_with_criteria_on_key_path
|
272
273
|
prefix = 'my.own.prefix'
|
273
274
|
|
274
|
-
config =
|
275
|
+
config = PrefabProto::Config.new(
|
275
276
|
key: 'log-level.my.own.prefix.test.test_logger',
|
276
277
|
rows: [
|
277
278
|
DEFAULT_ROW,
|
278
279
|
|
279
280
|
# wrong env
|
280
|
-
|
281
|
+
PrefabProto::ConfigRow.new(
|
281
282
|
project_env_id: TEST_ENV_ID,
|
282
283
|
values: [
|
283
|
-
|
284
|
+
PrefabProto::ConditionalValue.new(
|
284
285
|
criteria: [
|
285
|
-
|
286
|
-
operator:
|
286
|
+
PrefabProto::Criterion.new(
|
287
|
+
operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
|
287
288
|
value_to_match: string_list(['hotmail.com', 'gmail.com']),
|
288
289
|
property_name: 'email_suffix'
|
289
290
|
)
|
290
291
|
],
|
291
|
-
value:
|
292
|
+
value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
|
292
293
|
)
|
293
294
|
]
|
294
295
|
),
|
295
296
|
|
296
297
|
# correct env
|
297
|
-
|
298
|
+
PrefabProto::ConfigRow.new(
|
298
299
|
project_env_id: PROJECT_ENV_ID,
|
299
300
|
values: [
|
300
|
-
|
301
|
+
PrefabProto::ConditionalValue.new(
|
301
302
|
criteria: [
|
302
|
-
|
303
|
-
operator:
|
303
|
+
PrefabProto::Criterion.new(
|
304
|
+
operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
|
304
305
|
value_to_match: string_list(['hotmail.com', 'gmail.com']),
|
305
306
|
property_name: 'user.email_suffix'
|
306
307
|
)
|
307
308
|
],
|
308
|
-
value:
|
309
|
+
value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
|
309
310
|
),
|
310
311
|
|
311
|
-
|
312
|
+
PrefabProto::ConditionalValue.new(
|
312
313
|
criteria: [
|
313
|
-
|
314
|
-
operator:
|
314
|
+
PrefabProto::Criterion.new(
|
315
|
+
operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF,
|
315
316
|
value_to_match: string_list(%w[user:4567]),
|
316
317
|
property_name: 'user.tracking_id'
|
317
318
|
)
|
318
319
|
],
|
319
|
-
value:
|
320
|
+
value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
|
320
321
|
),
|
321
322
|
|
322
|
-
|
323
|
-
value:
|
323
|
+
PrefabProto::ConditionalValue.new(
|
324
|
+
value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE)
|
324
325
|
)
|
325
326
|
]
|
326
327
|
)
|
@@ -399,35 +400,19 @@ class TestLogger < Minitest::Test
|
|
399
400
|
raise 'THIS WILL NEVER BE EVALUATED'
|
400
401
|
end
|
401
402
|
|
402
|
-
assert_logged io, 'ERROR', 'test.test_logger.test_logging_with_a_block',
|
403
|
+
assert_logged io, 'ERROR', 'test.test_logger.test_logging_with_a_block', message
|
403
404
|
end
|
404
405
|
|
405
406
|
private
|
406
407
|
|
407
408
|
def assert_logged(logged_io, level, path, message)
|
408
|
-
assert_match(/#{level}\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-+]?\d+:\s+#{path}
|
409
|
+
assert_match(/#{level}\s+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-+]?\d+:\s+#{path} #{message}\n/, logged_io.string)
|
409
410
|
end
|
410
411
|
|
411
412
|
def refute_logged(logged_io, message)
|
412
413
|
refute_match(/#{message}/, logged_io.string)
|
413
414
|
end
|
414
415
|
|
415
|
-
def mock_logger_expecting(pattern, configs = {}, calls: 1)
|
416
|
-
mock_logdev = Minitest::Mock.new
|
417
|
-
mock_logdev.expect :write, nil do |arg|
|
418
|
-
pattern.match(arg)
|
419
|
-
end
|
420
|
-
|
421
|
-
calls.times.each do
|
422
|
-
mock_logdev.expect(:nil?, false)
|
423
|
-
end
|
424
|
-
|
425
|
-
logger = Prefab::LoggerClient.new($stdout)
|
426
|
-
logger.instance_variable_set('@logdev', mock_logdev)
|
427
|
-
logger.set_config_client(MockConfigClient.new(configs))
|
428
|
-
[logger, mock_logdev]
|
429
|
-
end
|
430
|
-
|
431
416
|
def captured_logger(options = {})
|
432
417
|
io = StringIO.new
|
433
418
|
options = Prefab::Options.new(**options.merge(
|
@@ -58,8 +58,8 @@ class TestWeightedValueResolver < Minitest::Test
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def weighted_value(string, weight)
|
61
|
-
|
62
|
-
value:
|
61
|
+
PrefabProto::WeightedValue.new(
|
62
|
+
value: PrefabProto::ConfigValue.new(string: string), weight: weight
|
63
63
|
)
|
64
64
|
end
|
65
65
|
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.24.
|
4
|
+
version: 0.24.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dwyer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -172,9 +172,11 @@ dependencies:
|
|
172
172
|
version: '0'
|
173
173
|
description: Feature Flags, Live Config, and Dynamic Log Levels as a service
|
174
174
|
email: jdwyer@prefab.cloud
|
175
|
-
executables:
|
175
|
+
executables:
|
176
|
+
- console
|
176
177
|
extensions: []
|
177
178
|
extra_rdoc_files:
|
179
|
+
- CHANGELOG.md
|
178
180
|
- LICENSE.txt
|
179
181
|
- README.md
|
180
182
|
files:
|
@@ -182,7 +184,9 @@ files:
|
|
182
184
|
- ".envrc.sample"
|
183
185
|
- ".github/workflows/ruby.yml"
|
184
186
|
- ".gitmodules"
|
187
|
+
- ".rubocop.yml"
|
185
188
|
- ".tool-versions"
|
189
|
+
- CHANGELOG.md
|
186
190
|
- CODEOWNERS
|
187
191
|
- Gemfile
|
188
192
|
- Gemfile.lock
|
@@ -190,6 +194,7 @@ files:
|
|
190
194
|
- README.md
|
191
195
|
- Rakefile
|
192
196
|
- VERSION
|
197
|
+
- bin/console
|
193
198
|
- compile_protos.sh
|
194
199
|
- lib/prefab-cloud-ruby.rb
|
195
200
|
- lib/prefab/client.rb
|
@@ -197,25 +202,32 @@ files:
|
|
197
202
|
- lib/prefab/config_loader.rb
|
198
203
|
- lib/prefab/config_resolver.rb
|
199
204
|
- lib/prefab/config_value_unwrapper.rb
|
205
|
+
- lib/prefab/config_value_wrapper.rb
|
200
206
|
- lib/prefab/context.rb
|
207
|
+
- lib/prefab/context_shape.rb
|
208
|
+
- lib/prefab/context_shape_aggregator.rb
|
201
209
|
- lib/prefab/criteria_evaluator.rb
|
202
210
|
- lib/prefab/error.rb
|
203
211
|
- lib/prefab/errors/initialization_timeout_error.rb
|
204
212
|
- lib/prefab/errors/invalid_api_key_error.rb
|
205
213
|
- lib/prefab/errors/missing_default_error.rb
|
214
|
+
- lib/prefab/evaluated_configs_aggregator.rb
|
215
|
+
- lib/prefab/evaluated_keys_aggregator.rb
|
206
216
|
- lib/prefab/exponential_backoff.rb
|
207
217
|
- lib/prefab/feature_flag_client.rb
|
208
218
|
- lib/prefab/http_connection.rb
|
209
219
|
- lib/prefab/internal_logger.rb
|
210
220
|
- lib/prefab/local_config_parser.rb
|
211
|
-
- lib/prefab/
|
221
|
+
- lib/prefab/log_path_aggregator.rb
|
212
222
|
- lib/prefab/logger_client.rb
|
213
223
|
- lib/prefab/murmer3.rb
|
214
224
|
- lib/prefab/noop_cache.rb
|
215
225
|
- lib/prefab/noop_stats.rb
|
216
226
|
- lib/prefab/options.rb
|
227
|
+
- lib/prefab/periodic_sync.rb
|
217
228
|
- lib/prefab/resolved_config_presenter.rb
|
218
229
|
- lib/prefab/sse_logger.rb
|
230
|
+
- lib/prefab/time_helpers.rb
|
219
231
|
- lib/prefab/weighted_value_resolver.rb
|
220
232
|
- lib/prefab/yaml_config_parser.rb
|
221
233
|
- lib/prefab_pb.rb
|
@@ -230,13 +242,17 @@ files:
|
|
230
242
|
- test/test_config_resolver.rb
|
231
243
|
- test/test_config_value_unwrapper.rb
|
232
244
|
- test/test_context.rb
|
245
|
+
- test/test_context_shape.rb
|
246
|
+
- test/test_context_shape_aggregator.rb
|
233
247
|
- test/test_criteria_evaluator.rb
|
248
|
+
- test/test_evaluated_configs_aggregator.rb
|
249
|
+
- test/test_evaluated_keys_aggregator.rb
|
234
250
|
- test/test_exponential_backoff.rb
|
235
251
|
- test/test_feature_flag_client.rb
|
236
252
|
- test/test_helper.rb
|
237
253
|
- test/test_integration.rb
|
238
254
|
- test/test_local_config_parser.rb
|
239
|
-
- test/
|
255
|
+
- test/test_log_path_aggregator.rb
|
240
256
|
- test/test_logger.rb
|
241
257
|
- test/test_options.rb
|
242
258
|
- test/test_weighted_value_resolver.rb
|
@@ -1,102 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Prefab
|
4
|
-
class LogPathCollector
|
5
|
-
INCREMENT = ->(count) { (count || 0) + 1 }
|
6
|
-
|
7
|
-
SEVERITY_KEY = {
|
8
|
-
::Logger::DEBUG => 'debugs',
|
9
|
-
::Logger::INFO => 'infos',
|
10
|
-
::Logger::WARN => 'warns',
|
11
|
-
::Logger::ERROR => 'errors',
|
12
|
-
::Logger::FATAL => 'fatals'
|
13
|
-
}.freeze
|
14
|
-
|
15
|
-
def initialize(client:, max_paths:, sync_interval:)
|
16
|
-
@max_paths = max_paths
|
17
|
-
@client = client
|
18
|
-
@start_at = now
|
19
|
-
@sync_interval = if sync_interval.is_a?(Numeric)
|
20
|
-
proc { sync_interval }
|
21
|
-
else
|
22
|
-
sync_interval || ExponentialBackoff.new(initial_delay: 8, max_delay: 60 * 10)
|
23
|
-
end
|
24
|
-
|
25
|
-
@pool = Concurrent::ThreadPoolExecutor.new(
|
26
|
-
fallback_policy: :discard,
|
27
|
-
max_queue: 5,
|
28
|
-
max_threads: 4,
|
29
|
-
min_threads: 1,
|
30
|
-
name: 'prefab-log-paths'
|
31
|
-
)
|
32
|
-
|
33
|
-
@paths = Concurrent::Map.new
|
34
|
-
|
35
|
-
start_periodic_sync
|
36
|
-
end
|
37
|
-
|
38
|
-
def push(path, severity)
|
39
|
-
return unless @paths.size < @max_paths
|
40
|
-
|
41
|
-
@paths.compute([path, severity], &INCREMENT)
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def sync
|
47
|
-
return if @paths.size.zero?
|
48
|
-
|
49
|
-
log_internal "Syncing #{@paths.size} paths"
|
50
|
-
|
51
|
-
flush
|
52
|
-
end
|
53
|
-
|
54
|
-
def flush
|
55
|
-
to_ship = @paths.dup
|
56
|
-
@paths.clear
|
57
|
-
|
58
|
-
start_at_was = @start_at
|
59
|
-
@start_at = now
|
60
|
-
|
61
|
-
@pool.post do
|
62
|
-
log_internal "Uploading stats for #{to_ship.size} paths"
|
63
|
-
|
64
|
-
aggregate = Hash.new { |h, k| h[k] = Prefab::Logger.new }
|
65
|
-
|
66
|
-
to_ship.each do |(path, severity), count|
|
67
|
-
aggregate[path][SEVERITY_KEY[severity]] = count
|
68
|
-
aggregate[path]['logger_name'] = path
|
69
|
-
end
|
70
|
-
|
71
|
-
loggers = Prefab::Loggers.new(
|
72
|
-
loggers: aggregate.values,
|
73
|
-
start_at: start_at_was,
|
74
|
-
end_at: now,
|
75
|
-
instance_hash: @client.instance_hash,
|
76
|
-
namespace: @client.namespace
|
77
|
-
)
|
78
|
-
|
79
|
-
@client.post('/api/v1/known-loggers', loggers)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def start_periodic_sync
|
84
|
-
Thread.new do
|
85
|
-
log_internal "Initialized log path collector instance_hash=#{@client.instance_hash} max_paths=#{@max_paths}"
|
86
|
-
|
87
|
-
loop do
|
88
|
-
sleep @sync_interval.call
|
89
|
-
sync
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def log_internal(message)
|
95
|
-
@client.log.log_internal message, 'log_path_collector', nil, ::Logger::DEBUG
|
96
|
-
end
|
97
|
-
|
98
|
-
def now
|
99
|
-
(Time.now.utc.to_f * 1000).to_i
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'test_helper'
|
4
|
-
require 'timecop'
|
5
|
-
|
6
|
-
class TestLogPathCollector < Minitest::Test
|
7
|
-
MAX_WAIT = 2
|
8
|
-
SLEEP_TIME = 0.01
|
9
|
-
|
10
|
-
def test_sync
|
11
|
-
Timecop.freeze do
|
12
|
-
client = new_client(namespace: 'this.is.a.namespace')
|
13
|
-
|
14
|
-
2.times { client.log.info('here is a message') }
|
15
|
-
3.times { client.log.error('here is a message') }
|
16
|
-
|
17
|
-
requests = []
|
18
|
-
|
19
|
-
client.define_singleton_method(:post) do |*params|
|
20
|
-
requests.push(params)
|
21
|
-
end
|
22
|
-
|
23
|
-
client.log_path_collector.send(:sync)
|
24
|
-
|
25
|
-
# let the flush thread run
|
26
|
-
|
27
|
-
wait_time = 0
|
28
|
-
while requests.length == 0
|
29
|
-
wait_time += SLEEP_TIME
|
30
|
-
sleep SLEEP_TIME
|
31
|
-
|
32
|
-
raise "Waited #{MAX_WAIT} seconds for the flush thread to run, but it never did" if wait_time > MAX_WAIT
|
33
|
-
end
|
34
|
-
|
35
|
-
assert_equal requests, [[
|
36
|
-
'/api/v1/known-loggers',
|
37
|
-
Prefab::Loggers.new(
|
38
|
-
loggers: [Prefab::Logger.new(logger_name: 'test.test_log_path_collector.test_sync',
|
39
|
-
infos: 2, errors: 3)],
|
40
|
-
start_at: (Time.now.utc.to_f * 1000).to_i,
|
41
|
-
end_at: (Time.now.utc.to_f * 1000).to_i,
|
42
|
-
instance_hash: client.instance_hash,
|
43
|
-
namespace: 'this.is.a.namespace'
|
44
|
-
)
|
45
|
-
]]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def new_client(overrides = {})
|
52
|
-
super(**{
|
53
|
-
prefab_datasources: Prefab::Options::DATASOURCES::ALL,
|
54
|
-
api_key: '123-development-yourapikey-SDK',
|
55
|
-
collect_sync_interval: 1000 # we'll trigger sync manually in our test
|
56
|
-
}.merge(overrides))
|
57
|
-
end
|
58
|
-
end
|