karafka 2.5.5 → 2.5.7

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/LICENSE-COMM +4 -0
  4. data/README.md +2 -2
  5. data/certs/expired.txt +2 -0
  6. data/karafka.gemspec +23 -23
  7. data/lib/active_job/karafka.rb +2 -2
  8. data/lib/active_job/queue_adapters/karafka_adapter.rb +5 -5
  9. data/lib/karafka/active_job/consumer.rb +3 -3
  10. data/lib/karafka/active_job/current_attributes.rb +4 -4
  11. data/lib/karafka/active_job/job_options_contract.rb +2 -2
  12. data/lib/karafka/admin/acl.rb +3 -3
  13. data/lib/karafka/admin/configs/resource.rb +1 -1
  14. data/lib/karafka/admin/configs.rb +1 -1
  15. data/lib/karafka/admin/consumer_groups.rb +8 -8
  16. data/lib/karafka/admin/contracts/replication.rb +2 -2
  17. data/lib/karafka/admin/replication.rb +21 -21
  18. data/lib/karafka/admin/topics.rb +6 -6
  19. data/lib/karafka/admin.rb +4 -5
  20. data/lib/karafka/app.rb +3 -3
  21. data/lib/karafka/base_consumer.rb +34 -30
  22. data/lib/karafka/cli/base.rb +8 -8
  23. data/lib/karafka/cli/console.rb +1 -1
  24. data/lib/karafka/cli/contracts/server.rb +12 -12
  25. data/lib/karafka/cli/help.rb +2 -2
  26. data/lib/karafka/cli/info.rb +4 -4
  27. data/lib/karafka/cli/install.rb +11 -11
  28. data/lib/karafka/cli/server.rb +6 -6
  29. data/lib/karafka/cli/swarm.rb +1 -1
  30. data/lib/karafka/cli/topics/align.rb +4 -4
  31. data/lib/karafka/cli/topics/base.rb +5 -5
  32. data/lib/karafka/cli/topics/create.rb +2 -2
  33. data/lib/karafka/cli/topics/delete.rb +2 -2
  34. data/lib/karafka/cli/topics/help.rb +5 -1
  35. data/lib/karafka/cli/topics/plan.rb +16 -16
  36. data/lib/karafka/cli/topics/repartition.rb +3 -3
  37. data/lib/karafka/cli/topics.rb +22 -22
  38. data/lib/karafka/cli.rb +2 -2
  39. data/lib/karafka/connection/client.rb +17 -17
  40. data/lib/karafka/connection/listener.rb +6 -6
  41. data/lib/karafka/connection/mode.rb +1 -1
  42. data/lib/karafka/connection/proxy.rb +1 -1
  43. data/lib/karafka/connection/status.rb +2 -2
  44. data/lib/karafka/constraints.rb +3 -3
  45. data/lib/karafka/embedded.rb +3 -3
  46. data/lib/karafka/env.rb +4 -4
  47. data/lib/karafka/errors.rb +6 -1
  48. data/lib/karafka/execution_mode.rb +1 -1
  49. data/lib/karafka/helpers/config_importer.rb +2 -2
  50. data/lib/karafka/helpers/interval_runner.rb +4 -2
  51. data/lib/karafka/helpers/multi_delegator.rb +1 -1
  52. data/lib/karafka/instrumentation/assignments_tracker.rb +9 -9
  53. data/lib/karafka/instrumentation/callbacks/error.rb +5 -5
  54. data/lib/karafka/instrumentation/callbacks/oauthbearer_token_refresh.rb +4 -4
  55. data/lib/karafka/instrumentation/callbacks/rebalance.rb +6 -6
  56. data/lib/karafka/instrumentation/callbacks/statistics.rb +5 -5
  57. data/lib/karafka/instrumentation/logger.rb +7 -7
  58. data/lib/karafka/instrumentation/logger_listener.rb +76 -63
  59. data/lib/karafka/instrumentation/vendors/appsignal/base.rb +1 -1
  60. data/lib/karafka/instrumentation/vendors/appsignal/client.rb +1 -1
  61. data/lib/karafka/instrumentation/vendors/appsignal/errors_listener.rb +1 -1
  62. data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +36 -36
  63. data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +33 -28
  64. data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +38 -38
  65. data/lib/karafka/instrumentation/vendors/kubernetes/base_listener.rb +5 -5
  66. data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +1 -1
  67. data/lib/karafka/instrumentation/vendors/kubernetes/swarm_liveness_listener.rb +1 -1
  68. data/lib/karafka/licenser.rb +115 -8
  69. data/lib/karafka/messages/builders/batch_metadata.rb +4 -2
  70. data/lib/karafka/messages/messages.rb +1 -1
  71. data/lib/karafka/patches/rdkafka/bindings.rb +2 -2
  72. data/lib/karafka/pro/active_job/job_options_contract.rb +2 -2
  73. data/lib/karafka/pro/cleaner/messages/messages.rb +10 -0
  74. data/lib/karafka/pro/cli/contracts/server.rb +12 -12
  75. data/lib/karafka/pro/cli/parallel_segments/base.rb +4 -4
  76. data/lib/karafka/pro/cli/parallel_segments/collapse.rb +5 -5
  77. data/lib/karafka/pro/cli/parallel_segments/distribute.rb +3 -3
  78. data/lib/karafka/pro/cli/parallel_segments.rb +7 -7
  79. data/lib/karafka/pro/cli/topics/health.rb +162 -0
  80. data/lib/karafka/pro/cli/topics.rb +52 -0
  81. data/lib/karafka/pro/connection/manager.rb +14 -14
  82. data/lib/karafka/pro/encryption/contracts/config.rb +2 -2
  83. data/lib/karafka/pro/encryption/messages/middleware.rb +2 -2
  84. data/lib/karafka/pro/encryption/messages/parser.rb +2 -2
  85. data/lib/karafka/pro/encryption/setup/config.rb +2 -2
  86. data/lib/karafka/pro/iterator/tpl_builder.rb +2 -2
  87. data/lib/karafka/pro/iterator.rb +1 -1
  88. data/lib/karafka/pro/loader.rb +2 -1
  89. data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +1 -1
  90. data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +24 -14
  91. data/lib/karafka/pro/processing/filters/base.rb +1 -1
  92. data/lib/karafka/pro/processing/filters/delayer.rb +2 -2
  93. data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +1 -1
  94. data/lib/karafka/pro/processing/offset_metadata/consumer.rb +1 -1
  95. data/lib/karafka/pro/processing/parallel_segments/filters/base.rb +6 -6
  96. data/lib/karafka/pro/processing/partitioner.rb +3 -3
  97. data/lib/karafka/pro/processing/periodic_job/consumer.rb +6 -5
  98. data/lib/karafka/pro/processing/piping/consumer.rb +7 -7
  99. data/lib/karafka/pro/processing/schedulers/base.rb +5 -5
  100. data/lib/karafka/pro/processing/schedulers/default.rb +5 -5
  101. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +6 -3
  102. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +6 -3
  103. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +6 -3
  104. data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +2 -2
  105. data/lib/karafka/pro/processing/strategies/default.rb +22 -22
  106. data/lib/karafka/pro/processing/strategies/dlq/default.rb +7 -7
  107. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +6 -3
  108. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +6 -3
  109. data/lib/karafka/pro/processing/strategies/ftr/default.rb +2 -2
  110. data/lib/karafka/pro/processing/strategies/lrj/default.rb +2 -2
  111. data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +6 -3
  112. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +6 -3
  113. data/lib/karafka/pro/processing/strategies/lrj/mom.rb +2 -2
  114. data/lib/karafka/pro/recurring_tasks/consumer.rb +2 -2
  115. data/lib/karafka/pro/recurring_tasks/contracts/config.rb +2 -2
  116. data/lib/karafka/pro/recurring_tasks/contracts/task.rb +2 -2
  117. data/lib/karafka/pro/recurring_tasks/dispatcher.rb +2 -2
  118. data/lib/karafka/pro/recurring_tasks/listener.rb +1 -1
  119. data/lib/karafka/pro/recurring_tasks/matcher.rb +2 -2
  120. data/lib/karafka/pro/recurring_tasks/serializer.rb +5 -5
  121. data/lib/karafka/pro/recurring_tasks/setup/config.rb +3 -3
  122. data/lib/karafka/pro/recurring_tasks/task.rb +4 -4
  123. data/lib/karafka/pro/recurring_tasks.rb +4 -4
  124. data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +2 -2
  125. data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
  126. data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +1 -1
  127. data/lib/karafka/pro/routing/features/delaying/contracts/topic.rb +2 -2
  128. data/lib/karafka/pro/routing/features/direct_assignments/contracts/consumer_group.rb +2 -2
  129. data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +2 -2
  130. data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +1 -1
  131. data/lib/karafka/pro/routing/features/expiring/contracts/topic.rb +2 -2
  132. data/lib/karafka/pro/routing/features/filtering/contracts/topic.rb +2 -2
  133. data/lib/karafka/pro/routing/features/inline_insights/contracts/topic.rb +2 -2
  134. data/lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb +2 -2
  135. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +1 -1
  136. data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +2 -2
  137. data/lib/karafka/pro/routing/features/multiplexing.rb +5 -5
  138. data/lib/karafka/pro/routing/features/non_blocking_job/topic.rb +1 -1
  139. data/lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb +2 -2
  140. data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +1 -1
  141. data/lib/karafka/pro/routing/features/offset_metadata.rb +1 -1
  142. data/lib/karafka/pro/routing/features/parallel_segments/consumer_group.rb +5 -5
  143. data/lib/karafka/pro/routing/features/parallel_segments/contracts/consumer_group.rb +2 -2
  144. data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +2 -2
  145. data/lib/karafka/pro/routing/features/patterns/contracts/pattern.rb +3 -3
  146. data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +2 -2
  147. data/lib/karafka/pro/routing/features/patterns/topic.rb +1 -1
  148. data/lib/karafka/pro/routing/features/pausing/contracts/topic.rb +2 -2
  149. data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +2 -2
  150. data/lib/karafka/pro/routing/features/periodic_job/topic.rb +1 -1
  151. data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +7 -7
  152. data/lib/karafka/pro/routing/features/recurring_tasks/contracts/topic.rb +2 -2
  153. data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +13 -13
  154. data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +2 -2
  155. data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +2 -2
  156. data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +2 -2
  157. data/lib/karafka/pro/routing/features/swarm.rb +1 -1
  158. data/lib/karafka/pro/routing/features/throttling/contracts/topic.rb +2 -2
  159. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +7 -7
  160. data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +2 -2
  161. data/lib/karafka/pro/scheduled_messages/consumer.rb +4 -4
  162. data/lib/karafka/pro/scheduled_messages/contracts/config.rb +2 -2
  163. data/lib/karafka/pro/scheduled_messages/contracts/message.rb +10 -10
  164. data/lib/karafka/pro/scheduled_messages/daily_buffer.rb +2 -2
  165. data/lib/karafka/pro/scheduled_messages/deserializers/headers.rb +4 -4
  166. data/lib/karafka/pro/scheduled_messages/dispatcher.rb +5 -5
  167. data/lib/karafka/pro/scheduled_messages/proxy.rb +8 -8
  168. data/lib/karafka/pro/scheduled_messages/schema_validator.rb +1 -1
  169. data/lib/karafka/pro/scheduled_messages/setup/config.rb +2 -2
  170. data/lib/karafka/pro/scheduled_messages/state.rb +1 -1
  171. data/lib/karafka/pro/scheduled_messages/tracker.rb +2 -2
  172. data/lib/karafka/pro/scheduled_messages.rb +2 -2
  173. data/lib/karafka/pro/swarm/liveness_listener.rb +2 -2
  174. data/lib/karafka/process.rb +1 -1
  175. data/lib/karafka/processing/coordinator.rb +1 -1
  176. data/lib/karafka/processing/inline_insights/consumer.rb +4 -4
  177. data/lib/karafka/processing/inline_insights/tracker.rb +6 -6
  178. data/lib/karafka/processing/jobs/base.rb +6 -4
  179. data/lib/karafka/processing/jobs_queue.rb +10 -0
  180. data/lib/karafka/processing/schedulers/default.rb +4 -4
  181. data/lib/karafka/processing/strategies/base.rb +6 -6
  182. data/lib/karafka/processing/strategies/default.rb +13 -13
  183. data/lib/karafka/processing/strategies/dlq.rb +1 -1
  184. data/lib/karafka/processing/worker.rb +5 -5
  185. data/lib/karafka/railtie.rb +11 -11
  186. data/lib/karafka/routing/builder.rb +3 -3
  187. data/lib/karafka/routing/contracts/consumer_group.rb +6 -6
  188. data/lib/karafka/routing/contracts/routing.rb +2 -2
  189. data/lib/karafka/routing/contracts/topic.rb +4 -4
  190. data/lib/karafka/routing/features/active_job/contracts/topic.rb +3 -3
  191. data/lib/karafka/routing/features/base/expander.rb +4 -4
  192. data/lib/karafka/routing/features/base.rb +8 -8
  193. data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
  194. data/lib/karafka/routing/features/declaratives/contracts/topic.rb +2 -2
  195. data/lib/karafka/routing/features/deserializers/contracts/topic.rb +2 -2
  196. data/lib/karafka/routing/features/eofed/contracts/topic.rb +3 -3
  197. data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +2 -2
  198. data/lib/karafka/routing/features/inline_insights.rb +7 -7
  199. data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +2 -2
  200. data/lib/karafka/routing/subscription_group.rb +9 -9
  201. data/lib/karafka/runner.rb +3 -3
  202. data/lib/karafka/server.rb +14 -5
  203. data/lib/karafka/setup/attributes_map.rb +7 -7
  204. data/lib/karafka/setup/config.rb +11 -11
  205. data/lib/karafka/setup/contracts/config.rb +2 -2
  206. data/lib/karafka/setup/defaults_injector.rb +11 -11
  207. data/lib/karafka/swarm/manager.rb +6 -6
  208. data/lib/karafka/swarm/node.rb +8 -37
  209. data/lib/karafka/swarm/producer_replacer.rb +110 -0
  210. data/lib/karafka/swarm/supervisor.rb +9 -6
  211. data/lib/karafka/swarm.rb +1 -1
  212. data/lib/karafka/time_trackers/pause.rb +1 -1
  213. data/lib/karafka/version.rb +1 -1
  214. data/lib/karafka.rb +36 -36
  215. metadata +7 -3
