deimos-ruby 1.24.3 → 2.0.0.pre.alpha2

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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -17
  3. data/.tool-versions +1 -0
  4. data/CHANGELOG.md +1 -1
  5. data/README.md +287 -498
  6. data/deimos-ruby.gemspec +4 -4
  7. data/docs/CONFIGURATION.md +133 -227
  8. data/docs/UPGRADING.md +237 -0
  9. data/lib/deimos/active_record_consume/batch_consumption.rb +28 -29
  10. data/lib/deimos/active_record_consume/message_consumption.rb +15 -21
  11. data/lib/deimos/active_record_consumer.rb +36 -26
  12. data/lib/deimos/active_record_producer.rb +28 -9
  13. data/lib/deimos/backends/base.rb +4 -35
  14. data/lib/deimos/backends/kafka.rb +6 -22
  15. data/lib/deimos/backends/kafka_async.rb +6 -22
  16. data/lib/deimos/backends/{db.rb → outbox.rb} +13 -9
  17. data/lib/deimos/config/configuration.rb +116 -385
  18. data/lib/deimos/consume/batch_consumption.rb +24 -124
  19. data/lib/deimos/consume/message_consumption.rb +36 -63
  20. data/lib/deimos/consumer.rb +16 -75
  21. data/lib/deimos/ext/consumer_route.rb +35 -0
  22. data/lib/deimos/ext/producer_middleware.rb +94 -0
  23. data/lib/deimos/ext/producer_route.rb +22 -0
  24. data/lib/deimos/ext/routing_defaults.rb +72 -0
  25. data/lib/deimos/ext/schema_route.rb +70 -0
  26. data/lib/deimos/kafka_message.rb +2 -2
  27. data/lib/deimos/kafka_source.rb +2 -7
  28. data/lib/deimos/kafka_topic_info.rb +1 -1
  29. data/lib/deimos/logging.rb +71 -0
  30. data/lib/deimos/message.rb +2 -11
  31. data/lib/deimos/metrics/datadog.rb +40 -1
  32. data/lib/deimos/metrics/provider.rb +4 -4
  33. data/lib/deimos/producer.rb +39 -116
  34. data/lib/deimos/railtie.rb +6 -0
  35. data/lib/deimos/schema_backends/avro_base.rb +21 -21
  36. data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -2
  37. data/lib/deimos/schema_backends/avro_validation.rb +2 -2
  38. data/lib/deimos/schema_backends/base.rb +19 -12
  39. data/lib/deimos/schema_backends/mock.rb +6 -1
  40. data/lib/deimos/schema_backends/plain.rb +47 -0
  41. data/lib/deimos/schema_class/base.rb +2 -2
  42. data/lib/deimos/schema_class/enum.rb +1 -1
  43. data/lib/deimos/schema_class/record.rb +2 -2
  44. data/lib/deimos/test_helpers.rb +95 -320
  45. data/lib/deimos/tracing/provider.rb +6 -6
  46. data/lib/deimos/transcoder.rb +88 -0
  47. data/lib/deimos/utils/db_poller/base.rb +16 -14
  48. data/lib/deimos/utils/db_poller/state_based.rb +3 -3
  49. data/lib/deimos/utils/db_poller/time_based.rb +4 -4
  50. data/lib/deimos/utils/db_poller.rb +1 -1
  51. data/lib/deimos/utils/deadlock_retry.rb +1 -1
  52. data/lib/deimos/utils/{db_producer.rb → outbox_producer.rb} +16 -47
  53. data/lib/deimos/utils/schema_class.rb +0 -7
  54. data/lib/deimos/version.rb +1 -1
  55. data/lib/deimos.rb +78 -26
  56. data/lib/generators/deimos/{db_backend_generator.rb → outbox_backend_generator.rb} +4 -4
  57. data/lib/generators/deimos/schema_class_generator.rb +0 -1
  58. data/lib/generators/deimos/v2/templates/karafka.rb.tt +149 -0
  59. data/lib/generators/deimos/v2_generator.rb +193 -0
  60. data/lib/tasks/deimos.rake +5 -7
  61. data/spec/active_record_batch_consumer_association_spec.rb +22 -13
  62. data/spec/active_record_batch_consumer_spec.rb +84 -65
  63. data/spec/active_record_consume/batch_consumption_spec.rb +10 -10
  64. data/spec/active_record_consume/batch_slicer_spec.rb +12 -12
  65. data/spec/active_record_consumer_spec.rb +29 -13
  66. data/spec/active_record_producer_spec.rb +36 -26
  67. data/spec/backends/base_spec.rb +0 -23
  68. data/spec/backends/kafka_async_spec.rb +1 -3
  69. data/spec/backends/kafka_spec.rb +1 -3
  70. data/spec/backends/{db_spec.rb → outbox_spec.rb} +14 -20
  71. data/spec/batch_consumer_spec.rb +66 -116
  72. data/spec/consumer_spec.rb +53 -147
  73. data/spec/deimos_spec.rb +10 -126
  74. data/spec/kafka_source_spec.rb +19 -52
  75. data/spec/karafka/karafka.rb +69 -0
  76. data/spec/karafka_config/karafka_spec.rb +97 -0
  77. data/spec/logging_spec.rb +25 -0
  78. data/spec/message_spec.rb +9 -9
  79. data/spec/producer_spec.rb +112 -254
  80. data/spec/rake_spec.rb +1 -3
  81. data/spec/schema_backends/avro_validation_spec.rb +1 -1
  82. data/spec/schemas/com/my-namespace/MySchemaWithTitle.avsc +22 -0
  83. data/spec/snapshots/consumers-no-nest.snap +49 -0
  84. data/spec/snapshots/consumers.snap +49 -0
  85. data/spec/snapshots/consumers_and_producers-no-nest.snap +49 -0
  86. data/spec/snapshots/consumers_and_producers.snap +49 -0
  87. data/spec/snapshots/consumers_circular-no-nest.snap +49 -0
  88. data/spec/snapshots/consumers_circular.snap +49 -0
  89. data/spec/snapshots/consumers_complex_types-no-nest.snap +49 -0
  90. data/spec/snapshots/consumers_complex_types.snap +49 -0
  91. data/spec/snapshots/consumers_nested-no-nest.snap +49 -0
  92. data/spec/snapshots/consumers_nested.snap +49 -0
  93. data/spec/snapshots/namespace_folders.snap +49 -0
  94. data/spec/snapshots/namespace_map.snap +49 -0
  95. data/spec/snapshots/producers_with_key-no-nest.snap +49 -0
  96. data/spec/snapshots/producers_with_key.snap +49 -0
  97. data/spec/spec_helper.rb +61 -29
  98. data/spec/utils/db_poller_spec.rb +49 -39
  99. data/spec/utils/{db_producer_spec.rb → outbox_producer_spec.rb} +17 -184
  100. metadata +57 -67
  101. data/lib/deimos/batch_consumer.rb +0 -7
  102. data/lib/deimos/config/phobos_config.rb +0 -164
  103. data/lib/deimos/instrumentation.rb +0 -95
  104. data/lib/deimos/monkey_patches/phobos_cli.rb +0 -35
  105. data/lib/deimos/utils/inline_consumer.rb +0 -158
  106. data/lib/deimos/utils/lag_reporter.rb +0 -186
  107. data/lib/deimos/utils/schema_controller_mixin.rb +0 -129
  108. data/spec/config/configuration_spec.rb +0 -329
  109. data/spec/kafka_listener_spec.rb +0 -55
  110. data/spec/phobos.bad_db.yml +0 -73
  111. data/spec/phobos.yml +0 -77
  112. data/spec/utils/inline_consumer_spec.rb +0 -31
  113. data/spec/utils/lag_reporter_spec.rb +0 -76
  114. data/spec/utils/platform_schema_validation_spec.rb +0 -0
  115. data/spec/utils/schema_controller_mixin_spec.rb +0 -84
  116. /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/migration +0 -0
  117. /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.3
