karafka 2.0.0 → 2.1.0

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 (246) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.github/workflows/ci.yml +40 -16
  5. data/.rspec +4 -0
  6. data/.ruby-version +1 -1
  7. data/CHANGELOG.md +459 -796
  8. data/Gemfile +3 -2
  9. data/Gemfile.lock +44 -32
  10. data/LICENSE +1 -1
  11. data/README.md +22 -17
  12. data/bin/integrations +86 -26
  13. data/bin/karafka +1 -13
  14. data/bin/rspecs +6 -0
  15. data/bin/verify_license_integrity +37 -0
  16. data/certs/cert_chain.pem +26 -0
  17. data/config/{errors.yml → locales/errors.yml} +34 -6
  18. data/config/locales/pro_errors.yml +34 -0
  19. data/docker-compose.yml +4 -30
  20. data/karafka.gemspec +17 -10
  21. data/lib/active_job/karafka.rb +3 -7
  22. data/lib/active_job/queue_adapters/karafka_adapter.rb +7 -1
  23. data/lib/karafka/active_job/consumer.rb +29 -6
  24. data/lib/karafka/active_job/current_attributes/loading.rb +36 -0
  25. data/lib/karafka/active_job/current_attributes/persistence.rb +28 -0
  26. data/lib/karafka/active_job/current_attributes.rb +42 -0
  27. data/lib/karafka/active_job/dispatcher.rb +34 -3
  28. data/lib/karafka/active_job/job_options_contract.rb +13 -2
  29. data/lib/karafka/admin.rb +246 -0
  30. data/lib/karafka/app.rb +30 -7
  31. data/lib/karafka/base_consumer.rb +124 -82
  32. data/lib/karafka/cli/base.rb +20 -0
  33. data/lib/karafka/cli/console.rb +13 -8
  34. data/lib/karafka/cli/info.rb +3 -2
  35. data/lib/karafka/cli/server.rb +55 -8
  36. data/lib/karafka/cli/topics.rb +146 -0
  37. data/lib/karafka/connection/client.rb +118 -61
  38. data/lib/karafka/connection/consumer_group_coordinator.rb +48 -0
  39. data/lib/karafka/connection/listener.rb +78 -30
  40. data/lib/karafka/connection/listeners_batch.rb +18 -2
  41. data/lib/karafka/connection/rebalance_manager.rb +3 -0
  42. data/lib/karafka/contracts/config.rb +1 -1
  43. data/lib/karafka/contracts/consumer_group.rb +22 -9
  44. data/lib/karafka/contracts/server_cli_options.rb +71 -11
  45. data/lib/karafka/contracts/topic.rb +65 -0
  46. data/lib/karafka/contracts.rb +1 -1
  47. data/lib/karafka/embedded.rb +36 -0
  48. data/lib/karafka/errors.rb +6 -4
  49. data/lib/karafka/helpers/colorize.rb +6 -0
  50. data/lib/karafka/instrumentation/callbacks/error.rb +3 -4
  51. data/lib/karafka/instrumentation/callbacks/statistics.rb +14 -4
  52. data/lib/karafka/instrumentation/logger_listener.rb +151 -22
  53. data/lib/karafka/instrumentation/notifications.rb +26 -7
  54. data/lib/karafka/instrumentation/proctitle_listener.rb +7 -16
  55. data/lib/karafka/instrumentation/vendors/datadog/dashboard.json +1 -1
  56. data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +153 -0
  57. data/lib/karafka/instrumentation/vendors/datadog/{listener.rb → metrics_listener.rb} +62 -35
  58. data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +166 -0
  59. data/lib/karafka/licenser.rb +53 -50
  60. data/lib/karafka/messages/builders/batch_metadata.rb +8 -8
  61. data/lib/karafka/messages/builders/messages.rb +6 -2
  62. data/lib/karafka/messages/message.rb +14 -2
  63. data/lib/karafka/messages/messages.rb +5 -0
  64. data/lib/karafka/messages/parser.rb +14 -0
  65. data/lib/karafka/patches/rdkafka/bindings.rb +132 -0
  66. data/lib/karafka/pro/active_job/consumer.rb +10 -9
  67. data/lib/karafka/pro/active_job/dispatcher.rb +28 -3
  68. data/lib/karafka/pro/active_job/job_options_contract.rb +16 -3
  69. data/lib/karafka/pro/encryption/cipher.rb +58 -0
  70. data/lib/karafka/pro/encryption/contracts/config.rb +79 -0
  71. data/lib/karafka/pro/encryption/errors.rb +24 -0
  72. data/lib/karafka/pro/encryption/messages/middleware.rb +46 -0
  73. data/lib/karafka/pro/encryption/messages/parser.rb +56 -0
  74. data/lib/karafka/pro/encryption/setup/config.rb +48 -0
  75. data/lib/karafka/pro/encryption.rb +47 -0
  76. data/lib/karafka/pro/iterator.rb +253 -0
  77. data/lib/karafka/pro/loader.rb +52 -26
  78. data/lib/karafka/pro/performance_tracker.rb +10 -6
  79. data/lib/karafka/pro/processing/collapser.rb +62 -0
  80. data/lib/karafka/pro/processing/coordinator.rb +92 -16
  81. data/lib/karafka/pro/processing/filters/base.rb +61 -0
  82. data/lib/karafka/pro/processing/filters/delayer.rb +70 -0
  83. data/lib/karafka/pro/processing/filters/expirer.rb +51 -0
  84. data/lib/karafka/pro/processing/filters/throttler.rb +84 -0
  85. data/lib/karafka/pro/processing/filters/virtual_limiter.rb +52 -0
  86. data/lib/karafka/pro/processing/filters_applier.rb +104 -0
  87. data/lib/karafka/pro/processing/jobs/consume_non_blocking.rb +7 -5
  88. data/lib/karafka/pro/processing/jobs/revoked_non_blocking.rb +37 -0
  89. data/lib/karafka/pro/processing/jobs_builder.rb +22 -4
  90. data/lib/karafka/pro/processing/partitioner.rb +33 -24
  91. data/lib/karafka/pro/processing/scheduler.rb +27 -8
  92. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +68 -0
  93. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +74 -0
  94. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +72 -0
  95. data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +76 -0
  96. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +64 -0
  97. data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +68 -0
  98. data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +64 -0
  99. data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +69 -0
  100. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom.rb +38 -0
  101. data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +64 -0
  102. data/lib/karafka/pro/processing/strategies/aj/ftr_mom.rb +38 -0
  103. data/lib/karafka/pro/processing/strategies/aj/ftr_mom_vp.rb +58 -0
  104. data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +37 -0
  105. data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +79 -0
  106. data/lib/karafka/pro/processing/strategies/aj/mom.rb +36 -0
  107. data/lib/karafka/pro/processing/strategies/aj/mom_vp.rb +52 -0
  108. data/lib/karafka/pro/processing/strategies/base.rb +26 -0
  109. data/lib/karafka/pro/processing/strategies/default.rb +105 -0
  110. data/lib/karafka/pro/processing/strategies/dlq/default.rb +131 -0
  111. data/lib/karafka/pro/processing/strategies/dlq/ftr.rb +61 -0
  112. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +75 -0
  113. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +71 -0
  114. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +43 -0
  115. data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +41 -0
  116. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +69 -0
  117. data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +41 -0
  118. data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +40 -0
  119. data/lib/karafka/pro/processing/strategies/dlq/lrj.rb +63 -0
  120. data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +63 -0
  121. data/lib/karafka/pro/processing/strategies/dlq/lrj_mom_vp.rb +36 -0
  122. data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +39 -0
  123. data/lib/karafka/pro/processing/strategies/dlq/mom.rb +68 -0
  124. data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +37 -0
  125. data/lib/karafka/pro/processing/strategies/dlq/vp.rb +40 -0
  126. data/lib/karafka/pro/processing/strategies/ftr/default.rb +104 -0
  127. data/lib/karafka/pro/processing/strategies/ftr/vp.rb +40 -0
  128. data/lib/karafka/pro/processing/strategies/lrj/default.rb +87 -0
  129. data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +69 -0
  130. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +67 -0
  131. data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +40 -0
  132. data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +39 -0
  133. data/lib/karafka/pro/processing/strategies/lrj/mom.rb +80 -0
  134. data/lib/karafka/pro/processing/strategies/lrj/mom_vp.rb +38 -0
  135. data/lib/karafka/pro/processing/strategies/lrj/vp.rb +36 -0
  136. data/lib/karafka/pro/processing/strategies/mom/default.rb +46 -0
  137. data/lib/karafka/pro/processing/strategies/mom/ftr.rb +53 -0
  138. data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +37 -0
  139. data/lib/karafka/pro/processing/strategies/mom/vp.rb +35 -0
  140. data/lib/karafka/pro/processing/strategies/vp/default.rb +104 -0
  141. data/lib/karafka/pro/{contracts/base.rb → processing/strategies.rb} +6 -5
  142. data/lib/karafka/pro/processing/strategy_selector.rb +84 -0
  143. data/lib/karafka/pro/processing/virtual_offset_manager.rb +147 -0
  144. data/lib/karafka/pro/routing/features/base.rb +24 -0
  145. data/lib/karafka/pro/routing/features/dead_letter_queue/contract.rb +50 -0
  146. data/lib/karafka/pro/routing/features/dead_letter_queue.rb +27 -0
  147. data/lib/karafka/pro/routing/{builder_extensions.rb → features/delaying/config.rb} +8 -11
  148. data/lib/karafka/pro/routing/features/delaying/contract.rb +38 -0
  149. data/lib/karafka/pro/routing/features/delaying/topic.rb +59 -0
  150. data/lib/karafka/pro/routing/features/delaying.rb +29 -0
  151. data/lib/karafka/pro/routing/features/expiring/config.rb +27 -0
  152. data/lib/karafka/pro/routing/features/expiring/contract.rb +38 -0
  153. data/lib/karafka/pro/routing/features/expiring/topic.rb +59 -0
  154. data/lib/karafka/pro/routing/features/expiring.rb +27 -0
  155. data/lib/karafka/pro/routing/features/filtering/config.rb +40 -0
  156. data/lib/karafka/pro/routing/features/filtering/contract.rb +41 -0
  157. data/lib/karafka/pro/routing/features/filtering/topic.rb +51 -0
  158. data/lib/karafka/pro/routing/features/filtering.rb +27 -0
  159. data/lib/karafka/pro/routing/features/long_running_job/config.rb +28 -0
  160. data/lib/karafka/pro/routing/features/long_running_job/contract.rb +37 -0
  161. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +42 -0
  162. data/lib/karafka/pro/routing/features/long_running_job.rb +28 -0
  163. data/lib/karafka/pro/routing/features/throttling/config.rb +32 -0
  164. data/lib/karafka/pro/routing/features/throttling/contract.rb +41 -0
  165. data/lib/karafka/pro/routing/features/throttling/topic.rb +69 -0
  166. data/lib/karafka/pro/routing/features/throttling.rb +30 -0
  167. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +30 -0
  168. data/lib/karafka/pro/routing/features/virtual_partitions/contract.rb +52 -0
  169. data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +56 -0
  170. data/lib/karafka/pro/routing/features/virtual_partitions.rb +27 -0
  171. data/lib/karafka/process.rb +23 -8
  172. data/lib/karafka/processing/coordinator.rb +102 -23
  173. data/lib/karafka/processing/coordinators_buffer.rb +5 -1
  174. data/lib/karafka/processing/executor.rb +51 -21
  175. data/lib/karafka/processing/executors_buffer.rb +10 -26
  176. data/lib/karafka/processing/jobs/base.rb +6 -2
  177. data/lib/karafka/processing/jobs/consume.rb +8 -5
  178. data/lib/karafka/processing/jobs/idle.rb +24 -0
  179. data/lib/karafka/processing/jobs_builder.rb +2 -3
  180. data/lib/karafka/processing/jobs_queue.rb +14 -8
  181. data/lib/karafka/processing/partitioner.rb +3 -1
  182. data/lib/karafka/processing/result.rb +14 -1
  183. data/lib/karafka/processing/strategies/aj_dlq_mom.rb +44 -0
  184. data/lib/karafka/processing/strategies/aj_mom.rb +21 -0
  185. data/lib/karafka/processing/strategies/base.rb +52 -0
  186. data/lib/karafka/processing/strategies/default.rb +142 -0
  187. data/lib/karafka/processing/strategies/dlq.rb +88 -0
  188. data/lib/karafka/processing/strategies/dlq_mom.rb +49 -0
  189. data/lib/karafka/processing/strategies/mom.rb +29 -0
  190. data/lib/karafka/processing/strategy_selector.rb +47 -0
  191. data/lib/karafka/processing/worker.rb +8 -3
  192. data/lib/karafka/railtie.rb +24 -12
  193. data/lib/karafka/routing/activity_manager.rb +84 -0
  194. data/lib/karafka/routing/builder.rb +20 -0
  195. data/lib/karafka/routing/consumer_group.rb +38 -4
  196. data/lib/karafka/routing/consumer_mapper.rb +0 -10
  197. data/lib/karafka/routing/features/active_job/builder.rb +33 -0
  198. data/lib/karafka/routing/features/active_job/config.rb +15 -0
  199. data/lib/karafka/routing/features/active_job/contract.rb +41 -0
  200. data/lib/karafka/routing/features/active_job/topic.rb +33 -0
  201. data/lib/karafka/routing/features/active_job.rb +13 -0
  202. data/lib/karafka/routing/features/base/expander.rb +53 -0
  203. data/lib/karafka/routing/features/base.rb +34 -0
  204. data/lib/karafka/routing/features/dead_letter_queue/config.rb +19 -0
  205. data/lib/karafka/routing/features/dead_letter_queue/contract.rb +42 -0
  206. data/lib/karafka/routing/features/dead_letter_queue/topic.rb +41 -0
  207. data/lib/karafka/routing/features/dead_letter_queue.rb +16 -0
  208. data/lib/karafka/routing/features/declaratives/config.rb +18 -0
  209. data/lib/karafka/routing/features/declaratives/contract.rb +30 -0
  210. data/lib/karafka/routing/features/declaratives/topic.rb +44 -0
  211. data/lib/karafka/routing/features/declaratives.rb +14 -0
  212. data/lib/karafka/routing/features/manual_offset_management/config.rb +15 -0
  213. data/lib/karafka/routing/features/manual_offset_management/contract.rb +24 -0
  214. data/lib/karafka/routing/features/manual_offset_management/topic.rb +35 -0
  215. data/lib/karafka/routing/features/manual_offset_management.rb +18 -0
  216. data/lib/karafka/routing/proxy.rb +18 -20
  217. data/lib/karafka/routing/router.rb +27 -2
  218. data/lib/karafka/routing/subscription_group.rb +43 -5
  219. data/lib/karafka/routing/subscription_groups_builder.rb +6 -1
  220. data/lib/karafka/routing/topic.rb +17 -5
  221. data/lib/karafka/routing/topics.rb +8 -0
  222. data/lib/karafka/runner.rb +1 -0
  223. data/lib/karafka/serialization/json/deserializer.rb +1 -0
  224. data/lib/karafka/server.rb +58 -28
  225. data/lib/karafka/setup/attributes_map.rb +344 -0
  226. data/lib/karafka/setup/config.rb +48 -19
  227. data/lib/karafka/status.rb +35 -7
  228. data/lib/karafka/templates/karafka.rb.erb +14 -6
  229. data/lib/karafka/time_trackers/base.rb +1 -6
  230. data/lib/karafka/time_trackers/pause.rb +49 -19
  231. data/lib/karafka/time_trackers/poll.rb +7 -3
  232. data/lib/karafka/version.rb +1 -1
  233. data/lib/karafka.rb +56 -3
  234. data/renovate.json +6 -0
  235. data.tar.gz.sig +0 -0
  236. metadata +189 -61
  237. metadata.gz.sig +0 -0
  238. data/bin/wait_for_kafka +0 -20
  239. data/certs/mensfeld.pem +0 -25
  240. data/lib/karafka/active_job/routing/extensions.rb +0 -31
  241. data/lib/karafka/contracts/consumer_group_topic.rb +0 -42
  242. data/lib/karafka/instrumentation.rb +0 -21
  243. data/lib/karafka/pro/base_consumer.rb +0 -82
  244. data/lib/karafka/pro/contracts/consumer_group.rb +0 -34
  245. data/lib/karafka/pro/contracts/consumer_group_topic.rb +0 -33
  246. data/lib/karafka/pro/routing/topic_extensions.rb +0 -38
