deimos-ruby 1.24.2 → 2.0.0.pre.alpha1

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -17
  3. data/.tool-versions +1 -0
  4. data/CHANGELOG.md +5 -0
  5. data/README.md +287 -498
  6. data/deimos-ruby.gemspec +4 -4
  7. data/docs/CONFIGURATION.md +133 -226
  8. data/docs/UPGRADING.md +237 -0
  9. data/lib/deimos/active_record_consume/batch_consumption.rb +29 -28
  10. data/lib/deimos/active_record_consume/mass_updater.rb +59 -4
  11. data/lib/deimos/active_record_consume/message_consumption.rb +15 -21
  12. data/lib/deimos/active_record_consumer.rb +36 -21
  13. data/lib/deimos/active_record_producer.rb +28 -9
  14. data/lib/deimos/backends/base.rb +4 -35
  15. data/lib/deimos/backends/kafka.rb +6 -22
  16. data/lib/deimos/backends/kafka_async.rb +6 -22
  17. data/lib/deimos/backends/{db.rb → outbox.rb} +13 -9
  18. data/lib/deimos/config/configuration.rb +116 -379
  19. data/lib/deimos/consume/batch_consumption.rb +24 -124
  20. data/lib/deimos/consume/message_consumption.rb +36 -63
  21. data/lib/deimos/consumer.rb +16 -75
  22. data/lib/deimos/ext/consumer_route.rb +35 -0
  23. data/lib/deimos/ext/producer_middleware.rb +94 -0
  24. data/lib/deimos/ext/producer_route.rb +22 -0
  25. data/lib/deimos/ext/redraw.rb +29 -0
  26. data/lib/deimos/ext/routing_defaults.rb +72 -0
  27. data/lib/deimos/ext/schema_route.rb +70 -0
  28. data/lib/deimos/kafka_message.rb +2 -2
  29. data/lib/deimos/kafka_source.rb +2 -7
  30. data/lib/deimos/kafka_topic_info.rb +1 -1
  31. data/lib/deimos/logging.rb +71 -0
  32. data/lib/deimos/message.rb +2 -11
  33. data/lib/deimos/metrics/datadog.rb +40 -1
  34. data/lib/deimos/metrics/provider.rb +4 -4
  35. data/lib/deimos/producer.rb +39 -116
  36. data/lib/deimos/railtie.rb +6 -0
  37. data/lib/deimos/schema_backends/avro_base.rb +21 -21
  38. data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -2
  39. data/lib/deimos/schema_backends/avro_validation.rb +2 -2
  40. data/lib/deimos/schema_backends/base.rb +19 -12
  41. data/lib/deimos/schema_backends/mock.rb +6 -1
  42. data/lib/deimos/schema_backends/plain.rb +47 -0
  43. data/lib/deimos/schema_class/base.rb +2 -2
  44. data/lib/deimos/schema_class/enum.rb +1 -1
  45. data/lib/deimos/schema_class/record.rb +2 -2
  46. data/lib/deimos/test_helpers.rb +95 -320
  47. data/lib/deimos/tracing/provider.rb +6 -6
  48. data/lib/deimos/transcoder.rb +88 -0
  49. data/lib/deimos/utils/db_poller/base.rb +16 -14
  50. data/lib/deimos/utils/db_poller/state_based.rb +3 -3
  51. data/lib/deimos/utils/db_poller/time_based.rb +4 -4
  52. data/lib/deimos/utils/db_poller.rb +1 -1
  53. data/lib/deimos/utils/deadlock_retry.rb +1 -1
  54. data/lib/deimos/utils/{db_producer.rb → outbox_producer.rb} +16 -47
  55. data/lib/deimos/utils/schema_class.rb +0 -7
  56. data/lib/deimos/version.rb +1 -1
  57. data/lib/deimos.rb +79 -26
  58. data/lib/generators/deimos/{db_backend_generator.rb → outbox_backend_generator.rb} +4 -4
  59. data/lib/generators/deimos/schema_class_generator.rb +0 -1
  60. data/lib/generators/deimos/v2/templates/karafka.rb.tt +149 -0
  61. data/lib/generators/deimos/v2_generator.rb +193 -0
  62. data/lib/tasks/deimos.rake +5 -7
  63. data/spec/active_record_batch_consumer_association_spec.rb +22 -13
  64. data/spec/active_record_batch_consumer_spec.rb +84 -65
  65. data/spec/active_record_consume/batch_consumption_spec.rb +10 -10
  66. data/spec/active_record_consume/batch_slicer_spec.rb +12 -12
  67. data/spec/active_record_consume/mass_updater_spec.rb +137 -0
  68. data/spec/active_record_consumer_spec.rb +29 -13
  69. data/spec/active_record_producer_spec.rb +36 -26
  70. data/spec/backends/base_spec.rb +0 -23
  71. data/spec/backends/kafka_async_spec.rb +1 -3
  72. data/spec/backends/kafka_spec.rb +1 -3
  73. data/spec/backends/{db_spec.rb → outbox_spec.rb} +14 -20
  74. data/spec/batch_consumer_spec.rb +66 -116
  75. data/spec/consumer_spec.rb +53 -147
  76. data/spec/deimos_spec.rb +10 -126
  77. data/spec/kafka_source_spec.rb +19 -52
  78. data/spec/karafka/karafka.rb +69 -0
  79. data/spec/karafka_config/karafka_spec.rb +97 -0
  80. data/spec/logging_spec.rb +25 -0
  81. data/spec/message_spec.rb +9 -9
  82. data/spec/producer_spec.rb +112 -254
  83. data/spec/rake_spec.rb +1 -3
  84. data/spec/schema_backends/avro_validation_spec.rb +1 -1
  85. data/spec/schemas/com/my-namespace/MySchemaWithTitle.avsc +22 -0
  86. data/spec/snapshots/consumers-no-nest.snap +49 -0
  87. data/spec/snapshots/consumers.snap +49 -0
  88. data/spec/snapshots/consumers_and_producers-no-nest.snap +49 -0
  89. data/spec/snapshots/consumers_and_producers.snap +49 -0
  90. data/spec/snapshots/consumers_circular-no-nest.snap +49 -0
  91. data/spec/snapshots/consumers_circular.snap +49 -0
  92. data/spec/snapshots/consumers_complex_types-no-nest.snap +49 -0
  93. data/spec/snapshots/consumers_complex_types.snap +49 -0
  94. data/spec/snapshots/consumers_nested-no-nest.snap +49 -0
  95. data/spec/snapshots/consumers_nested.snap +49 -0
  96. data/spec/snapshots/namespace_folders.snap +49 -0
  97. data/spec/snapshots/namespace_map.snap +49 -0
  98. data/spec/snapshots/producers_with_key-no-nest.snap +49 -0
  99. data/spec/snapshots/producers_with_key.snap +49 -0
  100. data/spec/spec_helper.rb +61 -29
  101. data/spec/utils/db_poller_spec.rb +49 -39
  102. data/spec/utils/{db_producer_spec.rb → outbox_producer_spec.rb} +17 -184
  103. metadata +58 -67
  104. data/lib/deimos/batch_consumer.rb +0 -7
  105. data/lib/deimos/config/phobos_config.rb +0 -163
  106. data/lib/deimos/instrumentation.rb +0 -95
  107. data/lib/deimos/monkey_patches/phobos_cli.rb +0 -35
  108. data/lib/deimos/utils/inline_consumer.rb +0 -158
  109. data/lib/deimos/utils/lag_reporter.rb +0 -186
  110. data/lib/deimos/utils/schema_controller_mixin.rb +0 -129
  111. data/spec/config/configuration_spec.rb +0 -321
  112. data/spec/kafka_listener_spec.rb +0 -55
  113. data/spec/phobos.bad_db.yml +0 -73
  114. data/spec/phobos.yml +0 -77
  115. data/spec/utils/inline_consumer_spec.rb +0 -31
  116. data/spec/utils/lag_reporter_spec.rb +0 -76
  117. data/spec/utils/platform_schema_validation_spec.rb +0 -0
  118. data/spec/utils/schema_controller_mixin_spec.rb +0 -84
  119. /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/migration +0 -0
  120. /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/rails3_migration +0 -0
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.24.2
4
+ version: 2.0.0.pre.alpha1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-01 00:00:00.000000000 Z
11
+ date: 2024-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: avro_turf
@@ -31,53 +31,33 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2'
33
33
  - !ruby/object:Gem::Dependency