@@ -27,18 +27,6 @@ module Karafka
27
27
  # @return [Integer] pid of the node
28
28
  attr_reader :pid
29
29
 
30
- # When re-creating a producer in the fork, those are not attributes we want to inherit
31
- # from the parent process because they are updated in the fork. If user wants to take those
32
- # from the parent process, he should redefine them by overwriting the whole producer.
33
- SKIPPABLE_NEW_PRODUCER_ATTRIBUTES = %i[
34
- id
35
- kafka
36
- logger
37
- oauth
38
- ].freeze
39
-
40
- private_constant :SKIPPABLE_NEW_PRODUCER_ATTRIBUTES
41
-
42
30
  # @param id [Integer] number of the fork. Used for uniqueness setup for group client ids and
43
31
  # other stuff where we need to know a unique reference of the fork in regards to the rest
44
32
  # of them.
@@ -70,24 +58,7 @@ module Karafka
70
58
  config.producer.close
71
59
 
72
60
  old_producer = config.producer
73
- old_producer_config = old_producer.config
74
-
75
- # Supervisor producer is closed, hence we need a new one here
76
- config.producer = WaterDrop::Producer.new do |p_config|
77
- p_config.kafka = Setup::AttributesMap.producer(kafka.dup)
78
- p_config.logger = config.logger
79
-
80
- old_producer_config.to_h.each do |key, value|
81
- next if SKIPPABLE_NEW_PRODUCER_ATTRIBUTES.include?(key)
82
-
83
- p_config.public_send("#{key}=", value)
84
- end
85
-
86
- # Namespaced attributes need to be migrated directly on their config node
87
- old_producer_config.oauth.to_h.each do |key, value|
88
- p_config.oauth.public_send("#{key}=", value)
89
- end
90
- end
61
+ config.producer = ProducerReplacer.new.call(old_producer, kafka, config.logger)
91
62
 