@@ -3,8 +3,14 @@
3
3
  module Karafka
4
4
  module TimeTrackers
5
5
  # Handles Kafka topic partition pausing and resuming with exponential back-offs.
6
+ # Since expiring and pausing can happen from both consumer and listener, this needs to be
7
+ # thread-safe.
8
+ #
9
+ # @note We do not have to worry about performance implications of a mutex wrapping most of the
10
+ # code here, as this is not a frequently used tracker. It is active only once per batch in
11
+ # case of long-running-jobs and upon errors.
6
12
  class Pause < Base
7
- attr_reader :count
13
+ attr_reader :attempt, :current_timeout
8
14
 
9
15
  # @param timeout [Integer] how long should we wait when anything went wrong (in ms)
10
16
  # @param max_timeout [Integer, nil] if exponential is on, what is the max value we can reach
@@ -13,67 +19,91 @@ module Karafka
13
19
  # timeout value
14
20
  # @return [Karafka::TimeTrackers::Pause]
15
21
  # @example
16
- # pause = Karafka::TimeTrackers::Pause.new(timeout: 1000)
22
+ # options = { timeout: 1000, max_timeout: 1000, exponential_backoff: false }
23
+ # pause = Karafka::TimeTrackers::Pause.new(**options)
17
24
  # pause.expired? #=> true