34
- name: fig_tree
34
+ name: karafka
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.0.2
39
+ version: '2.0'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.0.2
47
- - !ruby/object:Gem::Dependency
48
- name: phobos
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: '1.9'
54
- - - "<"
55
- - !ruby/object:Gem::Version
56
- version: '3.0'
57
- type: :runtime
58
- prerelease: false
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: '1.9'
64
- - - "<"
65
- - !ruby/object:Gem::Version
66
- version: '3.0'
46
+ version: '2.0'
67
47
  - !ruby/object:Gem::Dependency
68
- name: ruby-kafka
48
+ name: fig_tree
69
49
  requirement: !ruby/object:Gem::Requirement
70
50
  requirements:
71
- - - "<"
51
+ - - "~>"
72
52
  - !ruby/object:Gem::Version
73
- version: '2'
53
+ version: 0.2.0
74
54
  type: :runtime
75
55
  prerelease: false
76
56
  version_requirements: !ruby/object:Gem::Requirement
77
57
  requirements:
78
- - - "<"
58
+ - - "~>"
79
59
  - !ruby/object:Gem::Version
80
- version: '2'
60
+ version: 0.2.0
81
61
  - !ruby/object:Gem::Dependency
82
62
  name: sigurd
83
63
  requirement: !ruby/object:Gem::Requirement
