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
@@ -42,12 +42,12 @@ module Karafka
42
42
  # @private
43
43
  def on_initialized
44
44
  handle_initialized
45
- rescue StandardError => e
45
+ rescue => e
46
46
  monitor.instrument(
47
- 'error.occurred',
47
+ "error.occurred",
48
48
  error: e,
49
49
  caller: self,
50
- type: 'consumer.initialized.error'
50
+ type: "consumer.initialized.error"
51
51
  )
52
52
  end
53
53
 
@@ -84,12 +84,12 @@ module Karafka
84
84
  # @param action [Symbol]
85
85
  def on_wrap(action, &)
86
86
  handle_wrap(action, &)
87
- rescue StandardError => e
87
+ rescue => e
88
88
  monitor.instrument(
89
- 'error.occurred',
89
+ "error.occurred",
90
90
  error: e,
91
91
  caller: self,
92
- type: 'consumer.wrap.error'
92
+ type: "consumer.wrap.error"
93
93
  )
94
94
  end
95
95
 
@@ -104,13 +104,13 @@ module Karafka
104
104
  # message.
105
105
  def on_consume
106
106
  handle_consume
107
- rescue StandardError => e
107
+ rescue => e
108
108
  monitor.instrument(
109
- 'error.occurred',
109
+ "error.occurred",
110
110
  error: e,
111
111
  caller: self,
112
112
  seek_offset: seek_offset,
113
- type: 'consumer.consume.error'
113
+ type: "consumer.consume.error"
114
114
  )
115
115
  end
116
116
 
@@ -124,13 +124,13 @@ module Karafka
124
124
  # flows do not interact with external systems and their errors are expected to bubble up
125
125
  def on_after_consume
126
126
  handle_after_consume
127
- rescue StandardError => e
127
+ rescue => e
128
128
  monitor.instrument(
129
- 'error.occurred',
129
+ "error.occurred",
130
130
  error: e,
131
131
  caller: self,
132
132
  seek_offset: seek_offset,
133
- type: 'consumer.after_consume.error'
133
+ type: "consumer.after_consume.error"
134
134
  )
135
135
 
136
136
  retry_after_pause
@@ -144,13 +144,13 @@ module Karafka
144
144
  # Trigger method for running on eof without messages
145
145
  def on_eofed
146
146
  handle_eofed
147
- rescue StandardError => e
147
+ rescue => e
148
148
  monitor.instrument(
149
- 'error.occurred',
149
+ "error.occurred",
150
150
  error: e,
151
151
  caller: self,
152
152
  seek_offset: seek_offset,
153
- type: 'consumer.eofed.error'
153
+ type: "consumer.eofed.error"
154
154
  )
155
155
  end
156
156
 
@@ -180,12 +180,12 @@ module Karafka
180
180
  # @private
181
181
  def on_revoked
182
182
  handle_revoked
183
- rescue StandardError => e
183
+ rescue => e
184
184
  monitor.instrument(
185
- 'error.occurred',
185
+ "error.occurred",
186
186
  error: e,
187
187
  caller: self,
188
- type: 'consumer.revoked.error'
188
+ type: "consumer.revoked.error"
189
189
  )
190
190
  end
191
191
 
@@ -201,12 +201,12 @@ module Karafka
201
201
  # @private
202
202
  def on_shutdown
203
203
  handle_shutdown
204
- rescue StandardError => e
204
+ rescue => e
205
205
  monitor.instrument(
206
- 'error.occurred',
206
+ "error.occurred",
207
207
  error: e,
208
208
  caller: self,
209
- type: 'consumer.shutdown.error'
209
+ type: "consumer.shutdown.error"
210
210
  )
211
211
  end
212
212
 
@@ -229,7 +229,7 @@ module Karafka
229
229
  "revoked=#{coordinator&.revoked?}"
230
230
  ]
231
231
 
232
- "#<#{self.class.name}:#{format('%#x', object_id)} #{parts.join(' ')}>"
232
+ "#<#{self.class.name}:#{format("%#x", object_id)} #{parts.join(" ")}>"
233
233
  end