18
25
  # pause.paused? #=> false
19
26
  # pause.pause
27
+ # pause.increment
20
28
  # sleep(1.1)
21
29
  # pause.paused? #=> true
22
30
  # pause.expired? #=> true
23
- # pause.count #=> 1
31
+ # pause.attempt #=> 1
24
32
  # pause.pause
25
- # pause.count #=> 1
33
+ # pause.increment
34
+ # pause.attempt #=> 2
26
35
  # pause.paused? #=> true
27
36
  # pause.expired? #=> false
28
37
  # pause.resume
29
- # pause.count #=> 2
38
+ # pause.attempt #=> 2
30
39
  # pause.paused? #=> false
31
40
  # pause.reset
32
- # pause.count #=> 0
41
+ # pause.attempt #=> 0
33
42
  def initialize(timeout:, max_timeout:, exponential_backoff:)
34
43
  @started_at = nil
35
- @count = 0
44
+ @attempt = 0
36
45
  @timeout = timeout
46
+ @current_timeout = timeout
37
47
  @max_timeout = max_timeout
38
48
  @exponential_backoff = exponential_backoff
49
+ @mutex = Mutex.new
39
50
  super()
40
51
  end
41
52
 
42
53
  # Pauses the processing from now till the end of the interval (backoff or non-backoff)