@@ -225,19 +205,33 @@ dependencies:
225
205
  - !ruby/object:Gem::Version
226
206
  version: '1'
227
207
  - !ruby/object:Gem::Dependency
228
- name: mysql2
208
+ name: karafka-testing
229
209
  requirement: !ruby/object:Gem::Requirement
230
210
  requirements:
231
211
  - - "~>"
232
212
  - !ruby/object:Gem::Version
233
- version: '0.5'
213
+ version: '2.0'
234
214
  type: :development
235
215
  prerelease: false
236
216
  version_requirements: !ruby/object:Gem::Requirement
237
217
  requirements:
238
218
  - - "~>"
239
219
  - !ruby/object:Gem::Version
240
- version: '0.5'
220
+ version: '2.0'
221
+ - !ruby/object:Gem::Dependency
222
+ name: trilogy
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0.1'
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0.1'
241
235
  - !ruby/object:Gem::Dependency
242
236
  name: pg
243
237
  requirement: !ruby/object:Gem::Requirement
@@ -422,6 +416,7 @@ files:
422
416
  - ".rubocop.yml"
423
417
  - ".rubocop_todo.yml"
424
418
  - ".ruby-version"
419
+ - ".tool-versions"
425
420
  - CHANGELOG.md
426
421
  - CODE_OF_CONDUCT.md
427
422
  - Dockerfile
@@ -452,26 +447,29 @@ files:
452
447
  - lib/deimos/active_record_consumer.rb
453
448
  - lib/deimos/active_record_producer.rb
454
449
  - lib/deimos/backends/base.rb
455
- - lib/deimos/backends/db.rb
456
450
  - lib/deimos/backends/kafka.rb
457
451
  - lib/deimos/backends/kafka_async.rb
452
+ - lib/deimos/backends/outbox.rb
458
453
  - lib/deimos/backends/test.rb
459
- - lib/deimos/batch_consumer.rb
460
454
  - lib/deimos/config/configuration.rb
461
- - lib/deimos/config/phobos_config.rb
462
455
  - lib/deimos/consume/batch_consumption.rb
463
456
  - lib/deimos/consume/message_consumption.rb
464
457
  - lib/deimos/consumer.rb
465
458
  - lib/deimos/exceptions.rb
