karafka 2.5.5 → 2.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/LICENSE-COMM +4 -0
  4. data/README.md +2 -2
  5. data/certs/expired.txt +2 -0
  6. data/karafka.gemspec +23 -23
  7. data/lib/active_job/karafka.rb +2 -2
  8. data/lib/active_job/queue_adapters/karafka_adapter.rb +5 -5
  9. data/lib/karafka/active_job/consumer.rb +3 -3
  10. data/lib/karafka/active_job/current_attributes.rb +4 -4
  11. data/lib/karafka/active_job/job_options_contract.rb +2 -2
  12. data/lib/karafka/admin/acl.rb +3 -3
  13. data/lib/karafka/admin/configs/resource.rb +1 -1
  14. data/lib/karafka/admin/configs.rb +1 -1
  15. data/lib/karafka/admin/consumer_groups.rb +8 -8
  16. data/lib/karafka/admin/contracts/replication.rb +2 -2
  17. data/lib/karafka/admin/replication.rb +21 -21
  18. data/lib/karafka/admin/topics.rb +6 -6
  19. data/lib/karafka/admin.rb +4 -5
  20. data/lib/karafka/app.rb +3 -3
  21. data/lib/karafka/base_consumer.rb +34 -30
  22. data/lib/karafka/cli/base.rb +8 -8
  23. data/lib/karafka/cli/console.rb +1 -1
  24. data/lib/karafka/cli/contracts/server.rb +12 -12
  25. data/lib/karafka/cli/help.rb +2 -2
  26. data/lib/karafka/cli/info.rb +4 -4
  27. data/lib/karafka/cli/install.rb +11 -11
  28. data/lib/karafka/cli/server.rb +6 -6
  29. data/lib/karafka/cli/swarm.rb +1 -1
  30. data/lib/karafka/cli/topics/align.rb +4 -4
  31. data/lib/karafka/cli/topics/base.rb +5 -5
  32. data/lib/karafka/cli/topics/create.rb +2 -2
  33. data/lib/karafka/cli/topics/delete.rb +2 -2
  34. data/lib/karafka/cli/topics/help.rb +5 -1
  35. data/lib/karafka/cli/topics/plan.rb +16 -16
  36. data/lib/karafka/cli/topics/repartition.rb +3 -3
  37. data/lib/karafka/cli/topics.rb +22 -22
  38. data/lib/karafka/cli.rb +2 -2
  39. data/lib/karafka/connection/client.rb +17 -17
  40. data/lib/karafka/connection/listener.rb +6 -6
  41. data/lib/karafka/connection/mode.rb +1 -1
  42. data/lib/karafka/connection/proxy.rb +1 -1
  43. data/lib/karafka/connection/status.rb +2 -2
  44. data/lib/karafka/constraints.rb +3 -3
  45. data/lib/karafka/embedded.rb +3 -3
  46. data/lib/karafka/env.rb +4 -4
  47. data/lib/karafka/errors.rb +6 -1
  48. data/lib/karafka/execution_mode.rb +1 -1
  49. data/lib/karafka/helpers/config_importer.rb +2 -2
  50. data/lib/karafka/helpers/interval_runner.rb +4 -2
  51. data/lib/karafka/helpers/multi_delegator.rb +1 -1
  52. data/lib/karafka/instrumentation/assignments_tracker.rb +9 -9
  53. data/lib/karafka/instrumentation/callbacks/error.rb +5 -5
  54. data/lib/karafka/instrumentation/callbacks/oauthbearer_token_refresh.rb +4 -4
  55. data/lib/karafka/instrumentation/callbacks/rebalance.rb +6 -6
  56. data/lib/karafka/instrumentation/callbacks/statistics.rb +5 -5
  57. data/lib/karafka/instrumentation/logger.rb +7 -7
  58. data/lib/karafka/instrumentation/logger_listener.rb +76 -63
  59. data/lib/karafka/instrumentation/vendors/appsignal/base.rb +1 -1
  60. data/lib/karafka/instrumentation/vendors/appsignal/client.rb +1 -1
  61. data/lib/karafka/instrumentation/vendors/appsignal/errors_listener.rb +1 -1
  62. data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +36 -36
  63. data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +33 -28
  64. data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +38 -38
  65. data/lib/karafka/instrumentation/vendors/kubernetes/base_listener.rb +5 -5
  66. data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +1 -1
  67. data/lib/karafka/instrumentation/vendors/kubernetes/swarm_liveness_listener.rb +1 -1
  68. data/lib/karafka/licenser.rb +115 -8
  69. data/lib/karafka/messages/builders/batch_metadata.rb +4 -2
  70. data/lib/karafka/messages/messages.rb +1 -1
  71. data/lib/karafka/patches/rdkafka/bindings.rb +2 -2
  72. data/lib/karafka/pro/active_job/job_options_contract.rb +2 -2
  73. data/lib/karafka/pro/cleaner/messages/messages.rb +10 -0
  74. data/lib/karafka/pro/cli/contracts/server.rb +12 -12
  75. data/lib/karafka/pro/cli/parallel_segments/base.rb +4 -4
  76. data/lib/karafka/pro/cli/parallel_segments/collapse.rb +5 -5
  77. data/lib/karafka/pro/cli/parallel_segments/distribute.rb +3 -3
  78. data/lib/karafka/pro/cli/parallel_segments.rb +7 -7
  79. data/lib/karafka/pro/cli/topics/health.rb +162 -0
  80. data/lib/karafka/pro/cli/topics.rb +52 -0
  81. data/lib/karafka/pro/connection/manager.rb +14 -14
  82. data/lib/karafka/pro/encryption/contracts/config.rb +2 -2
  83. data/lib/karafka/pro/encryption/messages/middleware.rb +2 -2
  84. data/lib/karafka/pro/encryption/messages/parser.rb +2 -2
  85. data/lib/karafka/pro/encryption/setup/config.rb +2 -2
  86. data/lib/karafka/pro/iterator/tpl_builder.rb +2 -2
  87. data/lib/karafka/pro/iterator.rb +1 -1
  88. data/lib/karafka/pro/loader.rb +2 -1
  89. data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +1 -1
  90. data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +24 -14
  91. data/lib/karafka/pro/processing/filters/base.rb +1 -1
  92. data/lib/karafka/pro/processing/filters/delayer.rb +2 -2
  93. data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +1 -1
  94. data/lib/karafka/pro/processing/offset_metadata/consumer.rb +1 -1
  95. data/lib/karafka/pro/processing/parallel_segments/filters/base.rb +6 -6
  96. data/lib/karafka/pro/processing/partitioner.rb +3 -3
  97. data/lib/karafka/pro/processing/periodic_job/consumer.rb +6 -5
  98. data/lib/karafka/pro/processing/piping/consumer.rb +7 -7
  99. data/lib/karafka/pro/processing/schedulers/base.rb +5 -5
  100. data/lib/karafka/pro/processing/schedulers/default.rb +5 -5
  101. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +6 -3
  102. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +6 -3
  103. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +6 -3
  104. data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +2 -2
  105. data/lib/karafka/pro/processing/strategies/default.rb +22 -22
  106. data/lib/karafka/pro/processing/strategies/dlq/default.rb +7 -7
  107. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +6 -3
  108. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +6 -3
  109. data/lib/karafka/pro/processing/strategies/ftr/default.rb +2 -2
  110. data/lib/karafka/pro/processing/strategies/lrj/default.rb +2 -2
  111. data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +6 -3
  112. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +6 -3
  113. data/lib/karafka/pro/processing/strategies/lrj/mom.rb +2 -2
  114. data/lib/karafka/pro/recurring_tasks/consumer.rb +2 -2
  115. data/lib/karafka/pro/recurring_tasks/contracts/config.rb +2 -2
  116. data/lib/karafka/pro/recurring_tasks/contracts/task.rb +2 -2
  117. data/lib/karafka/pro/recurring_tasks/dispatcher.rb +2 -2
  118. data/lib/karafka/pro/recurring_tasks/listener.rb +1 -1
  119. data/lib/karafka/pro/recurring_tasks/matcher.rb +2 -2
  120. data/lib/karafka/pro/recurring_tasks/serializer.rb +5 -5
  121. data/lib/karafka/pro/recurring_tasks/setup/config.rb +3 -3
  122. data/lib/karafka/pro/recurring_tasks/task.rb +4 -4
  123. data/lib/karafka/pro/recurring_tasks.rb +4 -4
  124. data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +2 -2
  125. data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
  126. data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +1 -1
  127. data/lib/karafka/pro/routing/features/delaying/contracts/topic.rb +2 -2
  128. data/lib/karafka/pro/routing/features/direct_assignments/contracts/consumer_group.rb +2 -2
  129. data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +2 -2
  130. data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +1 -1
  131. data/lib/karafka/pro/routing/features/expiring/contracts/topic.rb +2 -2
  132. data/lib/karafka/pro/routing/features/filtering/contracts/topic.rb +2 -2
  133. data/lib/karafka/pro/routing/features/inline_insights/contracts/topic.rb +2 -2
  134. data/lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb +2 -2
  135. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +1 -1
  136. data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +2 -2
  137. data/lib/karafka/pro/routing/features/multiplexing.rb +5 -5
  138. data/lib/karafka/pro/routing/features/non_blocking_job/topic.rb +1 -1
  139. data/lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb +2 -2
  140. data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +1 -1
  141. data/lib/karafka/pro/routing/features/offset_metadata.rb +1 -1
  142. data/lib/karafka/pro/routing/features/parallel_segments/consumer_group.rb +5 -5
  143. data/lib/karafka/pro/routing/features/parallel_segments/contracts/consumer_group.rb +2 -2
  144. data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +2 -2
  145. data/lib/karafka/pro/routing/features/patterns/contracts/pattern.rb +3 -3
  146. data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +2 -2
  147. data/lib/karafka/pro/routing/features/patterns/topic.rb +1 -1
  148. data/lib/karafka/pro/routing/features/pausing/contracts/topic.rb +2 -2
  149. data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +2 -2
  150. data/lib/karafka/pro/routing/features/periodic_job/topic.rb +1 -1
  151. data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +7 -7
  152. data/lib/karafka/pro/routing/features/recurring_tasks/contracts/topic.rb +2 -2
  153. data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +13 -13
  154. data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +2 -2
  155. data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +2 -2
  156. data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +2 -2
  157. data/lib/karafka/pro/routing/features/swarm.rb +1 -1
  158. data/lib/karafka/pro/routing/features/throttling/contracts/topic.rb +2 -2
  159. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +7 -7
  160. data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +2 -2
  161. data/lib/karafka/pro/scheduled_messages/consumer.rb +4 -4
  162. data/lib/karafka/pro/scheduled_messages/contracts/config.rb +2 -2
  163. data/lib/karafka/pro/scheduled_messages/contracts/message.rb +10 -10
  164. data/lib/karafka/pro/scheduled_messages/daily_buffer.rb +2 -2
  165. data/lib/karafka/pro/scheduled_messages/deserializers/headers.rb +4 -4
  166. data/lib/karafka/pro/scheduled_messages/dispatcher.rb +5 -5
  167. data/lib/karafka/pro/scheduled_messages/proxy.rb +8 -8
  168. data/lib/karafka/pro/scheduled_messages/schema_validator.rb +1 -1
  169. data/lib/karafka/pro/scheduled_messages/setup/config.rb +2 -2
  170. data/lib/karafka/pro/scheduled_messages/state.rb +1 -1
  171. data/lib/karafka/pro/scheduled_messages/tracker.rb +2 -2
  172. data/lib/karafka/pro/scheduled_messages.rb +2 -2
  173. data/lib/karafka/pro/swarm/liveness_listener.rb +2 -2
  174. data/lib/karafka/process.rb +1 -1
  175. data/lib/karafka/processing/coordinator.rb +1 -1
  176. data/lib/karafka/processing/inline_insights/consumer.rb +4 -4
  177. data/lib/karafka/processing/inline_insights/tracker.rb +6 -6
  178. data/lib/karafka/processing/jobs/base.rb +6 -4
  179. data/lib/karafka/processing/jobs_queue.rb +10 -0
  180. data/lib/karafka/processing/schedulers/default.rb +4 -4
  181. data/lib/karafka/processing/strategies/base.rb +6 -6
  182. data/lib/karafka/processing/strategies/default.rb +13 -13
  183. data/lib/karafka/processing/strategies/dlq.rb +1 -1
  184. data/lib/karafka/processing/worker.rb +5 -5
  185. data/lib/karafka/railtie.rb +11 -11
  186. data/lib/karafka/routing/builder.rb +3 -3
  187. data/lib/karafka/routing/contracts/consumer_group.rb +6 -6
  188. data/lib/karafka/routing/contracts/routing.rb +2 -2
  189. data/lib/karafka/routing/contracts/topic.rb +4 -4
  190. data/lib/karafka/routing/features/active_job/contracts/topic.rb +3 -3
  191. data/lib/karafka/routing/features/base/expander.rb +4 -4
  192. data/lib/karafka/routing/features/base.rb +8 -8
  193. data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +2 -2
  194. data/lib/karafka/routing/features/declaratives/contracts/topic.rb +2 -2
  195. data/lib/karafka/routing/features/deserializers/contracts/topic.rb +2 -2
  196. data/lib/karafka/routing/features/eofed/contracts/topic.rb +3 -3
  197. data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +2 -2
  198. data/lib/karafka/routing/features/inline_insights.rb +7 -7
  199. data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +2 -2
  200. data/lib/karafka/routing/subscription_group.rb +9 -9
  201. data/lib/karafka/runner.rb +3 -3
  202. data/lib/karafka/server.rb +14 -5
  203. data/lib/karafka/setup/attributes_map.rb +7 -7
  204. data/lib/karafka/setup/config.rb +11 -11
  205. data/lib/karafka/setup/contracts/config.rb +2 -2
  206. data/lib/karafka/setup/defaults_injector.rb +11 -11
  207. data/lib/karafka/swarm/manager.rb +6 -6
  208. data/lib/karafka/swarm/node.rb +8 -37
  209. data/lib/karafka/swarm/producer_replacer.rb +110 -0
  210. data/lib/karafka/swarm/supervisor.rb +9 -6
  211. data/lib/karafka/swarm.rb +1 -1
  212. data/lib/karafka/time_trackers/pause.rb +1 -1
  213. data/lib/karafka/version.rb +1 -1
  214. data/lib/karafka.rb +36 -36
  215. metadata +7 -3
