deimos-ruby 1.16.4 → 1.17.0

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
  SHA256:
3
- metadata.gz: 7412853b7b878c8bcfbfa130f21b5d2c3d46b4d741f1f6adad9edcb358843a4b
4
- data.tar.gz: 5672157db0da4ea4a67893d7a792737e858962a2011cd097fc4af23a9bea60f0
3
+ metadata.gz: 8b4270b2fc345a60377ead079f053ea92281bd606df2d24da782c583bf25e3b9
4
+ data.tar.gz: 6c824200ea66395439dfbc00a0478a30f1410d10032915fb063f94e0d7efbeb0
5
5
  SHA512:
6
- metadata.gz: 444d6e14343916242caaa612d1e1c731ce45423ef41dc5e2cf4d9a85e8d618851001d52cf30ef2c2db060b2631bcaa4daa921ddd66eed93636d5d09ac5ad47e2
7
- data.tar.gz: 253428dc65fc2d86108671a9e03dd85e9a9afa97681dd562efe2a6ec7d61317002a375705ccc7e0b267da31041a0d4c5b2fce960b7e73195dfdad651c5e77b09
6
+ metadata.gz: db33a95a08af5e4d5a6e42ea7d8d7193432647afe1c18186d8d4dbf58dca3fa7994cf06c67abda80c841a918746fe4059e72386c6ab2d98080bd1e9aa727e25e
7
+ data.tar.gz: 8d091dfb4478e66dc898949bc87304dc82a48fc29e1c89e2b1235ea199d338a59c62cc8b29667a03eb45e45db846187feaa28f8f490db3beb17c8e70ddfb7cf0
@@ -25,18 +25,18 @@ jobs:
25
25
  ruby-version: 2.7
26
26
  bundler-cache: true
27
27
 
28
+ - name: Bundle install
29
+ run: bundle install --with development
30
+
28
31
  - name: Rubocop
29
32
  run: bundle exec rubocop --format progress
30
33
 
31
34
  build:
32
35
  runs-on: ubuntu-latest
33
- env:
34
- BUNDLE_GEMFILE: ${{ github.workspace }}/.gemfiles/${{ matrix.gemfile }}.gemfile
35
36
  strategy:
36
37
  fail-fast: false
37
38
  matrix:
38
39
  ruby: [ '2.6', '2.7', '3.0', '3.1' ]
39
- gemfile: [ 'avro_turf-0', 'avro_turf-1' ]
40
40
 
41
41
  steps:
42
42
  - uses: actions/checkout@v2
data/.rubocop.yml CHANGED
@@ -1,7 +1,9 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  require: rubocop-rspec
2
4
 
3
5
  AllCops:
4
- TargetRubyVersion: 2.4
6
+ TargetRubyVersion: 2.5
5
7
  Exclude:
6
8
  - lib/deimos/monkey_patches/*.rb
7
9
  - vendor/**/*
@@ -39,8 +41,9 @@ Layout/EmptyLinesAroundBlockBody:
39
41
  Layout/LineLength:
40
42
  Max: 120
41
43
  Severity: refactor
42
- Exclude:
43
- - 'spec/**/*'
44
+ # TODO: uncomment the files below once rubocop is fixed
45
+ # Exclude:
46
+ # - 'spec/**/*'
44
47
 
45
48
  # foo = if expression
46
49
  # 'bar'
@@ -149,18 +152,20 @@ Style/CollectionMethods:
149
152
  Style/DateTime:
150
153
  AllowCoercion: true
151
154
 
152
- Style/Documentation:
153
- Exclude:
154
- - 'app/controllers/**/*'
155
- - 'app/helpers/**/*'
156
- - 'db/**/*'
155
+ # TODO: uncomment the lines below once rubocop is fixed
156
+ #Style/Documentation:
157
+ # Exclude:
158
+ # - 'app/controllers/**/*'
159
+ # - 'app/helpers/**/*'
160
+ # - 'db/**/*'
157
161
 
158
162
  # Force documentation for public methods and classes
159
163
  Style/DocumentationMethod:
160
164
  Enabled: true
161
- Exclude:
162
- - 'app/controllers/**/*'
163
- - 'db/**/*'
165
+ # TODO: uncomment the file below once rubocop is fixed
166
+ # Exclude:
167
+ # - 'app/controllers/**/*'
168
+ # - 'db/**/*'
164
169
 
