deimos-ruby 1.6.2 → 1.8.0.pre.beta2

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -0
  3. data/.rubocop.yml +15 -13
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +31 -0
  6. data/Gemfile.lock +43 -36
  7. data/README.md +141 -16
  8. data/Rakefile +1 -1
  9. data/deimos-ruby.gemspec +2 -1
  10. data/docs/ARCHITECTURE.md +144 -0
  11. data/docs/CONFIGURATION.md +27 -0
  12. data/lib/deimos.rb +7 -6
  13. data/lib/deimos/active_record_consume/batch_consumption.rb +159 -0
  14. data/lib/deimos/active_record_consume/batch_slicer.rb +27 -0
  15. data/lib/deimos/active_record_consume/message_consumption.rb +58 -0
  16. data/lib/deimos/active_record_consume/schema_model_converter.rb +52 -0
  17. data/lib/deimos/active_record_consumer.rb +33 -75
  18. data/lib/deimos/active_record_producer.rb +23 -0
  19. data/lib/deimos/batch_consumer.rb +2 -140
  20. data/lib/deimos/config/configuration.rb +28 -10
  21. data/lib/deimos/consume/batch_consumption.rb +150 -0
  22. data/lib/deimos/consume/message_consumption.rb +94 -0
  23. data/lib/deimos/consumer.rb +79 -69
  24. data/lib/deimos/kafka_message.rb +1 -1
  25. data/lib/deimos/kafka_topic_info.rb +1 -1
  26. data/lib/deimos/message.rb +6 -1
  27. data/lib/deimos/metrics/provider.rb +0 -2
  28. data/lib/deimos/poll_info.rb +9 -0
  29. data/lib/deimos/tracing/provider.rb +0 -2
  30. data/lib/deimos/utils/db_poller.rb +149 -0
  31. data/lib/deimos/utils/db_producer.rb +8 -3
  32. data/lib/deimos/utils/deadlock_retry.rb +68 -0
  33. data/lib/deimos/utils/lag_reporter.rb +19 -26
  34. data/lib/deimos/version.rb +1 -1
  35. data/lib/generators/deimos/db_poller/templates/migration +11 -0
  36. data/lib/generators/deimos/db_poller/templates/rails3_migration +16 -0
  37. data/lib/generators/deimos/db_poller_generator.rb +48 -0
  38. data/lib/tasks/deimos.rake +7 -0
  39. data/spec/active_record_batch_consumer_spec.rb +481 -0
  40. data/spec/active_record_consume/batch_slicer_spec.rb +42 -0
  41. data/spec/active_record_consume/schema_model_converter_spec.rb +105 -0
  42. data/spec/active_record_consumer_spec.rb +3 -11
  43. data/spec/active_record_producer_spec.rb +66 -88
  44. data/spec/batch_consumer_spec.rb +24 -7
  45. data/spec/config/configuration_spec.rb +4 -0
  46. data/spec/consumer_spec.rb +8 -8
  47. data/spec/deimos_spec.rb +57 -49
  48. data/spec/handlers/my_batch_consumer.rb +6 -1
  49. data/spec/handlers/my_consumer.rb +6 -1
  50. data/spec/message_spec.rb +19 -0
  51. data/spec/producer_spec.rb +3 -3
  52. data/spec/rake_spec.rb +1 -1
  53. data/spec/schemas/com/my-namespace/MySchemaCompound-key.avsc +18 -0
  54. data/spec/schemas/com/my-namespace/Wibble.avsc +43 -0
  55. data/spec/spec_helper.rb +61 -6
  56. data/spec/utils/db_poller_spec.rb +320 -0
  57. data/spec/utils/deadlock_retry_spec.rb +74 -0
  58. data/spec/utils/lag_reporter_spec.rb +29 -22
  59. metadata +55 -20
  60. data/lib/deimos/base_consumer.rb +0 -104
  61. data/lib/deimos/utils/executor.rb +0 -124
  62. data/lib/deimos/utils/platform_schema_validation.rb +0 -0
  63. data/lib/deimos/utils/signal_handler.rb +0 -68
  64. data/spec/utils/executor_spec.rb +0 -53
  65. data/spec/utils/signal_handler_spec.rb +0 -16
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Deimos::Utils::DeadlockRetry do
4
+ include_context 'with widgets'
5
+
6
+ before(:each) do
7
+ allow(described_class).to receive(:sleep)
8
+ end
9
+
10
+ describe 'deadlock handling' do
11
+ let(:batch) { [{ key: 1, payload: { test_id: 'abc', some_int: 3 } }] }
12
+
13
+ it 'should retry deadlocks 3 times' do
14
+ # Should receive original attempt + 2 retries
15
+ expect(Widget).
16
+ to receive(:create).
17
+ and_raise(ActiveRecord::Deadlocked.new('Lock wait timeout exceeded')).
18
+ exactly(3).times
19
+
20
+ # After 3 tries, should let it bubble up
21
+ expect {
22
+ described_class.wrap do
23
+ Widget.create(test_id: 'abc')
24
+ end
25
+ }.to raise_error(ActiveRecord::Deadlocked)
26
+ end
27
+
28
+ it 'should stop retrying deadlocks after success' do
29
+ allow(Widget).
30
+ to receive(:create).
31
+ with(hash_including(test_id: 'first')).
32
+ and_call_original
33
+
34
+ # Fail on first attempt, succeed on second
35
+ expect(Widget).
36
+ to receive(:create).
37
+ with(hash_including(test_id: 'second')).
38
+ and_raise(ActiveRecord::Deadlocked.new('Deadlock found when trying to get lock')).
39
+ once.
40
+ ordered
41
+
42
+ expect(Widget).
43
+ to receive(:create).
44
+ with(hash_including(test_id: 'second')).
45
+ once.
46
+ ordered.
47
+ and_call_original
48
+
49
+ # Should not raise anything
50
+ described_class.wrap do
51
+ Widget.create(test_id: 'first')
52
+ Widget.create(test_id: 'second')
53
+ end
54
+
55
+ expect(Widget.all).to match_array([
56
+ have_attributes(test_id: 'first'),
57
+ have_attributes(test_id: 'second')
58
+ ])
59
+ end
60
+
61
+ it 'should not retry non-deadlock exceptions' do
62
+ expect(Widget).
63
+ to receive(:create).
64
+ and_raise(ActiveRecord::StatementInvalid.new('Oops!!')).
65
+ once
66
+
67
+ expect {
68
+ described_class.wrap do
69
+ Widget.create(test_id: 'abc')
70
+ end
71
+ }.to raise_error(ActiveRecord::StatementInvalid, 'Oops!!')
72
+ end
73
+ end
74
+ end
@@ -2,8 +2,11 @@
2
2
 