92
63
  @pid = ::Process.pid
93
64
  @reader.close
@@ -100,9 +71,9 @@ module Karafka
100
71
 
101
72
  swarm.node = self
102
73
  monitor.subscribe(liveness_listener)
103
- monitor.instrument('swarm.node.after_fork', caller: self)
74
+ monitor.instrument("swarm.node.after_fork", caller: self)
104
75
 
105
- Karafka::Process.tags.add(:execution_mode, 'mode:swarm')
76
+ Karafka::Process.tags.add(:execution_mode, "mode:swarm")
106
77
  Karafka::Process.tags.add(:swarm_nodeid, "node:#{@id}")
107
78
 
108
79
  Server.execution_mode.swarm!
@@ -118,7 +89,7 @@ module Karafka
118
89
  # Indicates that this node is doing well
119
90
  # @note Child API
120
91
  def healthy
121
- write('0')
92
+ write("0")
122
93
  end
123
94
 
124
95
  # Indicates, that this node has failed
@@ -127,7 +98,7 @@ module Karafka
127
98
  # have complex health-checking with reporting.
128
99
  # @note Child API
129
100
  # @note We convert this to string to normalize the API
130
- def unhealthy(reason_code = '1')
101
+ def unhealthy(reason_code = "1")
131
102
  write(reason_code.to_s)