165
170
  # Allow else with just nil in it
166
171
  Style/EmptyElse:
@@ -231,9 +236,10 @@ Style/MethodCallWithArgsParentheses:
231
236
  - before_destroy
232
237
  - after_destroy
233
238
  - queue_as
234
- Exclude:
235
- - 'bin/**/*'
236
- - 'Gemfile'
239
+ # TODO: uncomment the file below once rubocop is fixed
240
+ # Exclude:
241
+ # - 'bin/**/*'
242
+ # - 'Gemfile'
237
243
 
238
244
  # Do not allow "end.something"
239
245
  Style/MethodCalledOnDoEndBlock:
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,364 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config --auto-gen-only-exclude`
3
+ # on 2022-09-08 19:46:52 UTC using RuboCop version 0.90.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'deimos-ruby.gemspec'
15
+
16
+ # Offense count: 4
17
+ # Cop supports --auto-correct.
18
+ Layout/EmptyLines:
19
+ Exclude:
20
+ - 'spec/schemas/my_namespace/generated.rb'
21
+ - 'spec/schemas/my_namespace/my_nested_schema.rb'
22
+ - 'spec/schemas/my_namespace/my_schema_with_circular_reference.rb'
23
+ - 'spec/schemas/my_namespace/my_schema_with_complex_type.rb'
24
+
25
+ # Offense count: 32
26
+ # Cop supports --auto-correct.
27
+ # Configuration parameters: EnforcedStyle.
28
+ # SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only
29
+ Layout/EmptyLinesAroundClassBody:
30
+ Enabled: false
31
+
32
+ # Offense count: 1
33
+ # Cop supports --auto-correct.
34
+ Layout/EmptyLinesAroundMethodBody:
35
+ Exclude:
36
+ - 'lib/generators/deimos/schema_class_generator.rb'
37
+
38
+ # Offense count: 42
39
+ # Cop supports --auto-correct.
40
+ # Configuration parameters: EnforcedStyleAlignWith, Severity.
41
+ # SupportedStylesAlignWith: keyword, variable, start_of_line
42
+ Layout/EndAlignment:
43
+ Enabled: false
44
+
45
+ # Offense count: 4
46
+ # Cop supports --auto-correct.
47
+ # Configuration parameters: EnforcedStyle, IndentationWidth.
48
+ # SupportedStyles: special_inside_parentheses, consistent, align_braces
49
+ Layout/FirstHashElementIndentation:
50
+ Exclude:
51
+ - 'spec/producer_spec.rb'
52
+
53
+ # Offense count: 19
54
+ # Cop supports --auto-correct.
55
+ # Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
56
+ # SupportedHashRocketStyles: key, separator, table
57
+ # SupportedColonStyles: key, separator, table
58
+ # SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
59
+ Layout/HashAlignment:
60
+ Exclude:
61
+ - 'spec/consumer_spec.rb'
62
+ - 'spec/generators/schema_class/my_schema_with_circular_reference_spec.rb'
63
+
64
+ # Offense count: 21
65
+ # Cop supports --auto-correct.
66
+ # Configuration parameters: Width, IgnoredPatterns.
67
+ Layout/IndentationWidth:
68
+ Enabled: false
69
+
70
+ # Offense count: 9
71
+ # Cop supports --auto-correct.
72
+ # Configuration parameters: AllowForAlignment, EnforcedStyleForExponentOperator.
73
+ # SupportedStylesForExponentOperator: space, no_space
74
+ Layout/SpaceAroundOperators:
75
+ Exclude:
76
+ - 'spec/generators/schema_class/my_schema_with_circular_reference_spec.rb'
77
+ - 'spec/generators/schema_class_generator_spec.rb'
78
+ - 'spec/schemas/my_namespace/my_schema_with_complex_type.rb'
79
+
80
+ # Offense count: 1
81
+ # Cop supports --auto-correct.
82
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
83
+ # SupportedStyles: space, no_space
84
+ # SupportedStylesForEmptyBraces: space, no_space
85
+ Layout/SpaceInsideBlockBraces:
86
+ Exclude:
87
+ - 'spec/generators/schema_class_generator_spec.rb'
88
+
89
+ # Offense count: 1
90
+ # Cop supports --auto-correct.
91
+ # Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces.
92
+ # SupportedStyles: space, no_space, compact
93
+ # SupportedStylesForEmptyBraces: space, no_space
94
+ Layout/SpaceInsideHashLiteralBraces:
95
+ Exclude:
96
+ - 'spec/active_record_producer_spec.rb'
97
+
98
+ # Offense count: 1
99
+ # Cop supports --auto-correct.
100
+ # Configuration parameters: EnforcedStyle.
101
+ # SupportedStyles: space, no_space
102
+ Layout/SpaceInsideParens:
103
+ Exclude:
104
+ - 'lib/deimos.rb'
105
+
106
+ # Offense count: 23
107
+ # Cop supports --auto-correct.
108
+ # Configuration parameters: AllowInHeredoc.
109
+ Layout/TrailingWhitespace:
110
+ Exclude:
111
+ - 'spec/schemas/my_namespace/generated.rb'
112
+ - 'spec/schemas/my_namespace/my_nested_schema.rb'
113
+ - 'spec/schemas/my_namespace/my_schema_with_circular_reference.rb'
114
+ - 'spec/schemas/my_namespace/my_schema_with_complex_type.rb'
115
+
116
+ # Offense count: 5
117
+ Lint/MissingSuper:
118
+ Exclude:
119
+ - 'lib/deimos/active_record_consumer.rb'
120
+ - 'lib/deimos/metrics/datadog.rb'
121
+ - 'lib/deimos/schema_class/enum.rb'
122
+ - 'lib/deimos/tracing/datadog.rb'
123
+ - 'lib/deimos/tracing/mock.rb'
124
+
125
+ # Offense count: 1
126
+ # Cop supports --auto-correct.
127
+ Lint/RedundantCopDisableDirective:
128
+ Exclude:
129
+ - 'spec/spec_helper.rb'
130
+
131
+ # Offense count: 3
132
+ # Cop supports --auto-correct.
133
+ # Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods, IgnoreNotImplementedMethods.
134
+ Lint/UnusedMethodArgument:
135
+ Exclude:
136
+ - 'lib/deimos/tracing/mock.rb'
137
+ - 'spec/schemas/my_namespace/my_schema_with_circular_reference.rb'
138
+
139
+ # Offense count: 1
140
+ Lint/UselessAssignment:
141
+ Exclude:
142
+ - 'spec/generators/schema_class_generator_spec.rb'
143
+
144
+ # Offense count: 19
145
+ # Configuration parameters: IgnoredMethods, Max.
146
+ Metrics/AbcSize:
147
+ Exclude:
148
+ - 'lib/deimos/active_record_consume/message_consumption.rb'
149
+ - 'lib/deimos/config/phobos_config.rb'
150
+ - 'lib/deimos/instrumentation.rb'
151
+ - 'lib/deimos/kafka_source.rb'
152
+ - 'lib/deimos/kafka_topic_info.rb'
153
+ - 'lib/deimos/producer.rb'
154
+ - 'lib/deimos/schema_backends/avro_schema_coercer.rb'
155
+ - 'lib/deimos/test_helpers.rb'
156
+ - 'lib/deimos/utils/db_poller.rb'
157
+ - 'lib/deimos/utils/db_producer.rb'
158
+ - 'lib/deimos/utils/inline_consumer.rb'
159
+ - 'lib/deimos/utils/schema_controller_mixin.rb'
160
+ - 'lib/generators/deimos/schema_class_generator.rb'
161
+
162
+ # Offense count: 1
163
+ # Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods.
164
+ Metrics/MethodLength:
165
+ Exclude:
166
+ - 'lib/deimos/config/phobos_config.rb'
167
+
168
+ # Offense count: 5
169
+ # Configuration parameters: CountComments, Max, CountAsOne.
170
+ Metrics/ModuleLength:
171
+ Exclude:
172
+ - 'lib/deimos/test_helpers.rb'
173
+ - 'spec/active_record_batch_consumer_spec.rb'
174
+ - 'spec/batch_consumer_spec.rb'
175
+ - 'spec/kafka_source_spec.rb'
176
+ - 'spec/producer_spec.rb'
177
+
178
+ # Offense count: 6
179
+ # Configuration parameters: IgnoredMethods, Max.
180
+ Metrics/PerceivedComplexity:
181
+ Exclude:
182
+ - 'lib/deimos/config/phobos_config.rb'
183
+ - 'lib/deimos/consume/batch_consumption.rb'
184
+ - 'lib/deimos/kafka_source.rb'
185
+ - 'lib/deimos/schema_backends/avro_schema_coercer.rb'
186
+ - 'lib/deimos/test_helpers.rb'
187
+
188
+ # Offense count: 12
189
+ # Configuration parameters: Prefixes.
190
+ # Prefixes: when, with, without
191
+ RSpec/ContextWording:
192
+ Exclude:
193
+ - 'spec/generators/schema_class_generator_spec.rb'
194
+
195
+ # Offense count: 4
196
+ # Configuration parameters: Max.
197
+ RSpec/ExampleLength:
198
+ Exclude:
199
+ - 'spec/config/configuration_spec.rb'
200
+ - 'spec/utils/db_producer_spec.rb'
201
+
202
+ # Offense count: 6
203
+ # Configuration parameters: Max.
204
+ RSpec/MultipleExpectations:
205
+ Exclude:
206
+ - 'spec/active_record_consumer_spec.rb'
207
+ - 'spec/config/configuration_spec.rb'
208
+ - 'spec/kafka_topic_info_spec.rb'
209
+ - 'spec/utils/db_poller_spec.rb'
210
+ - 'spec/utils/db_producer_spec.rb'
211
+
212
+ # Offense count: 1
213
+ Style/Documentation:
214
+ Exclude:
215
+ - 'spec/**/*'
216
+ - 'test/**/*'
217
+ - 'regenerate_test_schema_classes.rb'
218
+
219
+ # Offense count: 1
220
+ # Configuration parameters: RequireForNonPublicMethods.
221
+ Style/DocumentationMethod:
222
+ Exclude:
223
+ - 'spec/**/*'
224
+ - 'test/**/*'
225
+ - 'regenerate_test_schema_classes.rb'
226
+
227
+ # Offense count: 1
228
+ # Cop supports --auto-correct.
229
+ # Configuration parameters: EnforcedStyle.
230
+ # SupportedStyles: compact, expanded
231
+ Style/EmptyMethod:
232
+ Exclude:
233
+ - 'regenerate_test_schema_classes.rb'
234
+
235
+ # Offense count: 2
236
+ # Cop supports --auto-correct.
237
+ Style/ExplicitBlockArgument:
238
+ Exclude:
239
+ - 'lib/deimos/metrics/datadog.rb'
240
+ - 'lib/deimos/utils/deadlock_retry.rb'
241
+
242
+ # Offense count: 2
243
+ # Cop supports --auto-correct.
244
+ # Configuration parameters: EnforcedStyle.
245
+ # SupportedStyles: always, always_true, never
246
+ Style/FrozenStringLiteralComment:
247
+ Exclude:
248
+ - 'regenerate_test_schema_classes.rb'
249
+ - 'spec/generators/schema_class/my_schema_spec.rb'
250
+
251
+ # Offense count: 10
252
+ # Cop supports --auto-correct.
253
+ Style/GlobalStdStream:
254
+ Exclude:
255
+ - 'lib/deimos/config/configuration.rb'
256
+ - 'lib/deimos/config/phobos_config.rb'
257
+ - 'lib/deimos/metrics/mock.rb'
258
+ - 'lib/deimos/test_helpers.rb'
259
+ - 'lib/deimos/tracing/mock.rb'
260
+ - 'lib/deimos/utils/db_producer.rb'
261
+ - 'lib/tasks/deimos.rake'
262
+ - 'spec/rake_spec.rb'
263
+
264
+ # Offense count: 1
265
+ # Cop supports --auto-correct.
266
+ Style/HashEachMethods:
267
+ Exclude:
268
+ - 'lib/generators/deimos/schema_class_generator.rb'
269
+
270
+ # Offense count: 31
271
+ # Cop supports --auto-correct.
272
+ # Configuration parameters: IgnoreMacros, IgnoredMethods, IgnoredPatterns, IncludedMacros, AllowParenthesesInMultilineCall, AllowParenthesesInChaining, AllowParenthesesInCamelCaseMethod, EnforcedStyle.
273
+ # SupportedStyles: require_parentheses, omit_parentheses
274
+ Style/MethodCallWithArgsParentheses:
275
+ Exclude:
276
+ - 'lib/deimos/utils/db_poller.rb'
277
+ - 'lib/deimos/utils/inline_consumer.rb'
278
+ - 'spec/config/configuration_spec.rb'
279
+ - 'spec/deimos_spec.rb'
280
+ - 'spec/generators/schema_class_generator_spec.rb'
281
+
282
+ # Offense count: 1
283
+ Style/OptionalBooleanParameter:
284
+ Exclude:
285
+ - 'lib/deimos/test_helpers.rb'
286
+
287
+ # Offense count: 1
288
+ # Cop supports --auto-correct.
289
+ Style/RedundantAssignment:
290
+ Exclude:
291
+ - 'spec/schemas/my_namespace/my_schema_with_circular_reference.rb'
292
+
293
+ # Offense count: 2
294
+ # Cop supports --auto-correct.
295
+ Style/RedundantBegin:
296
+ Exclude:
297
+ - 'lib/deimos.rb'
298
+ - 'lib/deimos/utils/db_producer.rb'
299
+
300
+ # Offense count: 1
301
+ # Cop supports --auto-correct.
302
+ Style/SingleArgumentDig:
303
+ Exclude:
304
+ - 'lib/deimos/active_record_consume/batch_slicer.rb'
305
+
306
+ # Offense count: 1
307
+ # Cop supports --auto-correct.
308
+ # Configuration parameters: AllowIfMethodIsEmpty.
309
+ Style/SingleLineMethods:
310
+ Exclude:
311
+ - 'regenerate_test_schema_classes.rb'
312
+
313
+ # Offense count: 5
314
+ # Cop supports --auto-correct.
315
+ Style/StringConcatenation:
316
+ Exclude:
317
+ - 'spec/producer_spec.rb'
318
+ - 'spec/utils/schema_controller_mixin_spec.rb'
319
+
320
+ # Offense count: 10
321
+ # Cop supports --auto-correct.
322
+ # Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
323
+ # SupportedStyles: single_quotes, double_quotes
324
+ Style/StringLiterals:
325
+ Exclude:
326
+ - 'lib/generators/deimos/schema_class_generator.rb'
327
+ - 'lib/tasks/deimos.rake'
328
+ - 'regenerate_test_schema_classes.rb'
329
+ - 'spec/schemas/my_namespace/my_schema_with_complex_type.rb'
330
+ - 'spec/spec_helper.rb'
331
+
332
+ # Offense count: 1
333
+ # Cop supports --auto-correct.
334
+ # Configuration parameters: EnforcedStyle, AllowSafeAssignment.
335
+ # SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex
336
+ Style/TernaryParentheses:
337
+ Exclude:
338
+ - 'lib/deimos/config/phobos_config.rb'
339
+
340
+ # Offense count: 21
341
+ # Cop supports --auto-correct.
342
+ Style/TrailingBodyOnModule:
343
+ Enabled: false
344
+
345
+ # Offense count: 1
346
+ # Cop supports --auto-correct.
347
+ # Configuration parameters: EnforcedStyleForMultiline.
348
+ # SupportedStylesForMultiline: comma, consistent_comma, no_comma
349
+ Style/TrailingCommaInHashLiteral:
350
+ Exclude:
351
+ - 'spec/config/configuration_spec.rb'
352
+
353
+ # Offense count: 8
354
+ # Cop supports --auto-correct.
355
+ # Configuration parameters: AutoCorrect, Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
356
+ # URISchemes: http, https
357
+ Layout/LineLength:
358
+ Exclude:
359
+ - 'lib/deimos/producer.rb'
360
+ - 'lib/deimos/utils/db_poller.rb'
361
+ - 'lib/deimos/utils/db_producer.rb'
362
+ - 'spec/active_record_batch_consumer_spec.rb'
363
+ - 'spec/generators/schema_class/my_schema_with_circular_reference_spec.rb'
364
+ - 'spec/generators/schema_class/my_schema_with_complex_types_spec.rb'
data/.ruby-version CHANGED
@@ -1 +1,2 @@
1
- 2.5.3
1
+ 2.7.0
2
+
data/CHANGELOG.md CHANGED
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 1.17.0 - 2022-10-19
11
+ - Fix the linting step in the CI
12
+ - CHANGE: Add retries to DB poller and bypass "bad batches".
13
+ - Add tracing spans to DB poller production.
14
+
10
15
  # 1.16.4 - 2022-09-09
11
16
 
12
17
  - Now generates RBS types.
data/Gemfile CHANGED
@@ -9,4 +9,3 @@ if !ENV['CI'] || ENV['CI'] == ''
9
9
  # TODO: once all PRs are merged, add this to gemspec as a development dependency
10
10
  gem 'sord', git: 'git@github.com:dorner/sord.git', ref: 'local-develop'
11
11
  end
12
-
data/README.md CHANGED
@@ -800,6 +800,9 @@ class MyProducer < Deimos::ActiveRecordProducer
800
800
  end
801
801
  ```
