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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/LICENSE-COMM +4 -0
- data/README.md +2 -2
- data/certs/expired.txt +2 -0
- data/karafka.gemspec +23 -23
- data/lib/active_job/karafka.rb +2 -2
- data/lib/active_job/queue_adapters/karafka_adapter.rb +5 -5
- data/lib/karafka/active_job/consumer.rb +3 -3
- data/lib/karafka/active_job/current_attributes.rb +4 -4
- data/lib/karafka/active_job/job_options_contract.rb +2 -2
- data/lib/karafka/admin/acl.rb +3 -3
- data/lib/karafka/admin/configs/resource.rb +1 -1
- data/lib/karafka/admin/configs.rb +1 -1
- data/lib/karafka/admin/consumer_groups.rb +8 -8
- data/lib/karafka/admin/contracts/replication.rb +2 -2
- data/lib/karafka/admin/replication.rb +21 -21
- data/lib/karafka/admin/topics.rb +6 -6
- data/lib/karafka/admin.rb +4 -5
- data/lib/karafka/app.rb +3 -3
- data/lib/karafka/base_consumer.rb +34 -30
- data/lib/karafka/cli/base.rb +8 -8
- data/lib/karafka/cli/console.rb +1 -1
- data/lib/karafka/cli/contracts/server.rb +12 -12
- data/lib/karafka/cli/help.rb +2 -2
- data/lib/karafka/cli/info.rb +4 -4
- data/lib/karafka/cli/install.rb +11 -11
- data/lib/karafka/cli/server.rb +6 -6
- data/lib/karafka/cli/swarm.rb +1 -1
- data/lib/karafka/cli/topics/align.rb +4 -4
- data/lib/karafka/cli/topics/base.rb +5 -5
- data/lib/karafka/cli/topics/create.rb +2 -2
- data/lib/karafka/cli/topics/delete.rb +2 -2
- data/lib/karafka/cli/topics/help.rb +5 -1
- data/lib/karafka/cli/topics/plan.rb +16 -16
- data/lib/karafka/cli/topics/repartition.rb +3 -3
- data/lib/karafka/cli/topics.rb +22 -22
- data/lib/karafka/cli.rb +2 -2
- data/lib/karafka/connection/client.rb +17 -17
- data/lib/karafka/connection/listener.rb +6 -6
- data/lib/karafka/connection/mode.rb +1 -1
- data/lib/karafka/connection/proxy.rb +1 -1
- data/lib/karafka/connection/status.rb +2 -2
- data/lib/karafka/constraints.rb +3 -3
- data/lib/karafka/embedded.rb +3 -3
- data/lib/karafka/env.rb +4 -4
- data/lib/karafka/errors.rb +6 -1
- data/lib/karafka/execution_mode.rb +1 -1
- data/lib/karafka/helpers/config_importer.rb +2 -2
- data/lib/karafka/helpers/interval_runner.rb +4 -2
- data/lib/karafka/helpers/multi_delegator.rb +1 -1
- data/lib/karafka/instrumentation/assignments_tracker.rb +9 -9
- data/lib/karafka/instrumentation/callbacks/error.rb +5 -5
- data/lib/karafka/instrumentation/callbacks/oauthbearer_token_refresh.rb +4 -4
- data/lib/karafka/instrumentation/callbacks/rebalance.rb +6 -6
- data/lib/karafka/instrumentation/callbacks/statistics.rb +5 -5
- data/lib/karafka/instrumentation/logger.rb +7 -7
- data/lib/karafka/instrumentation/logger_listener.rb +76 -63
- data/lib/karafka/instrumentation/vendors/appsignal/base.rb +1 -1
- data/lib/karafka/instrumentation/vendors/appsignal/client.rb +1 -1
- data/lib/karafka/instrumentation/vendors/appsignal/errors_listener.rb +1 -1
- data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +36 -36
- data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +33 -28
- data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +38 -38
- data/lib/karafka/instrumentation/vendors/kubernetes/base_listener.rb +5 -5
- data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +1 -1
- data/lib/karafka/instrumentation/vendors/kubernetes/swarm_liveness_listener.rb +1 -1
- data/lib/karafka/licenser.rb +115 -8
- data/lib/karafka/messages/builders/batch_metadata.rb +4 -2
- data/lib/karafka/messages/messages.rb +1 -1
- data/lib/karafka/patches/rdkafka/bindings.rb +2 -2
- data/lib/karafka/pro/active_job/job_options_contract.rb +2 -2
- data/lib/karafka/pro/cleaner/messages/messages.rb +10 -0
- data/lib/karafka/pro/cli/contracts/server.rb +12 -12
- data/lib/karafka/pro/cli/parallel_segments/base.rb +4 -4
- data/lib/karafka/pro/cli/parallel_segments/collapse.rb +5 -5
- data/lib/karafka/pro/cli/parallel_segments/distribute.rb +3 -3
- data/lib/karafka/pro/cli/parallel_segments.rb +7 -7
- data/lib/karafka/pro/cli/topics/health.rb +162 -0
- data/lib/karafka/pro/cli/topics.rb +52 -0
- data/lib/karafka/pro/connection/manager.rb +14 -14
- data/lib/karafka/pro/encryption/contracts/config.rb +2 -2
- data/lib/karafka/pro/encryption/messages/middleware.rb +2 -2
- data/lib/karafka/pro/encryption/messages/parser.rb +2 -2
- data/lib/karafka/pro/encryption/setup/config.rb +2 -2
- data/lib/karafka/pro/iterator/tpl_builder.rb +2 -2
- data/lib/karafka/pro/iterator.rb +1 -1
- data/lib/karafka/pro/loader.rb +2 -1
- data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +1 -1
- data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +24 -14
- data/lib/karafka/pro/processing/filters/base.rb +1 -1
- data/lib/karafka/pro/processing/filters/delayer.rb +2 -2
- data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +1 -1
- data/lib/karafka/pro/processing/offset_metadata/consumer.rb +1 -1
- data/lib/karafka/pro/processing/parallel_segments/filters/base.rb +6 -6
- data/lib/karafka/pro/processing/partitioner.rb +3 -3
- data/lib/karafka/pro/processing/periodic_job/consumer.rb +6 -5
- data/lib/karafka/pro/processing/piping/consumer.rb +7 -7
- data/lib/karafka/pro/processing/schedulers/base.rb +5 -5
- data/lib/karafka/pro/processing/schedulers/default.rb +5 -5
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +6 -3
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +6 -3
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +6 -3
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +2 -2
- data/lib/karafka/pro/processing/strategies/default.rb +22 -22
- data/lib/karafka/pro/processing/strategies/dlq/default.rb +7 -7
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +6 -3
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +6 -3
- data/lib/karafka/pro/processing/strategies/ftr/default.rb +2 -2
- data/lib/karafka/pro/processing/strategies/lrj/default.rb +2 -2
- data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +6 -3
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +6 -3
- data/lib/karafka/pro/processing/strategies/lrj/mom.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/consumer.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/contracts/config.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/contracts/task.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/dispatcher.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/listener.rb +1 -1
- data/lib/karafka/pro/recurring_tasks/matcher.rb +2 -2
- data/lib/karafka/pro/recurring_tasks/serializer.rb +5 -5
- data/lib/karafka/pro/recurring_tasks/setup/config.rb +3 -3
- data/lib/karafka/pro/recurring_tasks/task.rb +4 -4
- data/lib/karafka/pro/recurring_tasks.rb +4 -4
- data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/delaying/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/direct_assignments/contracts/consumer_group.rb +2 -2
- data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/expiring/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/filtering/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/inline_insights/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/long_running_job/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/multiplexing.rb +5 -5
- data/lib/karafka/pro/routing/features/non_blocking_job/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/offset_metadata.rb +1 -1
- data/lib/karafka/pro/routing/features/parallel_segments/consumer_group.rb +5 -5
- data/lib/karafka/pro/routing/features/parallel_segments/contracts/consumer_group.rb +2 -2
- data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +2 -2
- data/lib/karafka/pro/routing/features/patterns/contracts/pattern.rb +3 -3
- data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/patterns/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/pausing/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/periodic_job/topic.rb +1 -1
- data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +7 -7
- data/lib/karafka/pro/routing/features/recurring_tasks/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +13 -13
- data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +2 -2
- data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/swarm.rb +1 -1
- data/lib/karafka/pro/routing/features/throttling/contracts/topic.rb +2 -2
- data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +7 -7
- data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +2 -2
- data/lib/karafka/pro/scheduled_messages/consumer.rb +4 -4
- data/lib/karafka/pro/scheduled_messages/contracts/config.rb +2 -2
- data/lib/karafka/pro/scheduled_messages/contracts/message.rb +10 -10
- data/lib/karafka/pro/scheduled_messages/daily_buffer.rb +2 -2
- data/lib/karafka/pro/scheduled_messages/deserializers/headers.rb +4 -4
- data/lib/karafka/pro/scheduled_messages/dispatcher.rb +5 -5
- data/lib/karafka/pro/scheduled_messages/proxy.rb +8 -8
- data/lib/karafka/pro/scheduled_messages/schema_validator.rb +1 -1
- data/lib/karafka/pro/scheduled_messages/setup/config.rb +2 -2
- data/lib/karafka/pro/scheduled_messages/state.rb +1 -1
- data/lib/karafka/pro/scheduled_messages/tracker.rb +2 -2
- data/lib/karafka/pro/scheduled_messages.rb +2 -2
- data/lib/karafka/pro/swarm/liveness_listener.rb +2 -2
- data/lib/karafka/process.rb +1 -1
- data/lib/karafka/processing/coordinator.rb +1 -1
- data/lib/karafka/processing/inline_insights/consumer.rb +4 -4
- data/lib/karafka/processing/inline_insights/tracker.rb +6 -6
- data/lib/karafka/processing/jobs/base.rb +6 -4
- data/lib/karafka/processing/jobs_queue.rb +10 -0
- data/lib/karafka/processing/schedulers/default.rb +4 -4
- data/lib/karafka/processing/strategies/base.rb +6 -6
- data/lib/karafka/processing/strategies/default.rb +13 -13
- data/lib/karafka/processing/strategies/dlq.rb +1 -1
- data/lib/karafka/processing/worker.rb +5 -5
- data/lib/karafka/railtie.rb +11 -11
- data/lib/karafka/routing/builder.rb +3 -3
- data/lib/karafka/routing/contracts/consumer_group.rb +6 -6
- data/lib/karafka/routing/contracts/routing.rb +2 -2
- data/lib/karafka/routing/contracts/topic.rb +4 -4
- data/lib/karafka/routing/features/active_job/contracts/topic.rb +3 -3
- data/lib/karafka/routing/features/base/expander.rb +4 -4
- data/lib/karafka/routing/features/base.rb +8 -8
- data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
- data/lib/karafka/routing/features/declaratives/contracts/topic.rb +2 -2
- data/lib/karafka/routing/features/deserializers/contracts/topic.rb +2 -2
- data/lib/karafka/routing/features/eofed/contracts/topic.rb +3 -3
- data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +2 -2
- data/lib/karafka/routing/features/inline_insights.rb +7 -7
- data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +2 -2
- data/lib/karafka/routing/subscription_group.rb +9 -9
- data/lib/karafka/runner.rb +3 -3
- data/lib/karafka/server.rb +14 -5
- data/lib/karafka/setup/attributes_map.rb +7 -7
- data/lib/karafka/setup/config.rb +11 -11
- data/lib/karafka/setup/contracts/config.rb +2 -2
- data/lib/karafka/setup/defaults_injector.rb +11 -11
- data/lib/karafka/swarm/manager.rb +6 -6
- data/lib/karafka/swarm/node.rb +8 -37
- data/lib/karafka/swarm/producer_replacer.rb +110 -0
- data/lib/karafka/swarm/supervisor.rb +9 -6
- data/lib/karafka/swarm.rb +1 -1
- data/lib/karafka/time_trackers/pause.rb +1 -1
- data/lib/karafka/version.rb +1 -1
- data/lib/karafka.rb +36 -36
- metadata +7 -3
|
@@ -42,12 +42,12 @@ module Karafka
|
|
|
42
42
|
# @private
|
|
43
43
|
def on_initialized
|
|
44
44
|
handle_initialized
|
|
45
|
-
rescue
|
|
45
|
+
rescue => e
|
|
46
46
|
monitor.instrument(
|
|
47
|
-
|
|
47
|
+
"error.occurred",
|
|
48
48
|
error: e,
|
|
49
49
|
caller: self,
|
|
50
|
-
type:
|
|
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
|
|
87
|
+
rescue => e
|
|
88
88
|
monitor.instrument(
|
|
89
|
-
|
|
89
|
+
"error.occurred",
|
|
90
90
|
error: e,
|
|
91
91
|
caller: self,
|
|
92
|
-
type:
|
|
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
|
|
107
|
+
rescue => e
|
|
108
108
|
monitor.instrument(
|
|
109
|
-
|
|
109
|
+
"error.occurred",
|
|
110
110
|
error: e,
|
|
111
111
|
caller: self,
|
|
112
112
|
seek_offset: seek_offset,
|
|
113
|
-
type:
|
|
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
|
|
127
|
+
rescue => e
|
|
128
128
|
monitor.instrument(
|
|
129
|
-
|
|
129
|
+
"error.occurred",
|
|
130
130
|
error: e,
|
|
131
131
|
caller: self,
|
|
132
132
|
seek_offset: seek_offset,
|
|
133
|
-
type:
|
|
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
|
|
147
|
+
rescue => e
|
|
148
148
|
monitor.instrument(
|
|
149
|
-
|
|
149
|
+
"error.occurred",
|
|
150
150
|
error: e,
|
|
151
151
|
caller: self,
|
|
152
152
|
seek_offset: seek_offset,
|
|
153
|
-
type:
|
|
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
|
|
183
|
+
rescue => e
|
|
184
184
|
monitor.instrument(
|
|
185
|
-
|
|
185
|
+
"error.occurred",
|
|
186
186
|
error: e,
|
|
187
187
|
caller: self,
|
|
188
|
-
type:
|
|
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
|
|
204
|
+
rescue => e
|
|
205
205
|
monitor.instrument(
|
|
206
|
-
|
|
206
|
+
"error.occurred",
|
|
207
207
|
error: e,
|
|
208
208
|
caller: self,
|
|
209
|
-
type:
|
|
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(
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
440
|
+
"consumer.consuming.retry",
|
|
437
441
|
caller: self,
|
|
438
442
|
topic: topic.name,
|
|
439
443
|
partition: partition,
|
data/lib/karafka/cli/base.rb
CHANGED
|
@@ -18,7 +18,7 @@ module Karafka
|
|
|
18
18
|
|
|
19
19
|
# This method should implement proper cli action
|
|
20
20
|
def call
|
|
21
|
-
raise NotImplementedError,
|
|
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(
|
|
32
|
+
green("Thank you for using Karafka Pro!")
|
|
33
33
|
)
|
|
34
34
|
else
|
|
35
35
|
Karafka.logger.info(
|
|
36
|
-
red(
|
|
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,
|
|
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 ==
|
|
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?(
|
|
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
|
data/lib/karafka/cli/console.rb
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
12
|
-
).fetch(
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
data/lib/karafka/cli/help.rb
CHANGED
|
@@ -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
|
|
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
|
|
15
|
+
puts "Karafka commands:"
|
|
16
16
|
|
|
17
17
|
# Print each command formatted with its description
|
|
18
18
|
self.class.commands.each do |command|
|
data/lib/karafka/cli/info.rb
CHANGED
|
@@ -11,7 +11,7 @@ module Karafka
|
|
|
11
11
|
client_id: %i[client_id]
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
desc
|
|
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? ?
|
|
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
|
-
|
|
57
|
+
"License: Commercial",
|
|
58
58
|
"License entity: #{license.entity}"
|
|
59
59
|
]
|
|
60
60
|
else
|
|
61
61
|
[
|
|
62
|
-
|
|
62
|
+
"License: LGPL-3.0"
|
|
63
63
|
]
|
|
64
64
|
end
|
|
65
65
|
end
|
data/lib/karafka/cli/install.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
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
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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?(
|
|
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
|
|
48
|
-
puts
|
|
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:
|
|
56
|
+
render = ERB.new(template, trim_mode: "-").result(binding)
|
|
57
57
|
|
|
58
58
|
File.write(pathed_target, render)
|
|
59
59
|
|
|
60
|
-
puts "#{green(
|
|
60
|
+
puts "#{green("Created")} #{target}"
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
puts
|
|
64
|
-
puts("Installation #{green(
|
|
64
|
+
puts("Installation #{green("completed")}. Have fun!")
|
|
65
65
|
puts
|
|
66
66
|
end
|
|
67
67
|
|
data/lib/karafka/cli/server.rb
CHANGED
|
@@ -22,7 +22,7 @@ module Karafka
|
|
|
22
22
|
OPTIONS_BUILDER = lambda do
|
|
23
23
|
option(
|
|
24
24
|
:consumer_groups,
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
+
"Runs server without specified topics",
|
|
75
75
|
Array,
|
|
76
76
|
%w[
|
|
77
77
|
--exclude_topics
|
data/lib/karafka/cli/swarm.rb
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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[:
|
|
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[:
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
20
|
+
puts "#{green("Deleted")} topic #{name}."
|
|
21
21
|
any_deleted = true
|
|
22
22
|
else
|
|
23
|
-
puts "#{yellow(
|
|
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
|
-
|
|
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
|