43
- # and records the count.
54
+ # and records the attempt.
44
55
  # @param timeout [Integer] timeout value in milliseconds that overwrites the default timeout
45
56
  # @note Providing this value can be useful when we explicitly want to pause for a certain
46
57
  # period of time, outside of any regular pausing logic
47
58
  def pause(timeout = backoff_interval)
48
- @started_at = now
49
- @ends_at = @started_at + timeout
50
- @count += 1
59
+ @mutex.synchronize do
60
+ @current_timeout = timeout
61
+ @started_at = monotonic_now
62
+ @ends_at = @started_at + timeout
63
+ end
64
+ end
65
+
66
+ # Increments the number of attempt by 1
67
+ def increment
68
+ @mutex.synchronize do
69
+ @attempt += 1
70
+ end
51
71
  end
52
72
 
53
73
  # Marks the pause as resumed.
54
74
  def resume
55
- @started_at = nil
56
- @ends_at = nil
75
+ @mutex.synchronize do
76
+ @started_at = nil
77
+ @ends_at = nil
78
+ end
57
79
  end
58
80
 
59
81
  # Expires the pause, so it can be considered expired
60
82
  def expire
61
- @ends_at = nil
83
+ @mutex.synchronize do
84
+ @ends_at = nil
85
+ end
62
86
  end