234
234
 
235
235
  private
@@ -241,14 +241,15 @@ module Karafka
241
241
  #
242
242
  # @note Please keep in mind that it will run many times when persistence is off. Basically once
243
243
  # each batch.
244
- def initialized; end
244
+ def initialized
245
+ end
245
246
 
246
247
  # Method that will perform business logic and on data received from Kafka (it will consume
247
248
  # the data)
248
249
  # @note This method needs to be implemented in a subclass. We stub it here as a failover if
249
250
  # someone forgets about it or makes on with typo
250
251
  def consume
251
- raise NotImplementedError, 'Implement this in a subclass'
252
+ raise NotImplementedError, "Implement this in a subclass"
252
253
  end
253
254
 
254
255
  # This method can be redefined to build a wrapping API around user code + karafka flow control
@@ -287,15 +288,18 @@ module Karafka
287
288
 
288
289
  # Method that will be executed when a given topic partition reaches eof without any new
289
290
  # incoming messages alongside
290
- def eofed; end
291
+ def eofed
292
+ end
291
293
 
292
294
  # Method that will be executed when a given topic partition is revoked. You can use it for
293
295
  # some teardown procedures (closing file handler, etc).
294
- def revoked; end
296
+ def revoked
297
+ end
295
298
 
296
299
  # Method that will be executed when the process is shutting down. You can use it for
297
300
  # some teardown procedures (closing file handler, etc).
298
- def shutdown; end
301
+ def shutdown
302
+ end
299
303
 
300
304
  # @return [Boolean] was this consumer in active use. Active use means running `#consume` at
301
305
  # least once. Consumer may have to run `#revoked` or `#shutdown` despite not running
@@ -337,7 +341,7 @@ module Karafka
337
341
  coordinator.manual_pause if manual_pause
338
342
 
339
343
  monitor.instrument(
340
- 'consumer.consuming.pause',
344
+ "consumer.consuming.pause",
341
345
  caller: self,
342
346
  manual: manual_pause,
343
347
  topic: topic.name,
@@ -385,7 +389,7 @@ module Karafka
385
389
  )
386
390
 