4
+ version: 2.0.0.pre.alpha2
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-13 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,28 @@ 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/routing_defaults.rb
463
+ - lib/deimos/ext/schema_route.rb
467
464
  - lib/deimos/kafka_message.rb
468
465
  - lib/deimos/kafka_source.rb
469
466
  - lib/deimos/kafka_topic_info.rb
467
+ - lib/deimos/logging.rb
470
468
  - lib/deimos/message.rb
471
469
  - lib/deimos/metrics/datadog.rb
472
470
  - lib/deimos/metrics/mock.rb
473
471
  - lib/deimos/metrics/provider.rb
474
- - lib/deimos/monkey_patches/phobos_cli.rb
475
472
  - lib/deimos/poll_info.rb
476
473
  - lib/deimos/producer.rb
477
474
  - lib/deimos/railtie.rb
@@ -482,6 +479,7 @@ files:
482
479
  - lib/deimos/schema_backends/avro_validation.rb
483
480
  - lib/deimos/schema_backends/base.rb
484
481
  - lib/deimos/schema_backends/mock.rb
482
+ - lib/deimos/schema_backends/plain.rb
485
483
  - lib/deimos/schema_class/base.rb
486
484
  - lib/deimos/schema_class/enum.rb
487
485
  - lib/deimos/schema_class/record.rb