132
103
  end
133
104
 
@@ -192,19 +163,19 @@ module Karafka
192
163
  # Sends sigterm to the node
193
164
  # @note Parent API
194
165
  def stop
195
- signal('TERM')
166
+ signal("TERM")
196
167
  end
197
168
 
198
169
  # Sends sigtstp to the node
199
170
  # @note Parent API
200
171
  def quiet
201
- signal('TSTP')
172
+ signal("TSTP")
202
173
  end
203
174
 
204
175
  # Terminates node
205
176
  # @note Parent API
206
177
  def terminate
207
- signal('KILL')
178
+ signal("KILL")
208
179
  end
209
180
 
210
181
  # Sends provided signal to the node
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ module Swarm
5
+ # Builds a new WaterDrop producer that inherits configuration from an old one
6
+ #
7
+ # When a swarm node forks, the parent's producer must be replaced with a new one.
8
+ # This class encapsulates the logic for building that new producer, inheriting all relevant
9
+ # settings from the old one while generating fresh connection-level configuration.
10
+ class ProducerReplacer
11
+ # Attributes that should not be directly copied from the old producer config because they
12
+ # are either regenerated fresh (kafka, logger, id) or handled via their own namespaced
13
+ # migration (oauth, polling, polling.fd).
14
+ SKIPPABLE_ATTRIBUTES = %i[
15
+ id
16
+ kafka
17
+ logger
18
+ oauth
19
+ polling
20
+ fd
21
+ ].freeze
22
+
23
+ private_constant :SKIPPABLE_ATTRIBUTES
24
+
25
+ # Builds a new WaterDrop producer inheriting configuration from the old one
26
+ #
27
+ # @param old_producer [WaterDrop::Producer] the old producer to inherit settings from
28
+ # @param kafka [Hash] app-level kafka configuration
29
+ # @param logger [Object] logger instance for the new producer
30
+ # @return [WaterDrop::Producer] new producer with inherited configuration
31
+ def call(old_producer, kafka, logger)
32
+ old_producer_config = old_producer.config
33
+
34
+ WaterDrop::Producer.new do |p_config|
35
+ p_config.logger = logger
36
+
37
+ migrate_kafka(p_config, old_producer_config, kafka)
38
+ migrate_root(p_config, old_producer_config)
39
+ migrate_oauth(p_config, old_producer_config)
40
+ migrate_polling(p_config, old_producer_config)
41
+ migrate_polling_fd(p_config, old_producer_config)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # Migrates root-level producer attributes from the old producer, skipping those that are
48
+ # regenerated fresh or handled by their own namespaced migration
49
+ #
50
+ # @param p_config [WaterDrop::Config] new producer config being built
51
+ # @param old_producer_config [WaterDrop::Config] old producer config to inherit from
52
+ def migrate_root(p_config, old_producer_config)
53
+ old_producer_config.to_h.each do |key, value|
54
+ next if SKIPPABLE_ATTRIBUTES.include?(key)
55
+
56
+ p_config.public_send("#{key}=", value)
57
+ end
58
+ end
59
+
60
+ # Builds fresh kafka config from app-level settings and preserves any producer-specific
61
+ # kafka settings from the old producer (e.g., enable.idempotence) that aren't in the
62
+ # base app kafka config
63
+ #
64
+ # @param p_config [WaterDrop::Config] new producer config being built
65
+ # @param old_producer_config [WaterDrop::Config] old producer config to inherit from
66
+ # @param kafka [Hash] app-level kafka configuration
67
+ def migrate_kafka(p_config, old_producer_config, kafka)
68
+ p_config.kafka = Setup::AttributesMap.producer(kafka.dup)
69
+
70
+ old_producer_config.kafka.each do |key, value|
71
+ next if p_config.kafka.key?(key)
72
+
73
+ p_config.kafka[key] = value
74
+ end
75
+ end
76
+
77
+ # Migrates oauth configuration from the old producer
78
+ #
79
+ # @param p_config [WaterDrop::Config] new producer config being built
80
+ # @param old_producer_config [WaterDrop::Config] old producer config to inherit from
81
+ def migrate_oauth(p_config, old_producer_config)
82
+ old_producer_config.oauth.to_h.each do |key, value|
83
+ p_config.oauth.public_send("#{key}=", value)
84
+ end
85
+ end
86
+
87
+ # Migrates polling configuration from the old producer
88
+ #
89
+ # @param p_config [WaterDrop::Config] new producer config being built
90
+ # @param old_producer_config [WaterDrop::Config] old producer config to inherit from
91
+ def migrate_polling(p_config, old_producer_config)
92
+ old_producer_config.polling.to_h.each do |key, value|
93
+ next if SKIPPABLE_ATTRIBUTES.include?(key)
94
+
95
+ p_config.polling.public_send("#{key}=", value)
96
+ end
97
+ end
98
+
99
+ # Migrates polling fd configuration from the old producer
100
+ #
101
+ # @param p_config [WaterDrop::Config] new producer config being built
102
+ # @param old_producer_config [WaterDrop::Config] old producer config to inherit from
103
+ def migrate_polling_fd(p_config, old_producer_config)
104
+ old_producer_config.polling.fd.to_h.each do |key, value|
105
+ p_config.polling.fd.public_send("#{key}=", value)
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -66,7 +66,7 @@ module Karafka
66
66
  process.on_sigquit { stop }
