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
|
@@ -11,7 +11,7 @@ module Karafka
|
|
|
11
11
|
def call
|
|
12
12
|
# If no changes at all, just print and stop
|
|
13
13
|
if topics_to_create.empty? && topics_to_repartition.empty? && topics_to_alter.empty?
|
|
14
|
-
puts "Karafka will #{yellow(
|
|
14
|
+
puts "Karafka will #{yellow("not")} perform any actions. No changes needed."
|
|
15
15
|
|
|
16
16
|
return false
|
|
17
17
|
end
|
|
@@ -20,15 +20,15 @@ module Karafka
|
|
|
20
20
|
|
|
21
21
|
unless topics_to_create.empty?
|
|
22
22
|
changes = true
|
|
23
|
-
puts
|
|
23
|
+
puts "Following topics will be created:"
|
|
24
24
|
puts
|
|
25
25
|
|
|
26
26
|
topics_to_create.each do |topic|
|
|
27
|
-
puts " #{green(
|
|
28
|
-
puts " #{green(
|
|
27
|
+
puts " #{green("+")} #{topic.name}:"
|
|
28
|
+
puts " #{green("+")} partitions: \"#{topic.declaratives.partitions}\""
|
|
29
29
|
|
|
30
30
|
topic.declaratives.details.each do |name, value|
|
|
31
|
-
puts " #{green(
|
|
31
|
+
puts " #{green("+")} #{name}: \"#{value}\""
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
puts
|
|
@@ -52,22 +52,22 @@ module Karafka
|
|
|
52
52
|
|
|
53
53
|
unless upscale.empty?
|
|
54
54
|
changes = true
|
|
55
|
-
puts
|
|
55
|
+
puts "Following topics will be repartitioned:"
|
|
56
56
|
puts
|
|
57
57
|
|
|
58
58
|
upscale.each do |topic, partitions|
|
|
59
59
|
from = partitions
|
|
60
60
|
to = topic.declaratives.partitions
|
|
61
|
-
y = yellow(
|
|
61
|
+
y = yellow("~")
|
|
62
62
|
puts " #{y} #{topic.name}:"
|
|
63
|
-
puts " #{y} partitions: \"#{red(from)}\" #{grey(
|
|
63
|
+
puts " #{y} partitions: \"#{red(from)}\" #{grey("=>")} \"#{green(to)}\""
|
|
64
64
|
puts
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
unless downscale.empty?
|
|
69
69
|
puts(
|
|
70
|
-
|
|
70
|
+
"Following topics repartitioning will be ignored as downscaling is not supported:"
|
|
71
71
|
)
|
|
72
72
|
puts
|
|
73
73
|
|
|
@@ -75,8 +75,8 @@ module Karafka
|
|
|
75
75
|
from = partitions
|
|
76
76
|
to = topic.declaratives.partitions
|
|
77
77
|
|
|
78
|
-
puts " #{grey(
|
|
79
|
-
puts " #{grey(
|
|
78
|
+
puts " #{grey("~")} #{topic.name}:"
|
|
79
|
+
puts " #{grey("~")} partitions: \"#{grey(from)}\" #{grey("=>")} \"#{grey(to)}\""
|
|
80
80
|
puts
|
|
81
81
|
end
|
|
82
82
|
end
|
|
@@ -84,18 +84,18 @@ module Karafka
|
|
|
84
84
|
|
|
85
85
|
unless topics_to_alter.empty?
|
|
86
86
|
changes = true
|
|
87
|
-
puts
|
|
87
|
+
puts "Following topics will have configuration changes:"
|
|
88
88
|
puts
|
|
89
89
|
|
|
90
90
|
topics_to_alter.each do |topic, configs|
|
|
91
|
-
puts " #{yellow(
|
|
91
|
+
puts " #{yellow("~")} #{topic.name}:"
|
|
92
92
|
|
|
93
93
|
configs.each do |name, changes|
|
|
94
94
|
from = changes.fetch(:from)
|
|
95
95
|
to = changes.fetch(:to)
|
|
96
96
|
action = changes.fetch(:action)
|
|
97
|
-
type = action == :change ? yellow(
|
|
98
|
-
puts " #{type} #{name}: \"#{red(from)}\" #{grey(
|
|
97
|
+
type = (action == :change) ? yellow("~") : green("+")
|
|
98
|
+
puts " #{type} #{name}: \"#{red(from)}\" #{grey("=>")} \"#{green(to)}\""
|
|
99
99
|
end
|
|
100
100
|
|
|
101
101
|
puts
|
|
@@ -174,7 +174,7 @@ module Karafka
|
|
|
174
174
|
@topics_to_alter[declarative] ||= {}
|
|
175
175
|
|
|
176
176
|
@topics_to_alter[declarative][declarative_name] ||= {
|
|
177
|
-
from:
|
|
177
|
+
from: "",
|
|
178
178
|
to: declarative_value,
|
|
179
179
|
action: :add
|
|
180
180
|
}
|
|
@@ -26,12 +26,12 @@ module Karafka
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
change = desired_count - existing_count
|
|
29
|
-
puts "#{green(
|
|
29
|
+
puts "#{green("Created")} #{change} additional partitions on topic #{name}."
|
|
30
30
|
any_repartitioned = true
|
|
31
31
|
elsif existing_count
|
|
32
|
-
puts "#{yellow(
|
|
32
|
+
puts "#{yellow("Skipping")} because topic #{name} has #{existing_count} partitions."
|
|
33
33
|
else
|
|
34
|
-
puts "#{yellow(
|
|
34
|
+
puts "#{yellow("Skipping")} because topic #{name} does not exist."
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
data/lib/karafka/cli/topics.rb
CHANGED
|
@@ -9,11 +9,11 @@ module Karafka
|
|
|
9
9
|
kafka_config: %i[kafka]
|
|
10
10
|
)
|
|
11
11
|
|
|
12
|
-
desc
|
|
12
|
+
desc "Allows for the topics management"
|
|
13
13
|
|
|
14
14
|
option(
|
|
15
15
|
:detailed_exitcode,
|
|
16
|
-
|
|
16
|
+
"Exists with 0 when no changes, 1 when error and 2 when changes present or applied",
|
|
17
17
|
TrueClass,
|
|
18
18
|
%w[
|
|
19
19
|
--detailed_exitcode
|
|
@@ -33,29 +33,29 @@ module Karafka
|
|
|
33
33
|
private_constant :NO_CHANGES_EXIT_CODE, :CHANGES_EXIT_CODE, :ERROR_EXIT_CODE
|
|
34
34
|
|
|
35
35
|
# @param action [String] action we want to take
|
|
36
|
-
def call(action =
|
|
36
|
+
def call(action = "help")
|
|
37
37
|
detailed_exit_code = options.fetch(:detailed_exitcode, false)
|
|
38
38
|
|
|
39
39
|
command = case action
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
40
|
+
when "create"
|
|
41
|
+
Topics::Create
|
|
42
|
+
when "delete"
|
|
43
|
+
Topics::Delete
|
|
44
|
+
when "reset"
|
|
45
|
+
Topics::Reset
|
|
46
|
+
when "repartition"
|
|
47
|
+
Topics::Repartition
|
|
48
|
+
when "migrate"
|
|
49
|
+
Topics::Migrate
|
|
50
|
+
when "align"
|
|
51
|
+
Topics::Align
|
|
52
|
+
when "plan"
|
|
53
|
+
Topics::Plan
|
|
54
|
+
when "help"
|
|
55
|
+
Topics::Help
|
|
56
|
+
else
|
|
57
|
+
raise Errors::UnrecognizedCommandError, "Unrecognized topics action: #{action}"
|
|
58
|
+
end
|
|
59
59
|
|
|
60
60
|
changes = command.new.call
|
|
61
61
|
|
data/lib/karafka/cli.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Karafka
|
|
|
12
12
|
# Command we want to run, like install, server, etc
|
|
13
13
|
command_name = ARGV[0]
|
|
14
14
|
# Action for action-based commands like topics migrate
|
|
15
|
-
action = ARGV[1].to_s.start_with?(
|
|
15
|
+
action = ARGV[1].to_s.start_with?("-") ? false : ARGV[1]
|
|
16
16
|
|
|
17
17
|
command = commands.find { |cmd| cmd.names.include?(command_name) }
|
|
18
18
|
|
|
@@ -51,7 +51,7 @@ end
|
|
|
51
51
|
#
|
|
52
52
|
# We skip this because this should exist and be only valid in the console
|
|
53
53
|
# :nocov:
|
|
54
|
-
if ENV[
|
|
54
|
+
if ENV["KARAFKA_CONSOLE"]
|
|
55
55
|
# Reloads Karafka irb console session
|
|
56
56
|
def reload!
|
|
57
57
|
Karafka.logger.info "Reloading...\n"
|
|
@@ -66,7 +66,7 @@ module Karafka
|
|
|
66
66
|
def initialize(subscription_group, batch_poll_breaker)
|
|
67
67
|
@id = SecureRandom.hex(6)
|
|
68
68
|
# Name is set when we build consumer
|
|
69
|
-
@name =
|
|
69
|
+
@name = ""
|
|
70
70
|
@closed = false
|
|
71
71
|
@subscription_group = subscription_group
|
|
72
72
|
@buffer = RawMessagesBuffer.new
|
|
@@ -247,7 +247,7 @@ module Karafka
|
|
|
247
247
|
return unless tpl
|
|
248
248
|
|
|
249
249
|
Karafka.monitor.instrument(
|
|
250
|
-
|
|
250
|
+
"client.pause",
|
|
251
251
|
caller: self,
|
|
252
252
|
subscription_group: @subscription_group,
|
|
253
253
|
topic: topic,
|
|
@@ -292,7 +292,7 @@ module Karafka
|
|
|
292
292
|
return unless @paused_tpls[topic].delete(partition)
|
|
293
293
|
|
|
294
294
|
Karafka.monitor.instrument(
|
|
295
|
-
|
|
295
|
+
"client.resume",
|
|
296
296
|
caller: self,
|
|
297
297
|
subscription_group: @subscription_group,
|
|
298
298
|
topic: topic,
|
|
@@ -370,7 +370,7 @@ module Karafka
|
|
|
370
370
|
# Closes and resets the client completely.
|
|
371
371
|
def reset
|
|
372
372
|
Karafka.monitor.instrument(
|
|
373
|
-
|
|
373
|
+
"client.reset",
|
|
374
374
|
caller: self,
|
|
375
375
|
subscription_group: @subscription_group
|
|
376
376
|
) do
|
|
@@ -410,7 +410,7 @@ module Karafka
|
|
|
410
410
|
# Emit event for monitoring - happens once per tick_interval (default 5s)
|
|
411
411
|
# Listeners can check assignment_lost?, track polling health, etc.
|
|
412
412
|
Karafka.monitor.instrument(
|
|
413
|
-
|
|
413
|
+
"client.events_poll",
|
|
414
414
|
caller: self,
|
|
415
415
|
subscription_group: @subscription_group
|
|
416
416
|
)
|
|
@@ -448,7 +448,7 @@ module Karafka
|
|
|
448
448
|
# @return [String] safe inspection string that is causing circular dependencies and other
|
|
449
449
|
# issues
|
|
450
450
|
def inspect
|
|
451
|
-
state = @closed ?
|
|
451
|
+
state = @closed ? "closed" : "open"
|
|
452
452
|
"#<#{self.class.name} id=#{@id.inspect} name=#{@name.inspect} state=#{state}>"
|
|
453
453
|
end
|
|
454
454
|
|
|
@@ -507,8 +507,8 @@ module Karafka
|
|
|
507
507
|
end
|
|
508
508
|
|
|
509
509
|
# Those two are librdkafka hardcoded values
|
|
510
|
-
message.offset = -1 if message.offset.to_s ==
|
|
511
|
-
message.offset = -2 if message.offset.to_s ==
|
|
510
|
+
message.offset = -1 if message.offset.to_s == "latest"
|
|
511
|
+
message.offset = -2 if message.offset.to_s == "earliest"
|
|
512
512
|
|
|
513
513
|
# Never seek if we would get the same location as we would get without seeking
|
|
514
514
|
# This prevents us from the expensive buffer purges that can lead to increased network
|
|
@@ -563,10 +563,10 @@ module Karafka
|
|
|
563
563
|
kafka.unsubscribe
|
|
564
564
|
rescue Rdkafka::RdkafkaError => e
|
|
565
565
|
Karafka.monitor.instrument(
|
|
566
|
-
|
|
566
|
+
"error.occurred",
|
|
567
567
|
caller: self,
|
|
568
568
|
error: e,
|
|
569
|
-
type:
|
|
569
|
+
type: "connection.client.unsubscribe.error"
|
|
570
570
|
)
|
|
571
571
|
end
|
|
572
572
|
|
|
@@ -575,9 +575,9 @@ module Karafka
|
|
|
575
575
|
# @return [Rdkafka::Consumer::TopicPartitionList]
|
|
576
576
|
def topic_partition_list(topic, partition)
|
|
577
577
|
rdkafka_partition = kafka
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
578
|
+
.assignment
|
|
579
|
+
.to_h[topic]
|
|
580
|
+
&.detect { |part| part.partition == partition }
|
|
581
581
|
|
|
582
582
|
return unless rdkafka_partition
|
|
583
583
|
|
|
@@ -661,7 +661,7 @@ module Karafka
|
|
|
661
661
|
# This will be raised each time poll detects a non-existing topic. When auto creation is
|
|
662
662
|
# on, we can safely ignore it
|
|
663
663
|
when :unknown_topic_or_part # 3
|
|
664
|
-
return nil if @subscription_group.kafka[:
|
|
664
|
+
return nil if @subscription_group.kafka[:"allow.auto.create.topics"]
|
|
665
665
|
|
|
666
666
|
early_report = true
|
|
667
667
|
|
|
@@ -681,10 +681,10 @@ module Karafka
|
|
|
681
681
|
|
|
682
682
|
if early_report || !retryable
|
|
683
683
|
Karafka.monitor.instrument(
|
|
684
|
-
|
|
684
|
+
"error.occurred",
|
|
685
685
|
caller: self,
|
|
686
686
|
error: e,
|
|
687
|
-
type:
|
|
687
|
+
type: "connection.client.poll.error"
|
|
688
688
|
)
|
|
689
689
|
end
|
|
690
690
|
|
|
@@ -790,7 +790,7 @@ module Karafka
|
|
|
790
790
|
# @return [Boolean] should we unsubscribe prior to shutdown
|
|
791
791
|
def unsubscribe?
|
|
792
792
|
return false if @unsubscribing
|
|
793
|
-
return false if @subscription_group.kafka.key?(:
|
|
793
|
+
return false if @subscription_group.kafka.key?(:"group.instance.id")
|
|
794
794
|
return false unless @mode.subscribe?
|
|
795
795
|
return false if assignment.empty?
|
|
796
796
|
|
|
@@ -75,7 +75,7 @@ module Karafka
|
|
|
75
75
|
# start consuming data
|
|
76
76
|
def call
|
|
77
77
|
Karafka.monitor.instrument(
|
|
78
|
-
|
|
78
|
+
"connection.listener.before_fetch_loop",
|
|
79
79
|
caller: self,
|
|
80
80
|
client: @client,
|
|
81
81
|
subscription_group: @subscription_group
|
|
@@ -84,7 +84,7 @@ module Karafka
|
|
|
84
84
|
fetch_loop
|
|
85
85
|
|
|
86
86
|
Karafka.monitor.instrument(
|
|
87
|
-
|
|
87
|
+
"connection.listener.after_fetch_loop",
|
|
88
88
|
caller: self,
|
|
89
89
|
client: @client,
|
|
90
90
|
subscription_group: @subscription_group
|
|
@@ -174,7 +174,7 @@ module Karafka
|
|
|
174
174
|
# Run the main loop as long as we are not stopping or moving into quiet mode
|
|
175
175
|
while running?
|
|
176
176
|
Karafka.monitor.instrument(
|
|
177
|
-
|
|
177
|
+
"connection.listener.fetch_loop",
|
|
178
178
|
caller: self,
|
|
179
179
|
client: @client,
|
|
180
180
|
subscription_group: @subscription_group
|
|
@@ -183,7 +183,7 @@ module Karafka
|
|
|
183
183
|
resume_paused_partitions
|
|
184
184
|
|
|
185
185
|
Karafka.monitor.instrument(
|
|
186
|
-
|
|
186
|
+
"connection.listener.fetch_loop.received",
|
|
187
187
|
caller: self,
|
|
188
188
|
client: @client,
|
|
189
189
|
subscription_group: @subscription_group,
|
|
@@ -260,10 +260,10 @@ module Karafka
|
|
|
260
260
|
rescue Exception => e
|
|
261
261
|
# rubocop:enable Lint/RescueException
|
|
262
262
|
Karafka.monitor.instrument(
|
|
263
|
-
|
|
263
|
+
"error.occurred",
|
|
264
264
|
caller: self,
|
|
265
265
|
error: e,
|
|
266
|
-
type:
|
|
266
|
+
type: "connection.listener.fetch_loop.error"
|
|
267
267
|
)
|
|
268
268
|
|
|
269
269
|
reset
|
|
@@ -59,7 +59,7 @@ module Karafka
|
|
|
59
59
|
if pending?
|
|
60
60
|
@status = :stopping
|
|
61
61
|
conductor.signal
|
|
62
|
-
monitor.instrument(
|
|
62
|
+
monitor.instrument("connection.listener.stopping", caller: self)
|
|
63
63
|
|
|
64
64
|
stopped!
|
|
65
65
|
elsif stopped?
|
|
@@ -69,7 +69,7 @@ module Karafka
|
|
|
69
69
|
else
|
|
70
70
|
@status = :stopping
|
|
71
71
|
conductor.signal
|
|
72
|
-
monitor.instrument(
|
|
72
|
+
monitor.instrument("connection.listener.stopping", caller: self)
|
|
73
73
|
end
|
|
74
74
|
end
|
|
75
75
|
|
data/lib/karafka/constraints.rb
CHANGED
|
@@ -13,15 +13,15 @@ module Karafka
|
|
|
13
13
|
# Verifies that optional requirements are met.
|
|
14
14
|
def verify!
|
|
15
15
|
# Skip verification if web is not used at all
|
|
16
|
-
return unless require_version(
|
|
16
|
+
return unless require_version("karafka/web")
|
|
17
17
|
|
|
18
18
|
# All good if version higher than 0.10.0 because we expect 0.10.0 or higher
|
|
19
|
-
return if version(Karafka::Web::VERSION) >= version(
|
|
19
|
+
return if version(Karafka::Web::VERSION) >= version("0.10.0")
|
|
20
20
|
|
|
21
21
|
# If older web-ui used, we cannot allow it
|
|
22
22
|
raise(
|
|
23
23
|
Errors::DependencyConstraintsError,
|
|
24
|
-
|
|
24
|
+
"karafka-web < 0.10.0 is not compatible with this karafka version"
|
|
25
25
|
)
|
|
26
26
|
end
|
|
27
27
|
|
data/lib/karafka/embedded.rb
CHANGED
|
@@ -25,9 +25,9 @@ module Karafka
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
Thread.new do
|
|
28
|
-
Thread.current.name =
|
|
28
|
+
Thread.current.name = "karafka.embedded"
|
|
29
29
|
|
|
30
|
-
Karafka::Process.tags.add(:execution_mode,
|
|
30
|
+
Karafka::Process.tags.add(:execution_mode, "mode:embedded")
|
|
31
31
|
Karafka::Server.execution_mode.embedded!
|
|
32
32
|
Karafka::Server.start
|
|
33
33
|
end
|
|
@@ -43,7 +43,7 @@ module Karafka
|
|
|
43
43
|
# Prevent from double stopping
|
|
44
44
|
unless @stopping
|
|
45
45
|
Thread.new do
|
|
46
|
-
Thread.current.name =
|
|
46
|
+
Thread.current.name = "karafka.embedded.stopping"
|
|
47
47
|
|
|
48
48
|
stop = false
|
|
49
49
|
|
data/lib/karafka/env.rb
CHANGED
|
@@ -11,14 +11,14 @@ module Karafka
|
|
|
11
11
|
].freeze
|
|
12
12
|
|
|
13
13
|
# Default fallback env
|
|
14
|
-
DEFAULT_ENV =
|
|
14
|
+
DEFAULT_ENV = "development"
|
|
15
15
|
|
|
16
16
|
private_constant :LOOKUP_ENV_KEYS, :DEFAULT_ENV
|
|
17
17
|
|
|
18
18
|
# @return [Karafka::Env] env object
|
|
19
19
|
# @note Will load appropriate environment automatically
|
|
20
20
|
def initialize
|
|
21
|
-
super(
|
|
21
|
+
super("")
|
|
22
22
|
|
|
23
23
|
LOOKUP_ENV_KEYS
|
|
24
24
|
.filter_map { |key| ENV.fetch(key, nil) }
|
|
@@ -31,7 +31,7 @@ module Karafka
|
|
|
31
31
|
# @param include_private [Boolean] should we include private methods as well
|
|
32
32
|
# @return [Boolean] true if we respond to a given missing method, otherwise false
|
|
33
33
|
def respond_to_missing?(method_name, include_private = false)
|
|
34
|
-
(method_name[-1] ==
|
|
34
|
+
(method_name[-1] == "?") || super
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# Reacts to missing methods, from which some might be the env checks.
|
|
@@ -39,7 +39,7 @@ module Karafka
|
|
|
39
39
|
# @param method_name [String] method name for missing or env name with question mark
|
|
40
40
|
# @param arguments [Array] any arguments that we pass to the method
|
|
41
41
|
def method_missing(method_name, *arguments)
|
|
42
|
-
method_name[-1] ==
|
|
42
|
+
(method_name[-1] == "?") ? self == method_name[0..-2] : super
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
data/lib/karafka/errors.rb
CHANGED
|
@@ -51,7 +51,9 @@ module Karafka
|
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
# Raised when
|
|
54
|
+
# Raised when the graceful shutdown timeout has been exceeded and Karafka must forcefully
|
|
55
|
+
# terminate remaining listeners and workers. This typically happens when consumer processing
|
|
56
|
+
# or shutdown jobs take longer than the configured `shutdown_timeout`.
|
|
55
57
|
ForcefulShutdownError = Class.new(BaseError)
|
|
56
58
|
|
|
57
59
|
# Raised when the jobs queue receives a job that should not be received as it would cause
|
|
@@ -71,6 +73,9 @@ module Karafka
|
|
|
71
73
|
# Raised when the license token is not valid
|
|
72
74
|
InvalidLicenseTokenError = Class.new(BaseError)
|
|
73
75
|
|
|
76
|
+
# Raised when the license token has expired or been revoked
|
|
77
|
+
ExpiredLicenseTokenError = Class.new(BaseError)
|
|
78
|
+
|
|
74
79
|
# Raised on attempt to deserializer a cleared message
|
|
75
80
|
MessageClearedError = Class.new(BaseError)
|
|
76
81
|
|
|
@@ -20,7 +20,7 @@ module Karafka
|
|
|
20
20
|
@attributes.each do |name, path|
|
|
21
21
|
model.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
22
22
|
def #{name}
|
|
23
|
-
@#{name} ||= Karafka::App.config.#{path.join(
|
|
23
|
+
@#{name} ||= Karafka::App.config.#{path.join(".")}
|
|
24
24
|
end
|
|
25
25
|
RUBY
|
|
26
26
|
end
|
|
@@ -33,7 +33,7 @@ module Karafka
|
|
|
33
33
|
@attributes.each do |name, path|
|
|
34
34
|
model.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
35
35
|
def self.#{name}
|
|
36
|
-
@#{name} ||= Karafka::App.config.#{path.join(
|
|
36
|
+
@#{name} ||= Karafka::App.config.#{path.join(".")}
|
|
37
37
|
end
|
|
38
38
|
RUBY
|
|
39
39
|
end
|
|
@@ -26,9 +26,11 @@ module Karafka
|
|
|
26
26
|
|
|
27
27
|
# Runs the requested code if it was not executed previously recently
|
|
28
28
|
def call
|
|
29
|
-
|
|
29
|
+
now = monotonic_now
|
|
30
30
|
|
|
31
|
-
@last_called_at
|
|
31
|
+
return if now - @last_called_at < @interval
|
|
32
|
+
|
|
33
|
+
@last_called_at = now
|
|
32
34
|
|
|
33
35
|
@block.call
|
|
34
36
|
end
|
|
@@ -54,15 +54,15 @@ module Karafka
|
|
|
54
54
|
# @return [String] thread-safe and lock-safe inspect implementation
|
|
55
55
|
def inspect
|
|
56
56
|
info = if @mutex.try_lock
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
57
|
+
begin
|
|
58
|
+
assignments = @assignments.dup.transform_keys(&:name).inspect
|
|
59
|
+
"assignments=#{assignments}"
|
|
60
|
+
ensure
|
|
61
|
+
@mutex.unlock
|
|
62
|
+
end
|
|
63
|
+
else
|
|
64
|
+
"busy"
|
|
65
|
+
end
|
|
66
66
|
|
|
67
67
|
"#<#{self.class.name} #{info}>"
|
|
68
68
|
end
|
|
@@ -29,20 +29,20 @@ module Karafka
|
|
|
29
29
|
return unless @client_name == client_name
|
|
30
30
|
|
|
31
31
|
monitor.instrument(
|
|
32
|
-
|
|
32
|
+
"error.occurred",
|
|
33
33
|
caller: self,
|
|
34
34
|
subscription_group_id: @subscription_group_id,
|
|
35
35
|
consumer_group_id: @consumer_group_id,
|
|
36
|
-
type:
|
|
36
|
+
type: "librdkafka.error",
|
|
37
37
|
error: error
|
|
38
38
|
)
|
|
39
|
-
rescue
|
|
39
|
+
rescue => e
|
|
40
40
|
monitor.instrument(
|
|
41
|
-
|
|
41
|
+
"error.occurred",
|
|
42
42
|
caller: self,
|
|
43
43
|
subscription_group_id: @subscription_group_id,
|
|
44
44
|
consumer_group_id: @consumer_group_id,
|
|
45
|
-
type:
|
|
45
|
+
type: "callbacks.error.error",
|
|
46
46
|
error: e
|
|
47
47
|
)
|
|
48
48
|
end
|
|
@@ -22,15 +22,15 @@ module Karafka
|
|
|
22
22
|
return unless @bearer.name == bearer_name
|
|
23
23
|
|
|
24
24
|
monitor.instrument(
|
|
25
|
-
|
|
25
|
+
"oauthbearer.token_refresh",
|
|
26
26
|
bearer: @bearer,
|
|
27
27
|
caller: self
|
|
28
28
|
)
|
|
29
|
-
rescue
|
|
29
|
+
rescue => e
|
|
30
30
|
monitor.instrument(
|
|
31
|
-
|
|
31
|
+
"error.occurred",
|
|
32
32
|
caller: self,
|
|
33
|
-
type:
|
|
33
|
+
type: "callbacks.oauthbearer_token_refresh.error",
|
|
34
34
|
error: e
|
|
35
35
|
)
|
|
36
36
|
end
|