802
802
 
803
+ Note that the poller will retry infinitely if it encounters a Kafka-related error such
804
+ as a communication failure. For all other errors, it will retry once by default.
805
+
803
806
  ## Running consumers
804
807
 
805
808
  Deimos includes a rake task. Once it's in your gemfile, just run
@@ -1200,13 +1203,14 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/flipp-
1200
1203
 
1201
1204
  You can/should re-generate RBS types when methods or classes change by running the following:
1202
1205
 
1203
- rbs collection install # if you haven't done it recently
1206
+ rbs collection install # if you haven't done it
1207
+ rbs collection update
1204
1208
  bundle exec sord --hide-private --no-sord-comments sig/defs.rbs --tags 'override:Override'
1205
1209
 
1206
1210
  ### Linting
1207
1211
 
1208
1212
  Deimos uses Rubocop to lint the code. Please run Rubocop on your code
1209
- before submitting a PR.
1213
+ before submitting a PR. The GitHub CI will also run rubocop on your pull request.
1210
1214
 
1211
1215
  ---
1212
1216
  <p align="center">
data/Steepfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ target :app do
4
+ check 'lib'
5
+ signature 'sig'
6
+
7
+ library 'set', 'pathname'
8
+ end
data/deimos-ruby.gemspec CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_runtime_dependency('avro_turf', '>= 0.11', '< 2')
21
+ spec.add_runtime_dependency('avro_turf', '>= 1.4', '< 2')
22
+ spec.add_runtime_dependency('fig_tree', '~> 0.0.2')
22
23
  spec.add_runtime_dependency('phobos', '>= 1.9', '< 3.0')
