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
data/lib/karafka/swarm/node.rb
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
74
|
+
monitor.instrument("swarm.node.after_fork", caller: self)
|
|
104
75
|
|
|
105
|
-
Karafka::Process.tags.add(:execution_mode,
|
|
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(
|
|
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 =
|
|
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(
|
|
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(
|
|
172
|
+
signal("TSTP")
|
|
202
173
|
end
|
|
203
174
|
|
|
204
175
|
# Terminates node
|
|
205
176
|
# @note Parent API
|
|
206
177
|
def terminate
|
|
207
|
-
signal(
|
|
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(
|
|
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
|
|
90
|
+
rescue => e
|
|
91
91
|
monitor.instrument(
|
|
92
|
-
|
|
92
|
+
"error.occurred",
|
|
93
93
|
caller: self,
|
|
94
94
|
error: e,
|
|
95
95
|
manager: manager,
|
|
96
|
-
type:
|
|
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
|
-
|
|
151
|
+
"error.occurred",
|
|
152
152
|
caller: self,
|
|
153
153
|
error: e,
|
|
154
154
|
manager: manager,
|
|
155
|
-
|
|
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
data/lib/karafka/version.rb
CHANGED
data/lib/karafka.rb
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
14
|
-
require
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
-
require
|
|
18
|
-
require
|
|
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(
|
|
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[
|
|
62
|
-
@root = Pathname.new(ENV[
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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?(
|
|
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[
|
|
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(
|
|
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[
|
|
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 ==
|
|
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(
|
|
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(
|
|
166
|
-
loader.ignore(Karafka.gem_root.join(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|