67
67
  process.on_sigterm { stop }
68
68
  process.on_sigtstp { quiet }
69
- process.on_sigttin { signal('TTIN') }
69
+ process.on_sigttin { signal("TTIN") }
70
70
  # Needed to be registered as we want to unlock on child changes
71
71
  process.on_sigchld { nil }
72
72
  process.on_any_active { unlock }
@@ -87,13 +87,13 @@ module Karafka
87
87
  # If anything went wrong during supervision, signal this and die
88
88
  # Supervisor is meant to be thin and not cause any issues. If you encounter this case
89
89
  # please report it as it should be considered critical
90
- rescue StandardError => e
90
+ rescue => e
91
91
  monitor.instrument(
92
- 'error.occurred',
92
+ "error.occurred",
93
93
  caller: self,
94
94
  error: e,
95
95
  manager: manager,
96
- type: 'swarm.supervisor.error'
96
+ type: "swarm.supervisor.error"
97
97
  )
98
98
 
99
99
  manager.terminate
@@ -148,11 +148,14 @@ module Karafka
148
148
  raise Errors::ForcefulShutdownError
149
149
  rescue Errors::ForcefulShutdownError => e
150
150
  monitor.instrument(
151
- 'error.occurred',
151
+ "error.occurred",
152
152
  caller: self,
153
153
  error: e,
154
154
  manager: manager,
155
- type: 'app.stopping.error'
155
+ active_listeners: [],
156
+ alive_workers: [],
157
+ in_processing: {},
158
+ type: "app.stopping.error"
156
159
  )