23
24
  spec.add_runtime_dependency('ruby-kafka', '< 2')
24
25
  spec.add_runtime_dependency('sigurd', '>= 0.1.0', '< 1.0')
25
- spec.add_runtime_dependency('fig_tree', '~> 0.0.2')
26
26
 
27
27
  spec.add_development_dependency('activerecord-import')
28
28
  spec.add_development_dependency('avro', '~> 1.9')
@@ -43,4 +43,5 @@ Gem::Specification.new do |spec|
43
43
  spec.add_development_dependency('rubocop', '0.89.0')
44
44
  spec.add_development_dependency('rubocop-rspec', '1.42.0')
45
45
  spec.add_development_dependency('sqlite3', '~> 1.3')
46
+ spec.add_development_dependency('steep', '~> 1.0')
46
47
  end
@@ -15,7 +15,7 @@ Config name|Default|Description
15
15
  logger|`Logger.new(STDOUT)`|The logger that Deimos will use.
16
16
  phobos_logger|`Deimos.config.logger`|The logger passed to Phobos.
17
17
  metrics|`Deimos::Metrics::Mock.new`|The metrics backend use for reporting.
18
- tracer|`Deimos::Tracer::Mock.new`|The tracer backend used for debugging.
18
+ tracer|`Deimos::Tracing::Mock.new`|The tracer backend used for debugging.
19
19
 
