prefab-cloud-ruby 0.24.2 → 0.24.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +13 -0
  4. data/CHANGELOG.md +76 -0
  5. data/Gemfile.lock +4 -4
  6. data/VERSION +1 -1
  7. data/bin/console +21 -0
  8. data/compile_protos.sh +6 -0
  9. data/lib/prefab/client.rb +25 -4
  10. data/lib/prefab/config_client.rb +16 -6
  11. data/lib/prefab/config_loader.rb +1 -1
  12. data/lib/prefab/config_resolver.rb +2 -4
  13. data/lib/prefab/config_value_wrapper.rb +18 -0
  14. data/lib/prefab/context.rb +22 -2
  15. data/lib/prefab/context_shape.rb +20 -0
  16. data/lib/prefab/context_shape_aggregator.rb +63 -0
  17. data/lib/prefab/criteria_evaluator.rb +61 -41
  18. data/lib/prefab/evaluated_configs_aggregator.rb +60 -0
  19. data/lib/prefab/evaluated_keys_aggregator.rb +41 -0
  20. data/lib/prefab/local_config_parser.rb +13 -13
  21. data/lib/prefab/log_path_aggregator.rb +64 -0
  22. data/lib/prefab/logger_client.rb +29 -16
  23. data/lib/prefab/options.rb +46 -1
  24. data/lib/prefab/periodic_sync.rb +51 -0
  25. data/lib/prefab/time_helpers.rb +7 -0
  26. data/lib/prefab-cloud-ruby.rb +8 -1
  27. data/lib/prefab_pb.rb +33 -220
  28. data/prefab-cloud-ruby.gemspec +21 -5
  29. data/test/test_config_loader.rb +15 -15
  30. data/test/test_config_resolver.rb +102 -102
  31. data/test/test_config_value_unwrapper.rb +13 -13
  32. data/test/test_context.rb +42 -0
  33. data/test/test_context_shape.rb +51 -0
  34. data/test/test_context_shape_aggregator.rb +137 -0
  35. data/test/test_criteria_evaluator.rb +253 -150
  36. data/test/test_evaluated_configs_aggregator.rb +254 -0
  37. data/test/test_evaluated_keys_aggregator.rb +54 -0
  38. data/test/test_helper.rb +34 -2
  39. data/test/test_log_path_aggregator.rb +57 -0
  40. data/test/test_logger.rb +61 -76
  41. data/test/test_weighted_value_resolver.rb +2 -2
  42. metadata +21 -5
  43. data/lib/prefab/log_path_collector.rb +0 -102
  44. 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 = Prefab::ConfigRow.new(
13
+ DEFAULT_ROW = PrefabProto::ConfigRow.new(
14
14
  values: [
15
- Prefab::ConditionalValue.new(
16
- value: Prefab::ConfigValue.new(log_level: DEFAULT_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
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- cloud.prefab.client.test.path: : test message/)
89
- logger.log_internal('test message', 'test.path', '', ::Logger::WARN)
90
- mock_logdev.verify
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
- logger, mock_logdev = mock_logger_expecting(/A, \[.*\] ANY -- cloud.prefab.client.test.path: : test message/)
95
- logger.log_internal('test message', 'test.path', '', ::Logger::UNKNOWN)
96
- mock_logdev.verify
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
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- cloud.prefab.client.test.path: : should log/,
101
- calls: 2)
102
- logger.silence do
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
- logger.log_internal('should log', 'test.path', '', ::Logger::WARN)
106
- mock_logdev.verify
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
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- test.path: : test message/)
111
- logger.log('test message', 'test.path', '', ::Logger::WARN)
112
- mock_logdev.verify
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
- logger, mock_logdev = mock_logger_expecting(/A, \[.*\] ANY -- test.path: : test message/)
117
- logger.log('test message', 'test.path', '', ::Logger::UNKNOWN)
118
- mock_logdev.verify
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
- logger, mock_logdev = mock_logger_expecting(/W, \[.*\] WARN -- test.path: : should log/, calls: 2)
123
- logger.silence do
124
- logger.log('should not log', 'test.path', '', ::Logger::WARN)
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
- logger.log('should log', 'test.path', '', ::Logger::WARN)
127
- mock_logdev.verify
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 = Prefab::Config.new(
182
+ config = PrefabProto::Config.new(
182
183
  key: 'log-level',
183
184
  rows: [
184
185
  DEFAULT_ROW,
185
186
 
186
187
  # wrong env
187
- Prefab::ConfigRow.new(
188
+ PrefabProto::ConfigRow.new(
188
189
  project_env_id: TEST_ENV_ID,
189
190
  values: [
190
- Prefab::ConditionalValue.new(
191
+ PrefabProto::ConditionalValue.new(
191
192
  criteria: [
192
- Prefab::Criterion.new(
193
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
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: Prefab::ConfigValue.new(log_level: WRONG_ENV_VALUE)
199
+ value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
199
200
  )
200
201
  ]
201
202
  ),
202
203
 
203
204
  # correct env
204
- Prefab::ConfigRow.new(
205
+ PrefabProto::ConfigRow.new(
205
206
  project_env_id: PROJECT_ENV_ID,
206
207
  values: [
207
- Prefab::ConditionalValue.new(
208
+ PrefabProto::ConditionalValue.new(
208
209
  criteria: [
209
- Prefab::Criterion.new(
210
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
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: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
216
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
216
217
  ),
217
- Prefab::ConditionalValue.new(
218
- value: Prefab::ConfigValue.new(log_level: DEFAULT_ENV_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 = Prefab::Config.new(
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
- Prefab::ConfigRow.new(
281
+ PrefabProto::ConfigRow.new(
281
282
  project_env_id: TEST_ENV_ID,
282
283
  values: [
283
- Prefab::ConditionalValue.new(
284
+ PrefabProto::ConditionalValue.new(
284
285
  criteria: [
285
- Prefab::Criterion.new(
286
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
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: Prefab::ConfigValue.new(log_level: WRONG_ENV_VALUE)
292
+ value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE)
292
293
  )
293
294
  ]
294
295
  ),
295
296
 
296
297
  # correct env
297
- Prefab::ConfigRow.new(
298
+ PrefabProto::ConfigRow.new(
298
299
  project_env_id: PROJECT_ENV_ID,
299
300
  values: [
300
- Prefab::ConditionalValue.new(
301
+ PrefabProto::ConditionalValue.new(
301
302
  criteria: [
302
- Prefab::Criterion.new(
303
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
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: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
309
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
309
310
  ),
310
311
 
311
- Prefab::ConditionalValue.new(
312
+ PrefabProto::ConditionalValue.new(
312
313
  criteria: [
313
- Prefab::Criterion.new(
314
- operator: Prefab::Criterion::CriterionOperator::PROP_IS_ONE_OF,
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: Prefab::ConfigValue.new(log_level: DESIRED_VALUE)
320
+ value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE)
320
321
  ),
321
322
 
322
- Prefab::ConditionalValue.new(
323
- value: Prefab::ConfigValue.new(log_level: DEFAULT_ENV_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', ' ' + message
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}: #{message}\n/, logged_io.string)
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
- Prefab::WeightedValue.new(
62
- value: Prefab::ConfigValue.new(string: string), weight: weight
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.2
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-05-12 00:00:00.000000000 Z
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/log_path_collector.rb
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/test_log_path_collector.rb
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