466
- - lib/deimos/instrumentation.rb
459
+ - lib/deimos/ext/consumer_route.rb
460
+ - lib/deimos/ext/producer_middleware.rb
461
+ - lib/deimos/ext/producer_route.rb
462
+ - lib/deimos/ext/redraw.rb
463
+ - lib/deimos/ext/routing_defaults.rb
464
+ - lib/deimos/ext/schema_route.rb
467
465
  - lib/deimos/kafka_message.rb
468
466
  - lib/deimos/kafka_source.rb
469
467
  - lib/deimos/kafka_topic_info.rb
468
+ - lib/deimos/logging.rb
470
469
  - lib/deimos/message.rb
471
470
  - lib/deimos/metrics/datadog.rb
472
471
  - lib/deimos/metrics/mock.rb
473
472
  - lib/deimos/metrics/provider.rb
474
- - lib/deimos/monkey_patches/phobos_cli.rb
475
473
  - lib/deimos/poll_info.rb
476
474
  - lib/deimos/producer.rb
477
475
  - lib/deimos/railtie.rb
@@ -482,6 +480,7 @@ files:
482
480
  - lib/deimos/schema_backends/avro_validation.rb
483
481
  - lib/deimos/schema_backends/base.rb
484
482
  - lib/deimos/schema_backends/mock.rb
483
+ - lib/deimos/schema_backends/plain.rb
485
484
  - lib/deimos/schema_class/base.rb
486
485
  - lib/deimos/schema_class/enum.rb
487
486
  - lib/deimos/schema_class/record.rb
@@ -490,32 +489,32 @@ files:
490
489
  - lib/deimos/tracing/datadog.rb
491
490
  - lib/deimos/tracing/mock.rb
492
491
  - lib/deimos/tracing/provider.rb
492
+ - lib/deimos/transcoder.rb
493
493
  - lib/deimos/utils/db_poller.rb
494
494
  - lib/deimos/utils/db_poller/base.rb
495
495
  - lib/deimos/utils/db_poller/state_based.rb
496
496
  - lib/deimos/utils/db_poller/time_based.rb
497
- - lib/deimos/utils/db_producer.rb
498
497
  - lib/deimos/utils/deadlock_retry.rb
499
- - lib/deimos/utils/inline_consumer.rb
500
- - lib/deimos/utils/lag_reporter.rb
498
+ - lib/deimos/utils/outbox_producer.rb
501
499
  - lib/deimos/utils/schema_class.rb
502
- - lib/deimos/utils/schema_controller_mixin.rb
503
500
  - lib/deimos/version.rb
504
501
  - lib/generators/deimos/active_record/templates/migration.rb.tt
505
502
  - lib/generators/deimos/active_record/templates/model.rb.tt
506
503
  - lib/generators/deimos/active_record_generator.rb
507
504
  - lib/generators/deimos/bulk_import_id/templates/migration.rb.tt
508
505
  - lib/generators/deimos/bulk_import_id_generator.rb
509
- - lib/generators/deimos/db_backend/templates/migration
510
- - lib/generators/deimos/db_backend/templates/rails3_migration
511
- - lib/generators/deimos/db_backend_generator.rb
512
506
  - lib/generators/deimos/db_poller/templates/migration
513
507
  - lib/generators/deimos/db_poller/templates/rails3_migration
514
508
  - lib/generators/deimos/db_poller_generator.rb
509
+ - lib/generators/deimos/outbox_backend/templates/migration
510
+ - lib/generators/deimos/outbox_backend/templates/rails3_migration
511
+ - lib/generators/deimos/outbox_backend_generator.rb
515
512
  - lib/generators/deimos/schema_class/templates/schema_class.rb.tt
516
513
  - lib/generators/deimos/schema_class/templates/schema_enum.rb.tt
517
514
  - lib/generators/deimos/schema_class/templates/schema_record.rb.tt
518
515
  - lib/generators/deimos/schema_class_generator.rb
516
+ - lib/generators/deimos/v2/templates/karafka.rb.tt
517
+ - lib/generators/deimos/v2_generator.rb
519
518
  - lib/tasks/deimos.rake