20
20
  ## Defining Producers
21
21
 
@@ -119,6 +119,7 @@ timestamp_column|`:updated_at`|Name of the column to query. Remember to add an i
119
119
  delay_time|2|Amount of time in seconds to wait before picking up records, to allow for transactions to finish.
120
120
  full_table|false|If set to true, do a full table dump to Kafka each run. Good for very small tables.
121
121
  start_from_beginning|true|If false, start from the current time instead of the beginning of time if this is the first time running the poller.
122
+ retries|1|The number of times to retry for a *non-Kafka* error.
122
123
 
123
124
  ## Kafka Configuration
124
125
 
@@ -461,6 +461,8 @@ module Deimos
461
461
  # If false, start from the current time instead of the beginning of time
462
462
  # if this is the first time running the poller.
463
463
  setting :start_from_beginning, true
464
+ # The number of times to retry production when encountering a *non-Kafka* error.
465
+ setting :retries, 1
464
466
  end
465
467
 
466
468
  deprecate 'kafka_logger', 'kafka.logger'
@@ -7,7 +7,7 @@ module Deimos
7
7
  # A mock Metrics wrapper which just logs the metrics
8
8
  class Mock < Provider
9
9
  # @param logger [Logger,nil]
10
- def initialize(logger=nil)
10
+ def initialize(logger=nil) # rubocop:disable Lint/MissingSuper
11
11
  @logger = logger || Logger.new(STDOUT)