@@ -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('not')} perform any actions. No changes needed."
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 'Following topics will be created:'
23
+ puts "Following topics will be created:"
24
24
  puts
25
25
 
26
26
  topics_to_create.each do |topic|
27
- puts " #{green('+')} #{topic.name}:"
28
- puts " #{green('+')} partitions: \"#{topic.declaratives.partitions}\""
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('+')} #{name}: \"#{value}\""
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 'Following topics will be repartitioned:'
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('=>')} \"#{green(to)}\""
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
- 'Following topics repartitioning will be ignored as downscaling is not supported:'
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('~')} #{topic.name}:"
79
- puts " #{grey('~')} partitions: \"#{grey(from)}\" #{grey('=>')} \"#{grey(to)}\""
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 'Following topics will have configuration changes:'
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('~')} #{topic.name}:"
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('~') : green('+')
98
- puts " #{type} #{name}: \"#{red(from)}\" #{grey('=>')} \"#{green(to)}\""
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('Created')} #{change} additional partitions on topic #{name}."
29
+ puts "#{green("Created")} #{change} additional partitions on topic #{name}."
30
30
  any_repartitioned = true
31
31
  elsif existing_count
32
- puts "#{yellow('Skipping')} because topic #{name} has #{existing_count} partitions."
32
+ puts "#{yellow("Skipping")} because topic #{name} has #{existing_count} partitions."
33
33
  else