63
87
 
64
88
  # @return [Boolean] are we paused from processing
65
89
  def paused?
66
- !@started_at.nil?
90
+ @mutex.synchronize do
91
+ !@started_at.nil?
92
+ end
67
93
  end
68
94
 
69
95
  # @return [Boolean] did the pause expire
70
96
  def expired?
71
- @ends_at ? now >= @ends_at : true
97
+ @mutex.synchronize do
98
+ @ends_at ? monotonic_now >= @ends_at : true
99
+ end
72
100
  end
73
101
 
74
- # Resets the pause counter.
102
+ # Resets the pause attempt count.
75
103
  def reset
76
- @count = 0
104
+ @mutex.synchronize do
105
+ @attempt = 0
106
+ end
77
107
  end
78
108
 
79
109
  private
@@ -81,7 +111,7 @@ module Karafka
81
111
  # Computers the exponential backoff
82
112
  # @return [Integer] backoff in milliseconds
83
113
  def backoff_interval
84
- backoff_factor = @exponential_backoff ? 2**@count : 1
114
+ backoff_factor = @exponential_backoff ? 2**@attempt : 1
85
115
 
86
116
  timeout = backoff_factor * @timeout
87
117
 
@@ -2,7 +2,8 @@
2
2
 
3
3
  module Karafka