12
12
  @logger.info('MockMetricsProvider initialized')
13
13
  end
@@ -24,7 +24,7 @@ module Deimos
24
24
  end
25
25
 
26
26
  # @override
27
- def coerce_field(field, value)
27
+ def coerce_field(_field, value)
28
28
  value
29
29
  end
30
30
 
@@ -14,6 +14,9 @@ module Deimos
14
14
  # @return [Integer]
15
15
  attr_reader :id
16
16
 
17
+ # @return [Hash]
18
+ attr_reader :config
19
+
17
20
  # Begin the DB Poller process.
18
21
  # @return [void]
19
22
  def self.start!
@@ -110,6 +113,7 @@ module Deimos
110
113
  Deimos.config.logger.info("Polling #{@producer.topic} from #{time_from} to #{time_to}")
111
114
  message_count = 0
112
115
  batch_count = 0
116
+ error_count = 0
113
117
 
114
118
  # poll_query gets all the relevant data from the database, as defined
115
119
  # by the producer itself.
@@ -118,12 +122,15 @@ module Deimos
118
122
  batch = fetch_results(time_from, time_to).to_a
119
123
  break if batch.empty?
120
124
 
121
- batch_count += 1
122
- process_batch(batch)
125
+ if process_batch_with_span(batch)
126
+ batch_count += 1
127
+ else
128
+ error_count += 1
129
+ end
123
130
  message_count += batch.size