@@ -490,32 +488,32 @@ files:
490
488
  - lib/deimos/tracing/datadog.rb
491
489
  - lib/deimos/tracing/mock.rb
492
490
  - lib/deimos/tracing/provider.rb
491
+ - lib/deimos/transcoder.rb
493
492
  - lib/deimos/utils/db_poller.rb
494
493
  - lib/deimos/utils/db_poller/base.rb
495
494
  - lib/deimos/utils/db_poller/state_based.rb
496
495
  - lib/deimos/utils/db_poller/time_based.rb
497
- - lib/deimos/utils/db_producer.rb
498
496
  - lib/deimos/utils/deadlock_retry.rb
499
- - lib/deimos/utils/inline_consumer.rb
500
- - lib/deimos/utils/lag_reporter.rb
497
+ - lib/deimos/utils/outbox_producer.rb
501
498
  - lib/deimos/utils/schema_class.rb
502
- - lib/deimos/utils/schema_controller_mixin.rb
503
499
  - lib/deimos/version.rb
504
500
  - lib/generators/deimos/active_record/templates/migration.rb.tt
505
501
  - lib/generators/deimos/active_record/templates/model.rb.tt
506
502
  - lib/generators/deimos/active_record_generator.rb
507
503
  - lib/generators/deimos/bulk_import_id/templates/migration.rb.tt
508
504
  - 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
505
  - lib/generators/deimos/db_poller/templates/migration
513
506
  - lib/generators/deimos/db_poller/templates/rails3_migration
514
507
  - lib/generators/deimos/db_poller_generator.rb
508
+ - lib/generators/deimos/outbox_backend/templates/migration
509
+ - lib/generators/deimos/outbox_backend/templates/rails3_migration
510
+ - lib/generators/deimos/outbox_backend_generator.rb
515
511
  - lib/generators/deimos/schema_class/templates/schema_class.rb.tt
516
512
  - lib/generators/deimos/schema_class/templates/schema_enum.rb.tt
517
513
  - lib/generators/deimos/schema_class/templates/schema_record.rb.tt
518
514
  - lib/generators/deimos/schema_class_generator.rb
515
+ - lib/generators/deimos/v2/templates/karafka.rb.tt
516
+ - lib/generators/deimos/v2_generator.rb
519
517
  - lib/tasks/deimos.rake
520
518
  - rbs_collection.lock.yaml
521
519
  - rbs_collection.yaml
@@ -532,11 +530,10 @@ files:
532
530
  - spec/active_record_consumer_spec.rb
533
531
  - spec/active_record_producer_spec.rb
534
532
  - spec/backends/base_spec.rb
535
- - spec/backends/db_spec.rb
536
533
  - spec/backends/kafka_async_spec.rb
537
534
  - spec/backends/kafka_spec.rb
535
+ - spec/backends/outbox_spec.rb
538
536
  - spec/batch_consumer_spec.rb
539
- - spec/config/configuration_spec.rb
540
537
  - spec/consumer_spec.rb
541
538
  - spec/deimos_spec.rb
542
539
  - spec/generators/active_record_generator_spec.rb
@@ -546,12 +543,12 @@ files:
546
543
  - spec/generators/schema_class_generator_spec.rb
547
544
  - spec/handlers/my_batch_consumer.rb
548
545
  - spec/handlers/my_consumer.rb