387
391
  monitor.instrument(
388
- 'consumer.consuming.seek',
392
+ "consumer.consuming.seek",
389
393
  caller: self,
390
394
  topic: topic.name,
391
395
  partition: partition,
@@ -433,7 +437,7 @@ module Karafka
433
437
  # Instrumentation needs to run **after** `#pause` invocation because we rely on the states
434
438
  # set by `#pause`
435
439
  monitor.instrument(
436
- 'consumer.consuming.retry',
440
+ "consumer.consuming.retry",
437
441
  caller: self,
438
442
  topic: topic.name,
439
443
  partition: partition,
@@ -18,7 +18,7 @@ module Karafka
18
18
 
19
19
  # This method should implement proper cli action
20
20
  def call
21
- raise NotImplementedError, 'Implement this in a subclass'
21
+ raise NotImplementedError, "Implement this in a subclass"
22
22
  end
23
23
 
24
24
  private
@@ -29,11 +29,11 @@ module Karafka
29
29
 
30
30
  if Karafka.pro?
31
31
  Karafka.logger.info(
32
- green('Thank you for using Karafka Pro!')
32
+ green("Thank you for using Karafka Pro!")
33
33
  )
34
34
  else
35
35
  Karafka.logger.info(
36
- red('Upgrade to Karafka Pro for more features and support: https://karafka.io')
36
+ red("Upgrade to Karafka Pro for more features and support: https://karafka.io")
37
37
  )
38
38
  end
39
39
  end
@@ -41,14 +41,14 @@ module Karafka
41
41
  class << self
42
42
  # Loads proper environment with what is needed to run the CLI
43
43
  def load
44
- rails_env_rb = File.join(Dir.pwd, 'config/environment.rb')
44
+ rails_env_rb = File.join(Dir.pwd, "config/environment.rb")
45
45
  is_rails = Kernel.const_defined?(:Rails) && File.exist?(rails_env_rb)
46
46
 
47
47
  # If the boot file is disabled and this is a Rails app, we assume that user moved the
48
48
  # karafka app configuration to initializers or other Rails loading related place.
49
49
  # It is not recommended but some users tend to do this. In such cases we just try to load
50
50
  # the Rails stuff hoping that it will also load Karafka stuff
51
- if Karafka.boot_file.to_s == 'false' && is_rails
51
+ if Karafka.boot_file.to_s == "false" && is_rails
52
52
  require rails_env_rb
53
53
 
54
54
  return
@@ -104,7 +104,7 @@ module Karafka
104
104
  OptionParser.new do |opts|
105
105
  (@options || []).each do |option|
106
106
  # Creates aliases for backwards compatibility
107
- names = option[3].flat_map { |name| [name, name.tr('_', '-')] }
107
+ names = option[3].flat_map { |name| [name, name.tr("_", "-")] }
108
108
  names.map! { |name| "#{name} value1,value2,valueN" } if option[2] == Array
109
109
  names.uniq!
110
110
 
@@ -122,7 +122,7 @@ module Karafka
122
122
  ObjectSpace
123
123
  .each_object(Class)
124
124
  .select { |klass| klass.superclass == Karafka::Cli::Base }
125
- .reject { |klass| klass.to_s.end_with?('::Base') }
125
+ .reject { |klass| klass.to_s.end_with?("::Base") }
126
126
  .sort_by(&:name)
127
127
  end
128
128
 
@@ -134,7 +134,7 @@ module Karafka
134
134
  # name => 'test_me'
135
135
  def name
136
136
  to_s
137
- .split('::')
137
+ .split("::")
138
138
  .last
139
139
  .gsub(/([a-z\d])([A-Z])/, '\1_\2')
140
140
  .downcase
@@ -20,7 +20,7 @@ module Karafka
20
20
  # @return [String] Console executing command for Rails setup
21
21
  # @note In case of Rails, it has its own console, hence we can just defer to it
22
22
  def rails_console
23
- 'bundle exec rails console'
23
+ "bundle exec rails console"
24
24
  end
25
25
  end
26
26
 
@@ -8,8 +8,8 @@ module Karafka
8
8
  class Server < Karafka::Contracts::Base
9
9
  configure do |config|
10
10
  config.error_messages = YAML.safe_load_file(
11
- File.join(Karafka.gem_root, 'config', 'locales', 'errors.yml')
12
- ).fetch('en').fetch('validations').fetch('cli').fetch('server')
11
+ File.join(Karafka.gem_root, "config", "locales", "errors.yml")
12
+ ).fetch("en").fetch("validations").fetch("cli").fetch("server")
13
13
  end
14
14
 
15
15
  %i[
@@ -44,10 +44,10 @@ module Karafka
44
44
  next if value.empty?
45
45
 
46
46
  subscription_groups = Karafka::App
47
- .consumer_groups
48
- .map(&:subscription_groups)
49
- .flatten
50
- .map(&:name)
47
+ .consumer_groups
48
+ .map(&:subscription_groups)
49
+ .flatten
50
+ .map(&:name)
51
51
 
52
52
  next if (value - subscription_groups).empty?
53
53
 
@@ -65,12 +65,12 @@ module Karafka
65
65
  next if value.empty?
66
66
 
67
67
  topics = Karafka::App
68
- .consumer_groups
69
- .map(&:subscription_groups)
70
- .flatten
71
- .map(&:topics)
72
- .map { |gtopics| gtopics.map(&:name) }
73
- .flatten
68
+ .consumer_groups
69
+ .map(&:subscription_groups)
70
+ .flatten
71
+ .map(&:topics)
72
+ .map { |gtopics| gtopics.map(&:name) }
73
+ .flatten
74
74
 
75
75
  next if (value - topics).empty?
76
76
 
@@ -5,14 +5,14 @@ module Karafka
5
5
  class Cli
6
6
  # Prints info with list of commands available
7
7
  class Help < Base
8
- desc 'Describes available commands'
8
+ desc "Describes available commands"
9
9
 
10
10
  # Print available commands
11
11
  def call
12
12
  # Find the longest command for alignment purposes
13
13
  max_command_length = self.class.commands.map { |command| command.name.size }.max
14
14
 
15
- puts 'Karafka commands:'
15
+ puts "Karafka commands:"
16
16
 
17
17
  # Print each command formatted with its description
18
18
  self.class.commands.each do |command|
@@ -11,7 +11,7 @@ module Karafka
11
11
  client_id: %i[client_id]
12
12
  )
13
13
 
14
- desc 'Prints configuration details and other options of your application'
14
+ desc "Prints configuration details and other options of your application"
15
15
 
16
16
  # Nice karafka banner
17
17
  BANNER = <<~BANNER
@@ -35,7 +35,7 @@ module Karafka
35
35
 
36
36
  # @return [Array<String>] core framework related info
37
37
  def core_info
38
- postfix = Karafka.pro? ? ' + Pro' : ''
38
+ postfix = Karafka.pro? ? " + Pro" : ""
39
39
 
40
40
  [
41
41
  "Karafka version: #{Karafka::VERSION}#{postfix}",
@@ -54,12 +54,12 @@ module Karafka
54
54
  def license_info
55
55
  if Karafka.pro?
56
56
  [
57
- 'License: Commercial',
57
+ "License: Commercial",
58
58
  "License entity: #{license.entity}"
59
59
  ]
60
60
  else
61
61
  [
62
- 'License: LGPL-3.0'
62
+ "License: LGPL-3.0"
63
63
  ]
64
64
  end
65
65
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'erb'
3
+ require "erb"
4
4
 
5
5
  module Karafka
6
6
  # Karafka framework Cli
@@ -9,7 +9,7 @@ module Karafka
9
9
  class Install < Base
10
10
  include Helpers::Colorize
11
11
 
12
- desc 'Installs all required things for Karafka application in current directory'
12
+ desc "Installs all required things for Karafka application in current directory"
13
13
 
14
14
  # Directories created by default
15
15
  INSTALL_DIRS = %w[
@@ -19,9 +19,9 @@ module Karafka
19
19
 
20
20
  # Where should we map proper files from templates
21
21
  INSTALL_FILES_MAP = {
22
- 'karafka.rb.erb' => Karafka.boot_file,
23
- 'application_consumer.rb.erb' => 'app/consumers/application_consumer.rb',
24
- 'example_consumer.rb.erb' => 'app/consumers/example_consumer.rb'
22
+ "karafka.rb.erb" => Karafka.boot_file,
23
+ "application_consumer.rb.erb" => "app/consumers/application_consumer.rb",
24
+ "example_consumer.rb.erb" => "app/consumers/example_consumer.rb"
25
25
  }.freeze
26
26
 
27
27
  # Initializes the install command
@@ -34,7 +34,7 @@ module Karafka
34
34
  )
35
35
  ).dependencies
36
36
 
37
- @rails = dependencies.key?('railties') || dependencies.key?('rails')
37
+ @rails = dependencies.key?("railties") || dependencies.key?("rails")
38
38
  end
39
39
 
40
40
  # Install all required things for Karafka application in current directory
@@ -44,8 +44,8 @@ module Karafka
44
44
  end
45
45
 
46
46
  puts
47
- puts 'Installing Karafka framework...'
48
- puts 'Ruby on Rails detected...' if rails?
47
+ puts "Installing Karafka framework..."
48
+ puts "Ruby on Rails detected..." if rails?
49
49
  puts
50
50
 
51
51
  INSTALL_FILES_MAP.each do |source, target|
@@ -53,15 +53,15 @@ module Karafka
53
53
  FileUtils.mkdir_p File.dirname(pathed_target)
54
54
 
55
55
  template = File.read(Karafka.core_root.join("templates/#{source}"))
56
- render = ERB.new(template, trim_mode: '-').result(binding)
56
+ render = ERB.new(template, trim_mode: "-").result(binding)
57
57
 
58
58
  File.write(pathed_target, render)
59
59
 
60
- puts "#{green('Created')} #{target}"
60
+ puts "#{green("Created")} #{target}"
61
61
  end
62
62
 
63
63
  puts
64
- puts("Installation #{green('completed')}. Have fun!")
64
+ puts("Installation #{green("completed")}. Have fun!")
65
65
  puts
66
66
  end
67
67
 
@@ -22,7 +22,7 @@ module Karafka
22
22
  OPTIONS_BUILDER = lambda do
23
23
  option(
24
24
  :consumer_groups,
25
- 'Runs server only with specified consumer groups',
25
+ "Runs server only with specified consumer groups",
26
26
  Array,
27
27
  %w[
28
28
  -g
@@ -33,7 +33,7 @@ module Karafka
33
33
 
34
34
  option(
35
35
  :subscription_groups,
36
- 'Runs server only with specified subscription groups',
36
+ "Runs server only with specified subscription groups",
37
37
  Array,
38
38
  %w[
39
39
  --subscription_groups
@@ -43,7 +43,7 @@ module Karafka
43
43
 
44
44
  option(
45
45
  :topics,
46
- 'Runs server only with specified topics',
46
+ "Runs server only with specified topics",
47
47
  Array,
48
48
  %w[
49
49
  --topics
@@ -53,7 +53,7 @@ module Karafka
53
53
 
54
54
  option(
55
55
  :exclude_consumer_groups,
56
- 'Runs server without specified consumer groups',
56
+ "Runs server without specified consumer groups",
57
57
  Array,
58
58
  %w[
59
59
  --exclude_consumer_groups
@@ -62,7 +62,7 @@ module Karafka
62
62
 
63
63
  option(
64
64
  :exclude_subscription_groups,
65
- 'Runs server without specified subscription groups',
65
+ "Runs server without specified subscription groups",
66
66
  Array,
67
67
  %w[
68
68
  --exclude_subscription_groups
@@ -71,7 +71,7 @@ module Karafka
71
71
 
72
72
  option(
73
73
  :exclude_topics,
74
- 'Runs server without specified topics',
74
+ "Runs server without specified topics",
75
75
  Array,
76
76
  %w[
77
77
  --exclude_topics
@@ -5,7 +5,7 @@ module Karafka
5
5
  class Cli
6
6
  # Starts swarm of consumers forked from the supervisor
7
7
  class Swarm < Base
8
- desc 'Starts swarm of Karafka consumers with a supervisor'
8
+ desc "Starts swarm of Karafka consumers with a supervisor"
9
9
 
10
10
  aliases :swarm
11
11
 
@@ -17,7 +17,7 @@ module Karafka
17
17
  # @return [Boolean] true if there were any changes applied, otherwise false
18
18
  def call
19
19
  if candidate_topics.empty?
20
- puts "#{yellow('Skipping')} because no declarative topics exist."
20
+ puts "#{yellow("Skipping")} because no declarative topics exist."
21
21
 
22
22
  return false
23
23
  end
@@ -25,7 +25,7 @@ module Karafka
25
25
  resources_to_migrate = build_resources_to_migrate
26
26
 
27
27
  if resources_to_migrate.empty?
28
- puts "#{yellow('Skipping')} because there are no configurations to align."
28
+ puts "#{yellow("Skipping")} because there are no configurations to align."
29
29
 
30
30
  return false
31
31
  end
@@ -35,7 +35,7 @@ module Karafka
35
35
  Karafka::Admin::Configs.alter(resource)
36
36
  end
37
37
 
38
- puts "#{green('Updated')} topic #{resource.name} configuration."
38
+ puts "#{green("Updated")} topic #{resource.name} configuration."
39
39
  end
40
40
 
41
41
  true
@@ -54,7 +54,7 @@ module Karafka
54
54
  # First lets only operate on topics that do exist
55
55
  declaratives_routing_topics.each do |topic|
56
56
  unless existing_topics_names.include?(topic.name)
57
- puts "#{yellow('Skipping')} because topic #{topic.name} does not exist."
57
+ puts "#{yellow("Skipping")} because topic #{topic.name} does not exist."
58
58
  next
59
59
  end
60
60
 
@@ -23,7 +23,7 @@ module Karafka
23
23
 
24
24
  yield
25
25
  rescue Rdkafka::RdkafkaError => e
26
- puts "#{operation_message} #{red('failed')}:"
26
+ puts "#{operation_message} #{red("failed")}:"
27
27
  puts e
28
28
 
29
29
  raise Errors::CommandValidationError, cause: e
@@ -37,14 +37,14 @@ module Karafka
37
37
  return @declaratives_routing_topics if @declaratives_routing_topics
38
38
 
39
39
  collected_topics = {}
40
- default_servers = kafka_config[:'bootstrap.servers']
40
+ default_servers = kafka_config[:"bootstrap.servers"]
41
41
 
42
42
  App.consumer_groups.each do |consumer_group|
43
43
  consumer_group.topics.each do |topic|
44
44
  # Skip topics that were explicitly disabled from management
45
45
  next unless topic.declaratives.active?
46
46
  # If bootstrap servers are different, consider this a different cluster
47
- next unless default_servers == topic.kafka[:'bootstrap.servers']
47
+ next unless default_servers == topic.kafka[:"bootstrap.servers"]
48
48
 
49
49
  collected_topics[topic.name] ||= topic
50
50
  end
@@ -68,11 +68,11 @@ module Karafka
68
68
  # for Kafka to actually propagate new topics knowledge across the cluster. We give it that
69
69
  # bit of time just in case.
70
70
  def wait
71
- print 'Waiting for the topics to synchronize in the cluster'
71
+ print "Waiting for the topics to synchronize in the cluster"
72
72
 
73
73
  5.times do
74
74
  sleep(1)
75
- print '.'
75
+ print "."
76
76
  end
77
77
 
78
78
  puts
@@ -13,7 +13,7 @@ module Karafka
13
13
  name = topic.name
14
14
 
15
15
  if existing_topics_names.include?(name)
16
- puts "#{yellow('Skipping')} because topic #{name} already exists."
16
+ puts "#{yellow("Skipping")} because topic #{name} already exists."
17
17
  else
18
18
  supervised("Creating topic #{name}") do
19
19
  Admin.create_topic(
@@ -24,7 +24,7 @@ module Karafka
24
24
  )
25
25
  end
26
26
 
27
- puts "#{green('Created')} topic #{name}."
27
+ puts "#{green("Created")} topic #{name}."
28
28
  any_created = true
29
29
  end
30
30
  end
@@ -17,10 +17,10 @@ module Karafka
17
17
  Admin.delete_topic(name)
18
18
  end
19
19
 
20
- puts "#{green('Deleted')} topic #{name}."
20
+ puts "#{green("Deleted")} topic #{name}."
21
21
  any_deleted = true
22
22
  else
23
- puts "#{yellow('Skipping')} because topic #{name} does not exist."
23
+ puts "#{yellow("Skipping")} because topic #{name} does not exist."
24
24
  end
25
25
  end
26
26
 
@@ -7,11 +7,12 @@ module Karafka
7
7
  class Help < Base
8
8
  # Displays help information for all available topics management commands
9
9
  def call
10
- puts <<~HELP
10
+ help_text = <<~HELP
11
11
  Karafka topics commands:
12
12
  align # Aligns configuration of all declarative topics based on definitions
13
13
  create # Creates topics with appropriate settings
14
14
  delete # Deletes all topics defined in the routes
15
+ health # Checks topics health and replication settings (Pro only)
15
16
  help # Describes available topics management commands
16
17
  migrate # Creates missing topics, repartitions existing and aligns configuration
17
18
  plan # Plans migration process and prints changes to be applied
@@ -26,10 +27,13 @@ module Karafka
26
27
  karafka topics plan --detailed-exitcode
27
28
  karafka topics migrate
28
29
  karafka topics align
30
+ karafka topics health
29
31
 
30
32
  Note: All admin operations run on the default cluster only.
31
33
  HELP
32
34
 
35
+ puts help_text
36
+
33
37
  # We return false to indicate with exit code 0 that no changes were applied
34
38
  false
35
39
  end