520
519
  - rbs_collection.lock.yaml
521
520
  - rbs_collection.yaml
@@ -532,11 +531,10 @@ files:
532
531
  - spec/active_record_consumer_spec.rb
533
532
  - spec/active_record_producer_spec.rb
534
533
  - spec/backends/base_spec.rb
535
- - spec/backends/db_spec.rb
536
534
  - spec/backends/kafka_async_spec.rb
537
535
  - spec/backends/kafka_spec.rb
536
+ - spec/backends/outbox_spec.rb
538
537
  - spec/batch_consumer_spec.rb
539
- - spec/config/configuration_spec.rb
540
538
  - spec/consumer_spec.rb
541
539
  - spec/deimos_spec.rb
542
540
  - spec/generators/active_record_generator_spec.rb
@@ -546,12 +544,12 @@ files:
546
544
  - spec/generators/schema_class_generator_spec.rb
547
545
  - spec/handlers/my_batch_consumer.rb
548
546
  - spec/handlers/my_consumer.rb
549
- - spec/kafka_listener_spec.rb
550
547
  - spec/kafka_source_spec.rb
551
548
  - spec/kafka_topic_info_spec.rb
549
+ - spec/karafka/karafka.rb
550
+ - spec/karafka_config/karafka_spec.rb
551
+ - spec/logging_spec.rb
552
552
  - spec/message_spec.rb
553
- - spec/phobos.bad_db.yml
554
- - spec/phobos.yml
555
553
  - spec/producer_spec.rb
556
554
  - spec/rake_spec.rb
557
555
  - spec/schema_backends/avro_base_shared.rb
@@ -569,6 +567,7 @@ files:
569
567
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
570
568
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
571
569
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
570
+ - spec/schemas/com/my-namespace/MySchemaWithTitle.avsc
572
571
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
573
572
  - spec/schemas/com/my-namespace/MySchema_key.avsc
574
573
  - spec/schemas/com/my-namespace/Wibble.avsc
@@ -620,12 +619,8 @@ files:
620
619
  - spec/snapshots/producers_with_key.snap
621
620
  - spec/spec_helper.rb
622
621
  - spec/utils/db_poller_spec.rb
623
- - spec/utils/db_producer_spec.rb
624
622
  - spec/utils/deadlock_retry_spec.rb
625
- - spec/utils/inline_consumer_spec.rb
626
- - spec/utils/lag_reporter_spec.rb
627
- - spec/utils/platform_schema_validation_spec.rb
628
- - spec/utils/schema_controller_mixin_spec.rb
623
+ - spec/utils/outbox_producer_spec.rb
629
624
  - support/deimos-solo.png
630
625
  - support/deimos-with-name-next.png
631
626
  - support/deimos-with-name.png
@@ -645,9 +640,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
645
640
  version: '0'
646
641
  required_rubygems_version: !ruby/object:Gem::Requirement
647
642
  requirements:
648
- - - ">="
643
+ - - ">"
649
644
  - !ruby/object:Gem::Version
650
- version: '0'
645
+ version: 1.3.1
651
646
  requirements: []
652
647
  rubygems_version: 3.4.10
653
648
  signing_key:
@@ -663,11 +658,10 @@ test_files:
663
658
  - spec/active_record_consumer_spec.rb
664
659
  - spec/active_record_producer_spec.rb
665
660
  - spec/backends/base_spec.rb
666
- - spec/backends/db_spec.rb
667
661
  - spec/backends/kafka_async_spec.rb
668
662
  - spec/backends/kafka_spec.rb
663
+ - spec/backends/outbox_spec.rb
669
664
  - spec/batch_consumer_spec.rb
670
- - spec/config/configuration_spec.rb
671
665
  - spec/consumer_spec.rb
672
666
  - spec/deimos_spec.rb
673
667
  - spec/generators/active_record_generator_spec.rb
@@ -677,12 +671,12 @@ test_files:
677
671
  - spec/generators/schema_class_generator_spec.rb