549
- - spec/kafka_listener_spec.rb
550
546
  - spec/kafka_source_spec.rb
551
547
  - spec/kafka_topic_info_spec.rb
548
+ - spec/karafka/karafka.rb
549
+ - spec/karafka_config/karafka_spec.rb
550
+ - spec/logging_spec.rb
552
551
  - spec/message_spec.rb
553
- - spec/phobos.bad_db.yml
554
- - spec/phobos.yml
555
552
  - spec/producer_spec.rb
556
553
  - spec/rake_spec.rb
557
554
  - spec/schema_backends/avro_base_shared.rb
@@ -569,6 +566,7 @@ files:
569
566
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
570
567
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
571
568
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
569
+ - spec/schemas/com/my-namespace/MySchemaWithTitle.avsc
572
570
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
573
571
  - spec/schemas/com/my-namespace/MySchema_key.avsc
574
572
  - spec/schemas/com/my-namespace/Wibble.avsc
@@ -620,12 +618,8 @@ files:
620
618
  - spec/snapshots/producers_with_key.snap
621
619
  - spec/spec_helper.rb
622
620
  - spec/utils/db_poller_spec.rb
623
- - spec/utils/db_producer_spec.rb
624
621
  - 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
622
+ - spec/utils/outbox_producer_spec.rb
629
623
  - support/deimos-solo.png
630
624
  - support/deimos-with-name-next.png
631
625
  - support/deimos-with-name.png
@@ -645,9 +639,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
645
639
  version: '0'
646
640
  required_rubygems_version: !ruby/object:Gem::Requirement
647
641
  requirements:
648
- - - ">="
642
+ - - ">"
649
643
  - !ruby/object:Gem::Version
650
- version: '0'
644
+ version: 1.3.1
651
645
  requirements: []
652
646
  rubygems_version: 3.4.10
653
647
  signing_key:
@@ -663,11 +657,10 @@ test_files:
663
657
  - spec/active_record_consumer_spec.rb
664
658
  - spec/active_record_producer_spec.rb
665
659
  - spec/backends/base_spec.rb
666
- - spec/backends/db_spec.rb
667
660
  - spec/backends/kafka_async_spec.rb
668
661
  - spec/backends/kafka_spec.rb
662
+ - spec/backends/outbox_spec.rb
669
663
  - spec/batch_consumer_spec.rb
670
- - spec/config/configuration_spec.rb
671
664
  - spec/consumer_spec.rb
672
665
  - spec/deimos_spec.rb
673
666
  - spec/generators/active_record_generator_spec.rb
@@ -677,12 +670,12 @@ test_files:
677
670
  - spec/generators/schema_class_generator_spec.rb
678
671
  - spec/handlers/my_batch_consumer.rb
679
672
  - spec/handlers/my_consumer.rb
680
- - spec/kafka_listener_spec.rb
681
673
  - spec/kafka_source_spec.rb
682
674
  - spec/kafka_topic_info_spec.rb
675
+ - spec/karafka/karafka.rb
676
+ - spec/karafka_config/karafka_spec.rb
677
+ - spec/logging_spec.rb
683
678
  - spec/message_spec.rb
684
- - spec/phobos.bad_db.yml
685
- - spec/phobos.yml
686
679
  - spec/producer_spec.rb
687
680
  - spec/rake_spec.rb
688
681
  - spec/schema_backends/avro_base_shared.rb
@@ -700,6 +693,7 @@ test_files:
700
693
  - spec/schemas/com/my-namespace/MySchemaWithComplexTypes.avsc
701
694
  - spec/schemas/com/my-namespace/MySchemaWithDateTimes.avsc
702
695
  - spec/schemas/com/my-namespace/MySchemaWithId.avsc
696
+ - spec/schemas/com/my-namespace/MySchemaWithTitle.avsc
703
697
  - spec/schemas/com/my-namespace/MySchemaWithUniqueId.avsc
704
698
  - spec/schemas/com/my-namespace/MySchema_key.avsc
705
699
  - spec/schemas/com/my-namespace/Wibble.avsc
@@ -751,9 +745,5 @@ test_files:
751
745
  - spec/snapshots/producers_with_key.snap
752
746
  - spec/spec_helper.rb