4
4
  module TimeTrackers
5
- # Object used to keep track of time we've used running certain operations.
5
+ # Object used to keep track of time we've used running certain operations. Polling is
6
+ # running in a single thread, thus we do not have to worry about this being thread-safe.
6
7
  #
7
8
  # @example Keep track of sleeping and stop after 3 seconds of 0.1 sleep intervals
8
9
  # time_poll = Poll.new(3000)
@@ -33,12 +34,12 @@ module Karafka
33
34
  # Starts time tracking.
34
35
  def start
35
36
  @attempts += 1
36
- @started_at = now
37
+ @started_at = monotonic_now
37
38
  end
38
39
 
39
40
  # Stops time tracking of a given piece of code and updates the remaining time.
40
41
  def checkpoint
41
- @remaining -= (now - @started_at)
42
+ @remaining -= (monotonic_now - @started_at)
42
43
  end
43
44
 
44
45
  # @return [Boolean] If anything went wrong, can we retry after a backoff period or not
@@ -50,6 +51,9 @@ module Karafka
50
51
  # Sleeps for amount of time matching attempt, so we sleep more with each attempt in case of
51
52
  # a retry.
52
53
  def backoff
54
+ # backoff should not be included in the remaining time computation, otherwise it runs
55
+ # shortly, never back-offing beyond a small number because of the sleep
56
+ @remaining += backoff_interval
53
57
  # Sleep requires seconds not ms
54
58
  sleep(backoff_interval / 1_000.0)
55
59
  end
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = '2.0.0'
6
+ VERSION = '2.1.0'
7
7
  end
data/lib/karafka.rb CHANGED
@@ -13,7 +13,10 @@
13
13
  openssl
14
14
  base64
15
15
  date
16
+ singleton
17
+ digest
16
18
  zeitwerk
19
+ concurrent/atomic/atomic_fixnum
17
20
  ].each(&method(:require))