678
672
  - spec/handlers/my_batch_consumer.rb
679
673
  - spec/handlers/my_consumer.rb
680
- - spec/kafka_listener_spec.rb
681
674
  - spec/kafka_source_spec.rb
682
675
  - spec/kafka_topic_info_spec.rb
676
+ - spec/karafka/karafka.rb
677
+ - spec/karafka_config/karafka_spec.rb
678
+ - spec/logging_spec.rb
683
679
  - spec/message_spec.rb
684
- - spec/phobos.bad_db.yml
685
- - spec/phobos.yml
686
680
  - spec/producer_spec.rb
687
681
  - spec/rake_spec.rb
688
682
  - spec/schema_backends/avro_base_shared.rb
@@ -700,6 +694,7 @@ test_files:
700
694
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
701
695
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
702
696
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
697
+ - spec/schemas/com/my-namespace/MySchemaWithTitle.avsc
703
698
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
704
699
  - spec/schemas/com/my-namespace/MySchema_key.avsc
705
700
  - spec/schemas/com/my-namespace/Wibble.avsc
@@ -751,9 +746,5 @@ test_files:
751
746
  - spec/snapshots/producers_with_key.snap
752
747
  - spec/spec_helper.rb
753
748
  - spec/utils/db_poller_spec.rb
754
- - spec/utils/db_producer_spec.rb
755
749
  - spec/utils/deadlock_retry_spec.rb