34
- puts "#{yellow('Skipping')} because topic #{name} does not exist."
34
+ puts "#{yellow("Skipping")} because topic #{name} does not exist."
35
35
  end
36
36
  end
37
37
 
@@ -9,11 +9,11 @@ module Karafka
9
9
  kafka_config: %i[kafka]
10
10
  )
11
11
 
12
- desc 'Allows for the topics management'
12
+ desc "Allows for the topics management"
13
13
 
14
14
  option(
15
15
  :detailed_exitcode,
16
- 'Exists with 0 when no changes, 1 when error and 2 when changes present or applied',
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 = 'help')
36
+ def call(action = "help")
37
37
  detailed_exit_code = options.fetch(:detailed_exitcode, false)
38
38
 
39
39
  command = case action
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
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?('-') ? false : ARGV[1]
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['KARAFKA_CONSOLE']
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
- 'client.pause',
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
- 'client.resume',
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
- 'client.reset',
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
- 'client.events_poll',
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 ? 'closed' : 'open'
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 == 'latest'
511
- message.offset = -2 if message.offset.to_s == 'earliest'
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
- 'error.occurred',
566
+ "error.occurred",
567
567
  caller: self,
568
568
  error: e,
569
- type: 'connection.client.unsubscribe.error'
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
- .assignment
579
- .to_h[topic]
580
- &.detect { |part| part.partition == partition }
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[:'allow.auto.create.topics']
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
- 'error.occurred',
684
+ "error.occurred",
685
685
  caller: self,