3
3
  describe Deimos::Utils::LagReporter do
4
4
 
5
+ let(:kafka_client) { instance_double(Kafka::Client) }
6
+ let(:partition1_tags) { %w(consumer_group:group1 partition:1 topic:my-topic) }
7
+ let(:partition2_tags) { %w(consumer_group:group1 partition:2 topic:my-topic) }
8
+
5
9
  before(:each) do
6
- kafka_client = instance_double(Kafka::Client)
7
10
  allow(kafka_client).to receive(:last_offset_for).and_return(100)
8
11
  allow(Phobos).to receive(:create_kafka_client).and_return(kafka_client)
9
12
  Deimos.configure { |c| c.consumers.report_lag = true }
@@ -20,38 +23,22 @@ describe Deimos::Utils::LagReporter do
20
23
  'heartbeat.consumer.kafka',
21
24
  group_id: 'group1', topic_partitions: { 'my-topic': [1] }
22
25
  )
23
-
24
26
  end
25
27
 
26
28
  it 'should report lag' do
27
29
  expect(Deimos.config.metrics).to receive(:gauge).ordered.twice.
28
- with('consumer_lag', 95,
29
- tags: %w(
30
- consumer_group:group1
31
- partition:1
32
- topic:my-topic
33
- ))
30
+ with('consumer_lag', 95, tags: partition1_tags)
34
31
  expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
35
- with('consumer_lag', 80,
36
- tags: %w(
37
- consumer_group:group1
38
- partition:2
39
- topic:my-topic
40
- ))
32
+ with('consumer_lag', 80, tags: partition2_tags)
41
33
  expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
42
- with('consumer_lag', 0,
43
- tags: %w(
44
- consumer_group:group1
45
- partition:2
46
- topic:my-topic
47
- ))
34
+ with('consumer_lag', 0, tags: partition2_tags)
48
35
  ActiveSupport::Notifications.instrument(
49
36
  'seek.consumer.kafka',
50
37
  offset: 5, topic: 'my-topic', group_id: 'group1', partition: 1
51
38
  )
52
39
  ActiveSupport::Notifications.instrument(
53
40
  'start_process_message.consumer.kafka',
54
- offset_lag: 80, topic: 'my-topic', group_id: 'group1', partition: 2
41
+ offset: 20, topic: 'my-topic', group_id: 'group1', partition: 2
55
42
  )