157
160
 
158
161
  # Run forceful kill
data/lib/karafka/swarm.rb CHANGED
@@ -14,7 +14,7 @@ module Karafka
14
14
 
15
15
  raise(
16
16
  Errors::UnsupportedOptionError,
17
- 'Swarm mode not supported on this platform'
17
+ "Swarm mode not supported on this platform"
18
18
  )
19
19
  end
20
20
 
@@ -115,7 +115,7 @@ module Karafka
115
115
 
116
116
  timeout = backoff_factor * @timeout
117
117
 
118
- @max_timeout && timeout > @max_timeout ? @max_timeout : timeout
118
+ (@max_timeout && timeout > @max_timeout) ? @max_timeout : timeout
119
119
  end
120
120
  end
121
121
  end
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = '2.5.5'
6
+ VERSION = "2.5.7"
7
7
  end
data/lib/karafka.rb CHANGED
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'karafka-core'
4
- require 'delegate'
5
- require 'English'
6
- require 'rdkafka'
7
- require 'waterdrop'
8
- require 'json'
9
- require 'forwardable'
10
- require 'fileutils'
11
- require 'openssl'
12
- require 'optparse'
13
- require 'socket'
14
- require 'date'
15
- require 'singleton'
16
- require 'digest'
17
- require 'zeitwerk'
18
- require 'logger'
3
+ require "karafka-core"
4
+ require "delegate"
5
+ require "English"
6
+ require "rdkafka"
7
+ require "waterdrop"
8
+ require "json"
9
+ require "forwardable"
10
+ require "fileutils"
11
+ require "openssl"
12
+ require "optparse"
13
+ require "socket"
14
+ require "date"
15
+ require "singleton"
16
+ require "digest"
17
+ require "zeitwerk"
18
+ require "logger"
19
19
 