753
747
  - spec/utils/db_poller_spec.rb
754
- - spec/utils/db_producer_spec.rb
755
748
  - 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
749
+ - 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,164 +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
- persistent_connections: self.producers.persistent_connections
57
- },
58
- consumer: {
59
- session_timeout: self.consumers.session_timeout,
60
- offset_commit_interval: self.consumers.offset_commit_interval,
61
- offset_commit_threshold: self.consumers.offset_commit_threshold,
62
- heartbeat_interval: self.consumers.heartbeat_interval
63
- },
64
- backoff: _backoff(self.consumers.backoff.to_a)
65
- }
66
-
67
- p_config[:listeners] = self.consumer_objects.map do |consumer|
68
- next nil if consumer.disabled
69
-
70
- hash = consumer.to_h.reject do |k, _|
71
- %i(class_name schema namespace key_config backoff disabled replace_associations
72
- bulk_import_id_column).include?(k)
73
- end
74
- hash = hash.map { |k, v| [k, v.is_a?(Symbol) ? v.to_s : v] }.to_h
75
- hash[:handler] = consumer.class_name
76
- if consumer.backoff
77
- hash[:backoff] = _backoff(consumer.backoff.to_a)
78
- end
79
- hash
80
- end
81
- p_config[:listeners].compact!
82
-
83
- if self.kafka.ssl.enabled
84
- %w(ca_cert client_cert client_cert_key).each do |key|
85
- next if self.kafka.ssl.send(key).blank?
86
-
87
- p_config[:kafka]["ssl_#{key}".to_sym] = ssl_var_contents(self.kafka.ssl.send(key))
88
- end
89
- end
90
-
91
- if self.kafka.sasl.enabled
92
- p_config[:kafka][:sasl_over_ssl] = self.kafka.sasl.enforce_ssl
93
- %w(
94
- gssapi_principal
95
- gssapi_keytab
96
- plain_authzid
97
- plain_username
98
- plain_password
99
- scram_username
100
- scram_password
101
- scram_mechanism
102
- oauth_token_provider
103
- ).each do |key|
104
- value = self.kafka.sasl.send(key)
105
- next if value.blank?
106
-
107
- p_config[:kafka]["sasl_#{key}".to_sym] = value
108
- end
109
- end
110
- p_config
111
- end
112
-
113
- # @param key [String]
114
- # @return [String]
115
- def ssl_var_contents(key)
116
- File.exist?(key) ? File.read(key) : key
117
- end
118
-
119
- # Legacy method to parse Phobos config file
120
- # @!visibility private
121
- def phobos_config_file=(file)
122
- pconfig = YAML.load(ERB.new(File.read(File.expand_path(file))).result). # rubocop:disable Security/YAMLLoad
123
- with_indifferent_access
124
- self.logger&.warn('phobos.yml is deprecated - use direct configuration instead.')
125
- pconfig[:kafka].each do |k, v|
126
- if k.starts_with?('ssl')
127
- k = k.sub('ssl_', '')
128
- self.kafka.ssl.send("#{k}=", v)
129
- elsif k.starts_with?('sasl')
130
- k = (k == 'sasl_over_ssl') ? 'enforce_ssl' : k.sub('sasl_', '')
131
- self.kafka.sasl.send("#{k}=", v)
132
- else
133
- self.kafka.send("#{k}=", v)
134
- end
135
- end
136
- pconfig[:producer].each do |k, v|
137
- self.producers.send("#{k}=", v)
138
- end
139
- pconfig[:consumer].each do |k, v|
140
- self.consumers.send("#{k}=", v)
141
- end
142
- self.consumers.backoff = pconfig[:backoff][:min_ms]..pconfig[:backoff][:max_ms]
143
- pconfig[:listeners].each do |listener_hash|
144
- self.consumer do
145
- listener_hash.each do |k, v|
146
- k = 'class_name' if k == 'handler'
147
- send(k, v)
148
- end
149
- end
150
- end
151
- end
152
-
153
- private
154
-
155
- # @param values [Array<Integer>]
156
- # @return [Hash<Integer>]
157
- def _backoff(values)
158
- {
159
- min_ms: values[0],
160
- max_ms: values[-1]
161
- }
162
- end
163
- end
164
- 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