56
43
  ActiveSupport::Notifications.instrument(
57
44
  'heartbeat.consumer.kafka',
@@ -59,8 +46,28 @@ describe Deimos::Utils::LagReporter do
59
46
  )
60
47
  ActiveSupport::Notifications.instrument(
61
48
  'start_process_batch.consumer.kafka',
62
- offset_lag: 0, topic: 'my-topic', group_id: 'group1', partition: 2
49
+ last_offset: 100, topic: 'my-topic', group_id: 'group1', partition: 2
50
+ )
51
+ ActiveSupport::Notifications.instrument(
52
+ 'heartbeat.consumer.kafka',
53
+ group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
54
+ )
55
+ end
56
+
57
+ it 'should update lag after heartbeat' do
58
+ expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
59
+ with('consumer_lag', 94, tags: partition2_tags)
60
+ expect(Deimos.config.metrics).to receive(:gauge).ordered.once.
61
+ with('consumer_lag', 95, tags: partition2_tags)
62
+ ActiveSupport::Notifications.instrument(
63
+ 'seek.consumer.kafka',
64
+ offset: 6, topic: 'my-topic', group_id: 'group1', partition: 2
65
+ )
66
+ ActiveSupport::Notifications.instrument(
67
+ 'heartbeat.consumer.kafka',
68
+ group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
63
69
  )