756
- - spec/utils/inline_consumer_spec.rb
757
- - spec/utils/lag_reporter_spec.rb
758
- - spec/utils/platform_schema_validation_spec.rb
759
- - spec/utils/schema_controller_mixin_spec.rb
750
+ - spec/utils/outbox_producer_spec.rb
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Deimos
4
- # @deprecated Use Deimos::Consumer with `delivery: inline_batch` configured instead
5
- class BatchConsumer < Consumer
6
- end
7
- end
@@ -1,163 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/core_ext/array'
4
-
5
- module Deimos
6
- # Module to handle phobos.yml as well as outputting the configuration to save
7
- # to Phobos itself.
8
- module PhobosConfig
9
- extend ActiveSupport::Concern
10
-
11
- # @return [Hash]
12
- def to_h
13
- (FIELDS + [:handler]).map { |f|
14
- val = self.send(f)
15
- if f == :backoff && val
16
- [:backoff, _backoff(val)]
17
- elsif val.present?
18
- [f, val]
19
- end
20
- }.to_h
21
- end
22
-
23
- # @return [void]
24
- def reset!
25
- super
26
- Phobos.configure(self.phobos_config)
27
- end
28
-
29
- # Create a hash representing the config that Phobos expects.
30
- # @return [Hash]
31
- def phobos_config
32
- p_config = {
33
- logger: Logger.new(STDOUT),
34
- custom_logger: self.phobos_logger,
35
- custom_kafka_logger: self.kafka.logger,
36
- kafka: {
37
- client_id: self.kafka.client_id,
38
- connect_timeout: self.kafka.connect_timeout,
39
- socket_timeout: self.kafka.socket_timeout,
40
- ssl_verify_hostname: self.kafka.ssl.verify_hostname,
41
- ssl_ca_certs_from_system: self.kafka.ssl.ca_certs_from_system,
42
- seed_brokers: Array.wrap(self.kafka.seed_brokers)
43
- },
44
- producer: {
45
- ack_timeout: self.producers.ack_timeout,
46
- required_acks: self.producers.required_acks,
47
- max_retries: self.producers.max_retries,
48
- retry_backoff: self.producers.retry_backoff,
49
- max_buffer_size: self.producers.max_buffer_size,
50
- max_buffer_bytesize: self.producers.max_buffer_bytesize,
51
- compression_codec: self.producers.compression_codec,
52
- compression_threshold: self.producers.compression_threshold,
53
- max_queue_size: self.producers.max_queue_size,
54
- delivery_threshold: self.producers.delivery_threshold,
55
- delivery_interval: self.producers.delivery_interval
56
- },
57
- consumer: {
58
- session_timeout: self.consumers.session_timeout,
59
- offset_commit_interval: self.consumers.offset_commit_interval,
60
- offset_commit_threshold: self.consumers.offset_commit_threshold,
61
- heartbeat_interval: self.consumers.heartbeat_interval
62
- },
63
- backoff: _backoff(self.consumers.backoff.to_a)
64
- }
65
-
66
- p_config[:listeners] = self.consumer_objects.map do |consumer|
67
- next nil if consumer.disabled
68
-
69
- hash = consumer.to_h.reject do |k, _|
70
- %i(class_name schema namespace key_config backoff disabled replace_associations
71
- bulk_import_id_column).include?(k)
72
- end
73
- hash = hash.map { |k, v| [k, v.is_a?(Symbol) ? v.to_s : v] }.to_h
74
- hash[:handler] = consumer.class_name
75
- if consumer.backoff
76
- hash[:backoff] = _backoff(consumer.backoff.to_a)
77
- end
78
- hash
79
- end
80
- p_config[:listeners].compact!
81
-
82
- if self.kafka.ssl.enabled
83
- %w(ca_cert client_cert client_cert_key).each do |key|
84
- next if self.kafka.ssl.send(key).blank?
85
-
86
- p_config[:kafka]["ssl_#{key}".to_sym] = ssl_var_contents(self.kafka.ssl.send(key))
87
- end
88
- end
89
-
90
- if self.kafka.sasl.enabled
91
- p_config[:kafka][:sasl_over_ssl] = self.kafka.sasl.enforce_ssl
92
- %w(
93
- gssapi_principal
94
- gssapi_keytab
95
- plain_authzid
96
- plain_username
97
- plain_password
98
- scram_username
99
- scram_password
100
- scram_mechanism
101
- oauth_token_provider
102
- ).each do |key|
103
- value = self.kafka.sasl.send(key)
104
- next if value.blank?
105
-
106
- p_config[:kafka]["sasl_#{key}".to_sym] = value
107
- end
108
- end
109
- p_config
110
- end
111
-
112
- # @param key [String]
113
- # @return [String]
114
- def ssl_var_contents(key)
115
- File.exist?(key) ? File.read(key) : key
116
- end
117
-
118
- # Legacy method to parse Phobos config file
119
- # @!visibility private
120
- def phobos_config_file=(file)
121
- pconfig = YAML.load(ERB.new(File.read(File.expand_path(file))).result). # rubocop:disable Security/YAMLLoad
122
- with_indifferent_access
123
- self.logger&.warn('phobos.yml is deprecated - use direct configuration instead.')
124
- pconfig[:kafka].each do |k, v|
125
- if k.starts_with?('ssl')
126
- k = k.sub('ssl_', '')
127
- self.kafka.ssl.send("#{k}=", v)
128
- elsif k.starts_with?('sasl')
129
- k = (k == 'sasl_over_ssl') ? 'enforce_ssl' : k.sub('sasl_', '')
130
- self.kafka.sasl.send("#{k}=", v)
131
- else
132
- self.kafka.send("#{k}=", v)
133
- end
134
- end
135
- pconfig[:producer].each do |k, v|
136
- self.producers.send("#{k}=", v)
137
- end
138
- pconfig[:consumer].each do |k, v|
139
- self.consumers.send("#{k}=", v)
140
- end
141
- self.consumers.backoff = pconfig[:backoff][:min_ms]..pconfig[:backoff][:max_ms]
142
- pconfig[:listeners].each do |listener_hash|
143
- self.consumer do
144
- listener_hash.each do |k, v|
145
- k = 'class_name' if k == 'handler'
146
- send(k, v)
147
- end
148
- end
149
- end
150
- end
151
-
152
- private
153
-
154
- # @param values [Array<Integer>]
155
- # @return [Hash<Integer>]
156
- def _backoff(values)
157
- {
158
- min_ms: values[0],
159
- max_ms: values[-1]
160
- }
161
- end
162
- end
163
- end
@@ -1,95 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/notifications'
4
- require 'active_support/concern'
5
-
6
- # :nodoc:
7
- module Deimos
8
- # Copied from Phobos instrumentation.
9
- module Instrumentation
10
- extend ActiveSupport::Concern
11
-
12
- # @return [String]
13
- NAMESPACE = 'Deimos'
14
-
15
- # :nodoc:
16
- module ClassMethods
17
- # @param event [String]
18
- # @return [void]
19
- def subscribe(event)
20
- ActiveSupport::Notifications.subscribe("#{NAMESPACE}.#{event}") do |*args|
21
- yield(ActiveSupport::Notifications::Event.new(*args)) if block_given?
22
- end
23
- end
24
-
25
- # @param subscriber [ActiveSupport::Subscriber]
26
- # @return [void]
27
- def unsubscribe(subscriber)
28
- ActiveSupport::Notifications.unsubscribe(subscriber)
29
- end
30
-
31
- # @param event [String]
32
- # @param extra [Hash]
33
- # @return [void]
34
- def instrument(event, extra={})
35
- ActiveSupport::Notifications.instrument("#{NAMESPACE}.#{event}", extra) do |extra2|
36
- yield(extra2) if block_given?
37
- end
38
- end
39
- end
40
- end
41
-
42
- include Instrumentation
43
-
44
- # This module listens to events published by RubyKafka.
45
- module KafkaListener
46
- # @param exception [Exception]
47
- def self.handle_exception_with_messages(exception)
48
- messages = exception.failed_messages
49
- messages.group_by(&:topic).each do |topic, batch|
50
- producer = Deimos::Producer.descendants.find { |c| c.topic == topic }
51
- next if batch.empty? || !producer
52
-
53
- decoder = Deimos.schema_backend(schema: producer.config[:schema],
54
- namespace: producer.config[:namespace])
55
- payloads = batch.map { |m| decoder.decode(m.value) }
56
-
57
- Deimos.config.metrics&.increment(
58
- 'publish_error',
59
- tags: %W(topic:#{topic}),
60
- by: payloads.size
61
- )
62
- Deimos.instrument(
63
- 'produce_error',
64
- producer: producer,
65
- topic: topic,
66
- exception_object: exception,
67
- payloads: payloads
68
- )
69
- end
70
- end
71
-
72
- # Listens for any exceptions that happen during publishing and re-publishes
73
- # as a Deimos event.
74
- # @param event [ActiveSupport::Notifications::Event]
75
- # @return [void]
76
- def self.send_produce_error(event)
77
- exception = event.payload[:exception_object]
78
- return unless exception
79
-
80
- if exception.respond_to?(:failed_messages)
81
- handle_exception_with_messages(exception)
82
- else
83
- Deimos.config.metrics&.increment(
84
- 'publish_error',
85
- by: event.payload[:message_count] || 1
86
- )
87
- end
88
- end
89
- end
90
-
91
- ActiveSupport::Notifications.subscribe('deliver_messages.producer.kafka') do |*args|
92
- event = ActiveSupport::Notifications::Event.new(*args)
93
- KafkaListener.send_produce_error(event)
94
- end
95
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'phobos/cli/start'
4
-
5
- #@!visibility private
6
- module Phobos
7
- # :nodoc:
8
- module CLI
9
- # :nodoc:
10
- class Start
11
- # :nodoc:
12
- def validate_listeners!
13
- Phobos.config.listeners.each do |listener|
14
- handler = listener.handler
15
- begin
16
- handler.constantize
17
- rescue NameError
18
- error_exit("Handler '#{handler}' not defined")
19
- end
20
-
21
- delivery = listener.delivery
22
- if delivery.nil?
23
- Phobos::CLI.logger.warn do
24
- Hash(message: "Delivery option should be specified, defaulting to 'batch'"\
25
- ' - specify this option to silence this message')
26
- end
27
- elsif !Listener::DELIVERY_OPTS.include?(delivery)
28
- error_exit("Invalid delivery option '#{delivery}'. Please specify one of: "\
29
- "#{Listener::DELIVERY_OPTS.join(', ')}")
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end