18
21
 
19
22
  # Karafka framework main namespace
@@ -67,6 +70,19 @@ module Karafka
67
70
  App.config.license.token != false
68
71
  end
69
72
 
73
+ # @return [Boolean] Do we run within/with Rails. We use this to initialize Railtie and proxy
74
+ # the console invocation to Rails
75
+ def rails?
76
+ return @rails if instance_variable_defined?('@rails')
77
+
78
+ # Do not load Rails again if already loaded
79
+ Object.const_defined?('Rails::Railtie') || require('rails')
80
+
81
+ @rails = true
82
+ rescue LoadError
83
+ @rails = false
84
+ end
85
+
70
86
  # @return [String] path to a default file that contains booting procedure etc
71
87
  # @note By default it is a file called 'karafka.rb' but it can be specified as you wish if you
72
88
  # have Karafka that is merged into a Sinatra/Rails app and karafka.rb is taken.
@@ -79,15 +95,52 @@ module Karafka
79
95
  def boot_file
80
96
  Pathname.new(ENV['KARAFKA_BOOT_FILE'] || File.join(Karafka.root, 'karafka.rb'))
81
97
  end
98
+
99
+ # We need to be able to overwrite both monitor and logger after the configuration in case they
100
+ # would be changed because those two (with defaults) can be used prior to the setup and their
101
+ # state change should be reflected in the updated setup
102
+ #
103
+ # This method refreshes the things that might have been altered by the configuration
104
+ def refresh!
105
+ config = ::Karafka::App.config
106
+
107
+ @logger = config.logger
108
+ @producer = config.producer
109
+ @monitor = config.monitor
110
+ end
82
111
  end
83
112
  end
84
113
 
85
114
  loader = Zeitwerk::Loader.for_gem
86
115
  # Do not load Rails extensions by default, this will be handled by Railtie if they are needed
87
116
  loader.ignore(Karafka.gem_root.join('lib/active_job'))
88
- # Do not load pro components, this will be handled by license manager
89
- loader.ignore(Karafka.gem_root.join('lib/karafka/pro'))
117
+ # Do not load CurrentAttributes components as they will be loaded if needed
118
+ # @note We have to exclude both the .rb file as well as the whole directory so users can require
119
+ # current attributes only when needed
120
+ loader.ignore(Karafka.gem_root.join('lib/karafka/active_job/current_attributes'))
121
+ loader.ignore(Karafka.gem_root.join('lib/karafka/active_job/current_attributes.rb'))
122
+ # Do not load Railtie. It will load if after everything is ready, so we don't have to load any
123
+ # Karafka components when we require this railtie. Railtie needs to be loaded last.
124
+ loader.ignore(Karafka.gem_root.join('lib/karafka/railtie'))
125
+ # Do not load pro components as they will be loaded if needed and allowed
126
+ loader.ignore(Karafka.core_root.join('pro/'))
90
127
  # Do not load vendors instrumentation components. Those need to be required manually if needed
91
- loader.ignore(Karafka.gem_root.join('lib/karafka/instrumentation/vendors'))
128
+ loader.ignore(Karafka.core_root.join('instrumentation/vendors'))
92
129
  loader.setup
93
130
  loader.eager_load
131
+
132
+ # This will load features but since Pro are not loaded automatically, they will not be visible
133
+ # nor included here
134
+ ::Karafka::Routing::Features::Base.load_all
135
+
136
+ # We need to detect and require (not setup) Pro components during the gem load, because we need
137
+ # to make pro components available in case anyone wants to use them as a base to their own
138
+ # custom components. Otherwise inheritance would not work.
139
+ Karafka::Licenser.detect do
140
+ require 'karafka/pro/loader'
141
+
142
+ Karafka::Pro::Loader.require_all
143
+ end
144
+
145
+ # Load railtie after everything else is ready so we know we can rely on it.
146
+ require 'karafka/railtie'
data/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:base"
5
+ ]
6
+ }
data.tar.gz.sig CHANGED
Binary file