686
686
  error: e,
687
- type: 'connection.client.poll.error'
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?(:'group.instance.id')
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
- 'connection.listener.before_fetch_loop',
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
- 'connection.listener.after_fetch_loop',
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
- 'connection.listener.fetch_loop',
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
- 'connection.listener.fetch_loop.received',
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
- 'error.occurred',
263
+ "error.occurred",
264
264
  caller: self,
265
265
  error: e,
266
- type: 'connection.listener.fetch_loop.error'
266
+ type: "connection.listener.fetch_loop.error"
267
267
  )
268
268
 
269
269
  reset
@@ -66,7 +66,7 @@ module Karafka
66
66
  else
67
67
  raise(
68
68
  ArgumentError,
69
- "Invalid connection mode: #{new_mode}. Valid modes: #{MODES.join(', ')}"
69
+ "Invalid connection mode: #{new_mode}. Valid modes: #{MODES.join(", ")}"
70
70
  )
71
71
  end
72
72
  end
@@ -32,7 +32,7 @@ module Karafka
32
32
 
33
33
  attr_accessor :wrapped
34
34
 
35
- alias __getobj__ wrapped
35
+ alias_method :__getobj__, :wrapped
36
36
 
37
37
  # @param obj [Rdkafka::Consumer, Proxy] rdkafka consumer or consumer wrapped with proxy