20
20
  # Karafka framework main namespace
21
21
  module Karafka
@@ -50,7 +50,7 @@ module Karafka
50
50
 
51
51
  # @return [Pathname] root path of this gem
52
52
  def gem_root
53
- Pathname.new(File.expand_path('..', __dir__))
53
+ Pathname.new(File.expand_path("..", __dir__))
54
54
  end
55
55
 
56
56
  # @return [Pathname] Karafka app root path (user application path)
@@ -58,26 +58,26 @@ module Karafka
58
58
  return @root if @root
59
59
 
60
60
  # If user points to a different root explicitly, use it
61
- if ENV['KARAFKA_ROOT_DIR']
62
- @root = Pathname.new(ENV['KARAFKA_ROOT_DIR'])
61
+ if ENV["KARAFKA_ROOT_DIR"]
62
+ @root = Pathname.new(ENV["KARAFKA_ROOT_DIR"])
63
63
 
64
64
  return @root
65
65
  end
66
66
 
67
- if defined?(::Bundler)
67
+ @root = if defined?(::Bundler)
68
68
  # By default we infer the project root from bundler.
69
69
  # We cannot use the BUNDLE_GEMFILE env directly because it may be altered by things like
70
70
  # ruby-lsp. Instead we always fallback to the most outer Gemfile. In most of the cases, it
71
71
  # won't matter but in case of some automatic setup alterations like ruby-lsp, the location
72
72
  # from which the project starts may not match the original Gemfile.