70
+ allow(kafka_client).to receive(:last_offset_for).and_return(101)
64
71
  ActiveSupport::Notifications.instrument(
65
72
  'heartbeat.consumer.kafka',
66
73
  group_id: 'group1', topic_partitions: { 'my-topic': [1, 2] }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deimos-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.8.0.pre.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro_turf
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sigurd
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.1
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: activerecord
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -95,19 +109,19 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '1.9'
97
111
  - !ruby/object:Gem::Dependency
98
- name: bundler
112
+ name: database_cleaner
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '1'
117
+ version: '1.7'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '1'
124
+ version: '1.7'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: ddtrace
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -310,7 +324,7 @@ dependencies:
310
324
  - - "~>"
311
325
  - !ruby/object:Gem::Version
312
326
  version: '1.3'
313
- description:
327
+ description:
314
328
  email:
315
329
  - daniel.orner@wishabi.com
316
330
  executables:
@@ -337,10 +351,15 @@ files:
337
351
  - bin/deimos
338
352
  - deimos-ruby.gemspec
339
353
  - docker-compose.yml
354
+ - docs/ARCHITECTURE.md
340
355
  - docs/CONFIGURATION.md
341
356
  - docs/DATABASE_BACKEND.md
342
357
  - docs/PULL_REQUEST_TEMPLATE.md
343
358
  - lib/deimos.rb
359
+ - lib/deimos/active_record_consume/batch_consumption.rb
360
+ - lib/deimos/active_record_consume/batch_slicer.rb
361
+ - lib/deimos/active_record_consume/message_consumption.rb
362
+ - lib/deimos/active_record_consume/schema_model_converter.rb
344
363
  - lib/deimos/active_record_consumer.rb
345
364
  - lib/deimos/active_record_producer.rb
346
365
  - lib/deimos/backends/base.rb
@@ -348,11 +367,12 @@ files:
348
367
  - lib/deimos/backends/kafka.rb
349
368
  - lib/deimos/backends/kafka_async.rb
350
369
  - lib/deimos/backends/test.rb
351
- - lib/deimos/base_consumer.rb
352
370
  - lib/deimos/batch_consumer.rb
353
371
  - lib/deimos/config/configurable.rb
354
372
  - lib/deimos/config/configuration.rb
355
373
  - lib/deimos/config/phobos_config.rb
374
+ - lib/deimos/consume/batch_consumption.rb
375
+ - lib/deimos/consume/message_consumption.rb
356
376
  - lib/deimos/consumer.rb
357
377
  - lib/deimos/instrumentation.rb
358
378
  - lib/deimos/kafka_message.rb
@@ -365,6 +385,7 @@ files:
365
385
  - lib/deimos/monkey_patches/phobos_cli.rb
366
386
  - lib/deimos/monkey_patches/phobos_producer.rb
367
387
  - lib/deimos/monkey_patches/ruby_kafka_heartbeat.rb
388
+ - lib/deimos/poll_info.rb
368
389
  - lib/deimos/producer.rb
369
390
  - lib/deimos/railtie.rb
370
391
  - lib/deimos/schema_backends/avro_base.rb
@@ -379,17 +400,22 @@ files:
379
400
  - lib/deimos/tracing/datadog.rb
380
401
  - lib/deimos/tracing/mock.rb
381
402
  - lib/deimos/tracing/provider.rb
403
+ - lib/deimos/utils/db_poller.rb
382
404
  - lib/deimos/utils/db_producer.rb
383
- - lib/deimos/utils/executor.rb
405
+ - lib/deimos/utils/deadlock_retry.rb
384
406
  - lib/deimos/utils/inline_consumer.rb
385
407
  - lib/deimos/utils/lag_reporter.rb
386
- - lib/deimos/utils/platform_schema_validation.rb
387
- - lib/deimos/utils/signal_handler.rb
388
408
  - lib/deimos/version.rb
389
409
  - lib/generators/deimos/db_backend/templates/migration
390
410
  - lib/generators/deimos/db_backend/templates/rails3_migration
391
411
  - lib/generators/deimos/db_backend_generator.rb
412
+ - lib/generators/deimos/db_poller/templates/migration
413
+ - lib/generators/deimos/db_poller/templates/rails3_migration
414
+ - lib/generators/deimos/db_poller_generator.rb
392
415
  - lib/tasks/deimos.rake
416
+ - spec/active_record_batch_consumer_spec.rb
417
+ - spec/active_record_consume/batch_slicer_spec.rb
418
+ - spec/active_record_consume/schema_model_converter_spec.rb
393
419
  - spec/active_record_consumer_spec.rb
394
420
  - spec/active_record_producer_spec.rb
395
421
  - spec/backends/base_spec.rb
@@ -405,6 +431,7 @@ files:
405
431
  - spec/handlers/my_consumer.rb
406
432
  - spec/kafka_source_spec.rb
407
433
  - spec/kafka_topic_info_spec.rb
434
+ - spec/message_spec.rb
408
435
  - spec/phobos.bad_db.yml
409
436
  - spec/phobos.yml
410
437
  - spec/producer_spec.rb
@@ -416,18 +443,20 @@ files:
416
443
  - spec/schema_backends/base_spec.rb
417
444
  - spec/schemas/com/my-namespace/MySchema-key.avsc
418
445
  - spec/schemas/com/my-namespace/MySchema.avsc
446
+ - spec/schemas/com/my-namespace/MySchemaCompound-key.avsc
419
447
  - spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
420
448
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
421
449
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
422
450
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
451
+ - spec/schemas/com/my-namespace/Wibble.avsc
423
452
  - spec/schemas/com/my-namespace/Widget.avsc
424
453
  - spec/schemas/com/my-namespace/WidgetTheSecond.avsc
425
454
  - spec/spec_helper.rb
455
+ - spec/utils/db_poller_spec.rb
426
456
  - spec/utils/db_producer_spec.rb
427
- - spec/utils/executor_spec.rb
457
+ - spec/utils/deadlock_retry_spec.rb
428
458
  - spec/utils/lag_reporter_spec.rb
429
459
  - spec/utils/platform_schema_validation_spec.rb
430
- - spec/utils/signal_handler_spec.rb
431
460
  - support/deimos-solo.png
432
461
  - support/deimos-with-name-next.png
433
462
  - support/deimos-with-name.png
@@ -436,7 +465,7 @@ homepage: ''
436
465
  licenses:
437
466
  - Apache-2.0
438
467
  metadata: {}
439
- post_install_message:
468
+ post_install_message:
440
469
  rdoc_options: []
441
470
  require_paths:
442
471
  - lib
@@ -447,15 +476,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
447
476
  version: '0'
448
477
  required_rubygems_version: !ruby/object:Gem::Requirement
449
478
  requirements:
450
- - - ">="
479
+ - - ">"
451
480
  - !ruby/object:Gem::Version
452
- version: '0'
481
+ version: 1.3.1
453
482
  requirements: []
454
- rubygems_version: 3.1.2
455
- signing_key:
483
+ rubygems_version: 3.1.3
484
+ signing_key:
456
485
  specification_version: 4
457
486
  summary: Kafka libraries for Ruby.
458
487
  test_files:
488
+ - spec/active_record_batch_consumer_spec.rb
489
+ - spec/active_record_consume/batch_slicer_spec.rb
490
+ - spec/active_record_consume/schema_model_converter_spec.rb
459
491
  - spec/active_record_consumer_spec.rb
460
492
  - spec/active_record_producer_spec.rb
461
493
  - spec/backends/base_spec.rb
@@ -471,6 +503,7 @@ test_files:
471
503
  - spec/handlers/my_consumer.rb
472
504
  - spec/kafka_source_spec.rb
473
505
  - spec/kafka_topic_info_spec.rb
506
+ - spec/message_spec.rb
474
507
  - spec/phobos.bad_db.yml
475
508
  - spec/phobos.yml
476
509
  - spec/producer_spec.rb
@@ -482,15 +515,17 @@ test_files:
482
515
  - spec/schema_backends/base_spec.rb
483
516
  - spec/schemas/com/my-namespace/MySchema-key.avsc
484
517
  - spec/schemas/com/my-namespace/MySchema.avsc
518
+ - spec/schemas/com/my-namespace/MySchemaCompound-key.avsc
485
519
  - spec/schemas/com/my-namespace/MySchemaWithBooleans.avsc
486
520
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
487
521
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
488
522
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
523
+ - spec/schemas/com/my-namespace/Wibble.avsc
489
524
  - spec/schemas/com/my-namespace/Widget.avsc
490
525
  - spec/schemas/com/my-namespace/WidgetTheSecond.avsc
491
526
  - spec/spec_helper.rb
527
+ - spec/utils/db_poller_spec.rb
492
528
  - spec/utils/db_producer_spec.rb
493
- - spec/utils/executor_spec.rb
529
+ - spec/utils/deadlock_retry_spec.rb
494
530
  - spec/utils/lag_reporter_spec.rb
495
531
  - spec/utils/platform_schema_validation_spec.rb
496
- - spec/utils/signal_handler_spec.rb
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Deimos
4
- # Shared methods for Kafka Consumers
5
- class BaseConsumer
6
- include SharedConfig
7
-
8
- class << self
9
- # @return [Deimos::SchemaBackends::Base]
10
- def decoder
11
- @decoder ||= Deimos.schema_backend(schema: config[:schema],
12
- namespace: config[:namespace])
13
- end
14
-
15
- # @return [Deimos::SchemaBackends::Base]
16
- def key_decoder
17
- @key_decoder ||= Deimos.schema_backend(schema: config[:key_schema],
18
- namespace: config[:namespace])
19
- end
20
- end
21
-
22
- # Helper method to decode an encoded key.
23
- # @param key [String]
24
- # @return [Object] the decoded key.
25
- def decode_key(key)
26
- return nil if key.nil?
27
-
28
- config = self.class.config
29
- unless config[:key_configured]
30
- raise 'No key config given - if you are not decoding keys, please use '\
31
- '`key_config plain: true`'
32
- end
33
-
34
- if config[:key_field]
35
- self.class.decoder.decode_key(key, config[:key_field])
36
- elsif config[:key_schema]
37
- self.class.key_decoder.decode(key, schema: config[:key_schema])
38
- else # no encoding
39
- key
40
- end
41
- end
42
-
43
- protected
44
-
45
- # @param payload [Hash|String]
46
- # @param metadata [Hash]
47
- def _with_error_span(payload, metadata)
48
- @span = Deimos.config.tracer&.start(
49
- 'deimos-consumer',
50
- resource: self.class.name.gsub('::', '-')
51
- )
52
- yield
53
- rescue StandardError => e
54
- _handle_error(e, payload, metadata)
55
- ensure
56
- Deimos.config.tracer&.finish(@span)
57
- end
58
-
59
- def _report_time_delayed(payload, metadata)
60
- return if payload.nil? || payload['timestamp'].blank?
61
-
62
- begin
63
- time_delayed = Time.now.in_time_zone - payload['timestamp'].to_datetime
64
- rescue ArgumentError
65
- Deimos.config.logger.info(
66
- message: "Error parsing timestamp! #{payload['timestamp']}"
67
- )
68
- return
69
- end
70
- Deimos.config.metrics&.histogram('handler', time_delayed, tags: %W(
71
- time:time_delayed
72
- topic:#{metadata[:topic]}
73
- ))
74
- end
75
-
76
- # Overrideable method to determine if a given error should be considered
77
- # "fatal" and always be reraised.
78
- # @param error [Exception]
79
- # @param payload [Hash]
80
- # @param metadata [Hash]
81
- # @return [Boolean]
82
- def fatal_error?(_error, _payload, _metadata)
83
- false
84
- end
85
-
86
- # @param exception [Exception]
87
- # @param payload [Hash]
88
- # @param metadata [Hash]
89
- def _handle_error(exception, payload, metadata)
90
- Deimos.config.tracer&.set_error(@span, exception)
91
-
92
- raise if Deimos.config.consumers.reraise_errors ||
93
- Deimos.config.consumers.fatal_error&.call(exception, payload, metadata) ||
94
- fatal_error?(exception, payload, metadata)
95
- end
96
-
97
- # @param _time_taken [Float]
98
- # @param _payload [Hash]
99
- # @param _metadata [Hash]
100
- def _handle_success(_time_taken, _payload, _metadata)
101
- raise NotImplementedError
102
- end
103
- end
104
- end