124
131
  time_from = last_updated(batch.last)
125
132
  end
126
- Deimos.config.logger.info("Poll #{@producer.topic} complete at #{time_to} (#{message_count} messages, #{batch_count} batches}")
133
+ Deimos.config.logger.info("Poll #{@producer.topic} complete at #{time_to} (#{message_count} messages, #{batch_count} successful batches, #{error_count} batches errored}")
127
134
  end
128
135
 
129
136
  # @param time_from [ActiveSupport::TimeWithZone]
@@ -143,15 +150,52 @@ module Deimos
143
150
 
144
151
  # @param batch [Array<ActiveRecord::Base>]
145
152
  # @return [void]
146
- def process_batch(batch)
153
+ def process_batch_with_span(batch)
154
+ retries = 0
155
+ begin
156
+ span = Deimos.config.tracer&.start(
157
+ 'deimos-db-poller',
158
+ resource: @producer.class.name.gsub('::', '-')
159
+ )
160
+ process_batch(batch)
161
+ Deimos.config.tracer&.finish(span)
162
+ rescue Kafka::Error => e # keep trying till it fixes itself
163
+ Deimos.config.logger.error("Error publishing through DB Poller: #{e.message}")
164
+ sleep(0.5)
165
+ retry
166
+ rescue StandardError => e
167
+ Deimos.config.logger.error("Error publishing through DB poller: #{e.message}}")
168
+ if retries < @config.retries
169
+ retries += 1
170
+ sleep(0.5)
171
+ retry
172
+ else
173
+ Deimos.config.logger.error('Retries exceeded, moving on to next batch')
174
+ Deimos.config.tracer&.set_error(span, e)
175
+ self.touch_info(batch)
176
+ return false
177
+ end
178
+ end
179
+ true
180
+ end
181
+
182
+ # @param batch [Array<ActiveRecord::Base>]
183
+ # @return [void]
184
+ def touch_info(batch)
147
185
  record = batch.last
148
186
  id_method = record.class.primary_key
149
187
  last_id = record.public_send(id_method)
150
188
  last_updated_at = last_updated(record)
151
- @producer.send_events(batch)
152
189
  @info.attributes = { last_sent: last_updated_at, last_sent_id: last_id }
153
190
  @info.save!
154
191
  end
192
+
193
+ # @param batch [Array<ActiveRecord::Base>]
194
+ # @return [void]
195
+ def process_batch(batch)
196
+ @producer.send_events(batch)
197
+ self.touch_info(batch)
198
+ end
155
199
  end
156
200
  end
157
201
  end