73
- @root = Pathname.new(
73
+ Pathname.new(
74
74
  File.dirname(
75
75
  Bundler.with_unbundled_env { Bundler.default_gemfile }
76
76
  )
77
77
  )
78
78
  else
79
79
  # Fallback when Bundler is not available: use current directory
80
- @root = Pathname.new(Dir.pwd)
80
+ Pathname.new(Dir.pwd)
81
81
  end
82
82
 
83
83
  @root
@@ -85,7 +85,7 @@ module Karafka
85
85
 
86
86
  # @return [Pathname] path to Karafka gem root core
87
87
  def core_root
88
- Pathname.new(File.expand_path('karafka', __dir__))
88
+ Pathname.new(File.expand_path("karafka", __dir__))
89
89
  end
90
90
 
91
91
  # @return [Boolean] true if there is a valid pro token present
@@ -102,16 +102,16 @@ module Karafka
102
102
  def rails?
103
103
  return @rails if instance_variable_defined?(:@rails)
104
104
 
105
- @rails = Object.const_defined?('Rails::Railtie')
105
+ @rails = Object.const_defined?("Rails::Railtie")
106
106
 
107
107
  # If Rails exists we set it immediately based on its presence and return
108
108
  return @rails if @rails
109
109
 
110
110
  # If rails is not present and user wants us not to force-load it, we return
111
- return @rails if ENV['KARAFKA_REQUIRE_RAILS'] == 'false'
111
+ return @rails if ENV["KARAFKA_REQUIRE_RAILS"] == "false"
112
112
 
113
113
  # If we should try to require it, we try and if no error, it means its there
114
- require('rails')
114
+ require("rails")
115
115
 
116
116
  @rails = true
117
117
  rescue LoadError
@@ -128,10 +128,10 @@ module Karafka
128
128
  # KARAFKA_BOOT_FILE='/home/app_path/app.rb'
129
129
  # Karafka.boot_file #=> '/home/app_path/app.rb'
130
130
  def boot_file
131
- boot_file = Pathname.new(ENV['KARAFKA_BOOT_FILE'] || File.join(Karafka.root, 'karafka.rb'))
131
+ boot_file = Pathname.new(ENV["KARAFKA_BOOT_FILE"] || File.join(Karafka.root, "karafka.rb"))
132
132
 
133
133
  return boot_file if boot_file.absolute?
134
- return boot_file if boot_file.to_s == 'false'
134
+ return boot_file if boot_file.to_s == "false"
135
135
 
136
136
  Pathname.new(
137
137
  File.expand_path(
@@ -158,19 +158,19 @@ end
158
158
 
159
159
  loader = Zeitwerk::Loader.for_gem
160
160
  # Do not load Rails extensions by default, this will be handled by Railtie if they are needed
161
- loader.ignore(Karafka.gem_root.join('lib/active_job'))
161
+ loader.ignore(Karafka.gem_root.join("lib/active_job"))
162
162
  # Do not load CurrentAttributes components as they will be loaded if needed
163
163
  # @note We have to exclude both the .rb file as well as the whole directory so users can require
164
164
  # current attributes only when needed
165
- loader.ignore(Karafka.gem_root.join('lib/karafka/active_job/current_attributes'))
166
- loader.ignore(Karafka.gem_root.join('lib/karafka/active_job/current_attributes.rb'))
165
+ loader.ignore(Karafka.gem_root.join("lib/karafka/active_job/current_attributes"))
166
+ loader.ignore(Karafka.gem_root.join("lib/karafka/active_job/current_attributes.rb"))
167
167
  # Do not load Railtie. It will load if after everything is ready, so we don't have to load any
168
168
  # Karafka components when we require this railtie. Railtie needs to be loaded last.
169
- loader.ignore(Karafka.gem_root.join('lib/karafka/railtie'))
169
+ loader.ignore(Karafka.gem_root.join("lib/karafka/railtie"))
170
170
  # Do not load pro components as they will be loaded if needed and allowed
171
- loader.ignore(Karafka.core_root.join('pro/'))
171
+ loader.ignore(Karafka.core_root.join("pro/"))
172
172
  # Do not load vendors instrumentation components. Those need to be required manually if needed
173
- loader.ignore(Karafka.core_root.join('instrumentation/vendors'))
173
+ loader.ignore(Karafka.core_root.join("instrumentation/vendors"))
174
174
  loader.setup
175
175
  loader.eager_load
176
176
 
@@ -182,12 +182,12 @@ Karafka::Routing::Features::Base.load_all
182
182
  # to make pro components available in case anyone wants to use them as a base to their own
183
183
  # custom components. Otherwise inheritance would not work.
184
184
  Karafka::Licenser.detect do
185
- require 'karafka/pro/loader'
185
+ require "karafka/pro/loader"
186
186
 
187
187
  Karafka::Pro::Loader.require_all
188
188
  end
189
189
 
190
190
  # Load railtie after everything else is ready so we know we can rely on it.
191
- require 'karafka/railtie'
191
+ require "karafka/railtie"
192
192
 
193
193
  Karafka::Constraints.verify!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.5
4
+ version: 2.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -35,14 +35,14 @@ dependencies:
35
35
  requirements:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
- version: 0.23.1
38
+ version: 0.24.0
39
39
  type: :runtime
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: 0.23.1
45
+ version: 0.24.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: waterdrop
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -95,6 +95,7 @@ files:
95
95
  - LICENSE-LGPL
96
96
  - README.md
97
97
  - bin/karafka
98
+ - certs/expired.txt
98
99
  - certs/karafka-pro.pem
99
100
  - config/locales/errors.yml
100
101
  - config/locales/pro_errors.yml
@@ -216,6 +217,8 @@ files:
216
217
  - lib/karafka/pro/cli/parallel_segments/base.rb
217
218
  - lib/karafka/pro/cli/parallel_segments/collapse.rb
218
219
  - lib/karafka/pro/cli/parallel_segments/distribute.rb
220
+ - lib/karafka/pro/cli/topics.rb
221
+ - lib/karafka/pro/cli/topics/health.rb
219
222
  - lib/karafka/pro/connection/manager.rb
220
223
  - lib/karafka/pro/connection/multiplexing/listener.rb
221
224
  - lib/karafka/pro/contracts/base.rb
@@ -539,6 +542,7 @@ files:
539
542
  - lib/karafka/swarm/liveness_listener.rb
540
543
  - lib/karafka/swarm/manager.rb
541
544
  - lib/karafka/swarm/node.rb
545
+ - lib/karafka/swarm/producer_replacer.rb
542
546
  - lib/karafka/swarm/supervisor.rb
543
547
  - lib/karafka/templates/application_consumer.rb.erb
544
548
  - lib/karafka/templates/example_consumer.rb.erb