38
38
  def initialize(obj)
@@ -59,7 +59,7 @@ module Karafka
59
59
  if pending?
60
60
  @status = :stopping
61
61
  conductor.signal
62
- monitor.instrument('connection.listener.stopping', caller: self)
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('connection.listener.stopping', caller: self)
72
+ monitor.instrument("connection.listener.stopping", caller: self)
73
73
  end
74
74
  end
75
75
 
@@ -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('karafka/web')
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('0.10.0')
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
- 'karafka-web < 0.10.0 is not compatible with this karafka version'
24
+ "karafka-web < 0.10.0 is not compatible with this karafka version"
25
25
  )
26
26
  end
27
27
 
@@ -25,9 +25,9 @@ module Karafka
25
25
  end
26
26
 
27
27
  Thread.new do
28
- Thread.current.name = 'karafka.embedded'
28
+ Thread.current.name = "karafka.embedded"
29
29
 
30
- Karafka::Process.tags.add(:execution_mode, 'mode:embedded')
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 = 'karafka.embedded.stopping'
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 = 'development'
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] == '?') || super
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] == '?' ? self == method_name[0..-2] : super
42
+ (method_name[-1] == "?") ? self == method_name[0..-2] : super
43
43
  end
44
44
  end
45
45
  end
@@ -51,7 +51,9 @@ module Karafka
51
51
  end
52
52
  end
53
53
 
54
- # Raised when we've waited enough for shutting down a non-responsive process
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
 
@@ -95,7 +95,7 @@ module Karafka
95
95
  else
96
96
  raise(
97
97
  ArgumentError,
98
- "Invalid execution mode: #{new_mode}. Valid modes: #{MODES.join(', ')}"
98
+ "Invalid execution mode: #{new_mode}. Valid modes: #{MODES.join(", ")}"
99
99
  )
100
100
  end
101
101
  end
@@ -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
- return if monotonic_now - @last_called_at < @interval
29
+ now = monotonic_now
30
30
 
31
- @last_called_at = monotonic_now
31
+ return if now - @last_called_at < @interval
32
+
33
+ @last_called_at = now
32
34
 
33
35
  @block.call
34
36
  end
@@ -28,7 +28,7 @@ module Karafka
28
28
  # Creates an alias `to` for the `new` method to enable nice chaining API
29
29
  # @return [MultiDelegator] new instance of the multi delegator
30
30
  # @see #delegate
31
- alias to new
31
+ alias_method :to, :new
32
32
  end
33
33
  end
34
34
  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
- 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
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
- 'error.occurred',
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: 'librdkafka.error',
36
+ type: "librdkafka.error",
37
37
  error: error
38
38
  )
39
- rescue StandardError => e
39
+ rescue => e
40
40
  monitor.instrument(
41
- 'error.occurred',
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: 'callbacks.error.error',
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
- 'oauthbearer.token_refresh',
25
+ "oauthbearer.token_refresh",
26
26
  bearer: @bearer,
27
27
  caller: self
28
28
  )
29
- rescue StandardError => e
29
+ rescue => e
30
30
  monitor.instrument(
31
- 'error.occurred',
31
+ "error.occurred",
32
32
  caller: self,
33
- type: 'callbacks.oauthbearer_token_refresh.error',
33
+ type: "callbacks.oauthbearer_token_refresh.error",
34
34
  error: e
35
35
  )
36
36
  end