waterdrop 2.0.1 → 2.0.5

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.
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ module Instrumentation
5
+ module Callbacks
6
+ # Callback that kicks in when error occurs and is published in a background thread
7
+ class Error
8
+ # @param producer_id [String] id of the current producer
9
+ # @param client_name [String] rdkafka client name
10
+ # @param monitor [WaterDrop::Instrumentation::Monitor] monitor we are using
11
+ def initialize(producer_id, client_name, monitor)
12
+ @producer_id = producer_id
13
+ @client_name = client_name
14
+ @monitor = monitor
15
+ end
16
+
17
+ # Runs the instrumentation monitor with error
18
+ # @param client_name [String] rdkafka client name
19
+ # @param error [Rdkafka::Error] error that occurred
20
+ # @note If will only instrument on errors of the client of our producer
21
+ def call(client_name, error)
22
+ # Emit only errors related to our client
23
+ # Same as with statistics (mor explanation there)
24
+ return unless @client_name == client_name
25
+
26
+ @monitor.instrument(
27
+ 'error.emitted',
28
+ producer_id: @producer_id,
29
+ error: error
30
+ )
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ module Instrumentation
5
+ # Namespace for handlers of callbacks emitted by the kafka client lib
6
+ module Callbacks
7
+ # Statistics callback handler
8
+ # @note We decorate the statistics with our own decorator because some of the metrics from
9
+ # rdkafka are absolute. For example number of sent messages increases not in reference to
10
+ # previous statistics emit but from the beginning of the process. We decorate it with diff
11
+ # of all the numeric values against the data from the previous callback emit
12
+ class Statistics
13
+ # @param producer_id [String] id of the current producer
14
+ # @param client_name [String] rdkafka client name
15
+ # @param monitor [WaterDrop::Instrumentation::Monitor] monitor we are using
16
+ def initialize(producer_id, client_name, monitor)
17
+ @producer_id = producer_id
18
+ @client_name = client_name
19
+ @monitor = monitor
20
+ @statistics_decorator = StatisticsDecorator.new
21
+ end
22
+
23
+ # Emits decorated statistics to the monitor
24
+ # @param statistics [Hash] rdkafka statistics
25
+ def call(statistics)
26
+ # Emit only statistics related to our client
27
+ # rdkafka does not have per-instance statistics hook, thus we need to make sure that we
28
+ # emit only stats that are related to current producer. Otherwise we would emit all of
29
+ # all the time.
30
+ return unless @client_name == statistics['name']
31
+
32
+ @monitor.instrument(
33
+ 'statistics.emitted',
34
+ producer_id: @producer_id,
35
+ statistics: @statistics_decorator.call(statistics)
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ module Instrumentation
5
+ module Callbacks
6
+ # Many of the librdkafka statistics are absolute values instead of a gauge.
7
+ # This means, that for example number of messages sent is an absolute growing value
8
+ # instead of being a value of messages sent from the last statistics report.
9
+ # This decorator calculates the diff against previously emited stats, so we get also
10
+ # the diff together with the original values
11
+ class StatisticsDecorator
12
+ def initialize
13
+ @previous = {}.freeze
14
+ end
15
+
16
+ # @param emited_stats [Hash] original emited statistics
17
+ # @return [Hash] emited statistics extended with the diff data
18
+ # @note We modify the emited statistics, instead of creating new. Since we don't expose
19
+ # any API to get raw data, users can just assume that the result of this decoration is
20
+ # the proper raw stats that they can use
21
+ def call(emited_stats)
22
+ diff(
23
+ @previous,
24
+ emited_stats
25
+ )
26
+
27
+ @previous = emited_stats
28
+
29
+ emited_stats.freeze
30
+ end
31
+
32
+ private
33
+
34
+ # Calculates the diff of the provided values and modifies in place the emited statistics
35
+ #
36
+ # @param previous [Object] previous value from the given scope in which
37
+ # we are
38
+ # @param current [Object] current scope from emitted statistics
39
+ # @return [Object] the diff if the values were numerics or the current scope
40
+ def diff(previous, current)
41
+ if current.is_a?(Hash)
42
+ # @note We cannot use #each_key as we modify the content of the current scope
43
+ # in place (in case it's a hash)
44
+ current.keys.each do |key|
45
+ append(
46
+ current,
47
+ key,
48
+ diff((previous || {})[key], (current || {})[key])
49
+ )
50
+ end
51
+ end
52
+
53
+ # Diff can be computed only for numerics
54
+ return current unless current.is_a?(Numeric)
55
+ # If there was no previous value, delta is always zero
56
+ return 0 unless previous
57
+ # Should never happen but just in case, a type changed in between stats
58
+ return current unless previous.is_a?(Numeric)
59
+
60
+ current - previous
61
+ end
62
+
63
+ # Appends the result of the diff to a given key as long as the result is numeric
64
+ #
65
+ # @param current [Hash] current scope
66
+ # @param key [Symbol] key based on which we were diffing
67
+ # @param result [Object] diff result
68
+ def append(current, key, result)
69
+ return unless result.is_a?(Numeric)
70
+ return if current.frozen?
71
+
72
+ current["#{key}_d"] = result
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ module Instrumentation
5
+ # This manager allows us to register multiple callbacks into a hook that is suppose to support
6
+ # a single callback
7
+ class CallbacksManager
8
+ # @return [::WaterDrop::Instrumentation::CallbacksManager]
9
+ def initialize
10
+ @callbacks = Concurrent::Hash.new
11
+ end
12
+
13
+ # Invokes all the callbacks registered one after another
14
+ #
15
+ # @param args [Object] any args that should go to the callbacks
16
+ def call(*args)
17
+ @callbacks.each_value { |a| a.call(*args) }
18
+ end
19
+
20
+ # Adds a callback to the manager
21
+ #
22
+ # @param id [String] id of the callback (used when deleting it)
23
+ # @param callable [#call] object that responds to a `#call` method
24
+ def add(id, callable)
25
+ @callbacks[id] = callable
26
+ end
27
+
28
+ # Removes the callback from the manager
29
+ # @param id [String] id of the callback we want to remove
30
+ def delete(id)
31
+ @callbacks.delete(id)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -13,18 +13,24 @@ module WaterDrop
13
13
  # @note The non-error once support timestamp benchmarking
14
14
  EVENTS = %w[
15
15
  producer.closed
16
+
16
17
  message.produced_async
17
18
  message.produced_sync
19
+ message.acknowledged
20
+ message.buffered
21
+
18
22
  messages.produced_async
19
23
  messages.produced_sync
20
- message.buffered
21
24
  messages.buffered
22
- message.acknowledged
25
+
23
26
  buffer.flushed_async
24
27
  buffer.flushed_async.error
25
28
  buffer.flushed_sync
26
29
  buffer.flushed_sync.error
30
+
27
31
  statistics.emitted
32
+
33
+ error.emitted
28
34
  ].freeze
29
35
 
30
36
  private_constant :EVENTS
@@ -2,6 +2,20 @@
2
2
 
3
3
  module WaterDrop
4
4
  # Namespace for all the things related with WaterDrop instrumentation process
5
+ # @note We do not
5
6
  module Instrumentation
7
+ class << self
8
+ # Builds a manager for statistics callbacks
9
+ # @return [WaterDrop::CallbacksManager]
10
+ def statistics_callbacks
11
+ @statistics_callbacks ||= CallbacksManager.new
12
+ end
13
+
14
+ # Builds a manager for error callbacks
15
+ # @return [WaterDrop::CallbacksManager]
16
+ def error_callbacks
17
+ @error_callbacks ||= CallbacksManager.new
18
+ end
19
+ end
6
20
  end
7
21
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ module Patches
5
+ module Rdkafka
6
+ # Extends `Rdkafka::Bindings` with some extra methods and updates callbacks that we intend
7
+ # to work with in a bit different way than rdkafka itself
8
+ module Bindings
9
+ class << self
10
+ # Add extra methods that we need
11
+ # @param mod [::Rdkafka::Bindings] rdkafka bindings module
12
+ def included(mod)
13
+ mod.attach_function :rd_kafka_name, [:pointer], :string
14
+
15
+ # Default rdkafka setup for errors doest not propagate client details, thus it always
16
+ # publishes all the stuff for all rdkafka instances. We change that by providing
17
+ # function that fetches the instance name, allowing us to have better notifications
18
+ mod.send(:remove_const, :ErrorCallback)
19
+ mod.const_set(:ErrorCallback, build_error_callback)
20
+ end
21
+
22
+ # @return [FFI::Function] overwritten callback function
23
+ def build_error_callback
24
+ FFI::Function.new(
25
+ :void, %i[pointer int string pointer]
26
+ ) do |client_prr, err_code, reason, _opaque|
27
+ return nil unless ::Rdkafka::Config.error_callback
28
+
29
+ name = ::Rdkafka::Bindings.rd_kafka_name(client_prr)
30
+
31
+ error = ::Rdkafka::RdkafkaError.new(err_code, broker_message: reason)
32
+
33
+ ::Rdkafka::Config.error_callback.call(name, error)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ ::Rdkafka::Bindings.include(::WaterDrop::Patches::Rdkafka::Bindings)
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WaterDrop
4
+ # Patches to external components
5
+ module Patches
6
+ # Rdkafka related patches
7
+ module Rdkafka
8
+ # Rdkafka::Producer patches
9
+ module Producer
10
+ # Adds a method that allows us to get the native kafka producer name
11
+ # @return [String] producer instance name
12
+ def name
13
+ ::Rdkafka::Bindings.rd_kafka_name(@native_kafka)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ ::Rdkafka::Producer.include ::WaterDrop::Patches::Rdkafka::Producer
@@ -12,51 +12,16 @@ module WaterDrop
12
12
  def call(producer, config)
13
13
  return DummyClient.new unless config.deliver
14
14
 
15
- Rdkafka::Config.logger = config.logger
16
- Rdkafka::Config.statistics_callback = build_statistics_callback(producer, config.monitor)
17
-
18
15
  client = Rdkafka::Config.new(config.kafka.to_h).producer
19
- client.delivery_callback = build_delivery_callback(producer, config.monitor)
20
- client
21
- end
22
16
 
23
- private
17
+ # This callback is not global and is per client, thus we do not have to wrap it with a
18
+ # callbacks manager to make it work
19
+ client.delivery_callback = Instrumentation::Callbacks::Delivery.new(
20
+ producer.id,
21
+ config.monitor
22
+ )
24
23
 
25
- # Creates a proc that we want to run upon each successful message delivery
26
- #
27
- # @param producer [Producer]
28
- # @param monitor [Object] monitor we want to use
29
- # @return [Proc] delivery callback
30
- def build_delivery_callback(producer, monitor)
31
- lambda do |delivery_report|
32
- monitor.instrument(
33
- 'message.acknowledged',
34
- producer: producer,
35
- offset: delivery_report.offset,
36
- partition: delivery_report.partition
37
- )
38
- end
39
- end
40
-
41
- # Creates a proc that we want to run upon each statistics callback execution
42
- #
43
- # @param producer [Producer]
44
- # @param monitor [Object] monitor we want to use
45
- # @return [Proc] statistics callback
46
- # @note We decorate the statistics with our own decorator because some of the metrics from
47
- # rdkafka are absolute. For example number of sent messages increases not in reference to
48
- # previous statistics emit but from the beginning of the process. We decorate it with diff
49
- # of all the numeric values against the data from the previous callback emit
50
- def build_statistics_callback(producer, monitor)
51
- statistics_decorator = StatisticsDecorator.new
52
-
53
- lambda do |statistics|
54
- monitor.instrument(
55
- 'statistics.emitted',
56
- producer: producer,
57
- statistics: statistics_decorator.call(statistics)
58
- )
59
- end
24
+ client
60
25
  end
61
26
  end
62
27
  end
@@ -80,6 +80,19 @@ module WaterDrop
80
80
 
81
81
  @pid = Process.pid
82
82
  @client = Builder.new.call(self, @config)
83
+
84
+ # Register statistics runner for this particular type of callbacks
85
+ ::WaterDrop::Instrumentation.statistics_callbacks.add(
86
+ @id,
87
+ Instrumentation::Callbacks::Statistics.new(@id, @client.name, @config.monitor)
88
+ )
89
+
90
+ # Register error tracking callback
91
+ ::WaterDrop::Instrumentation.error_callbacks.add(
92
+ @id,
93
+ Instrumentation::Callbacks::Error.new(@id, @client.name, @config.monitor)
94
+ )
95
+
83
96
  @status.connected!
84
97
  end
85
98
 
@@ -101,13 +114,19 @@ module WaterDrop
101
114
  # This should be used only in case a producer was not closed properly and forgotten
102
115
  ObjectSpace.undefine_finalizer(id)
103
116
 
104
- # Flush has it's own buffer mutex but even if it is blocked, flushing can still happen
117
+ # Flush has its own buffer mutex but even if it is blocked, flushing can still happen
105
118
  # as we close the client after the flushing (even if blocked by the mutex)
106
- flush(false)
119
+ flush(true)
107
120
 
108
121
  # We should not close the client in several threads the same time
109
122
  # It is safe to run it several times but not exactly the same moment
110
- client.close
123
+ # We also mark it as closed only if it was connected, if not, it would trigger a new
124
+ # connection that anyhow would be immediately closed
125
+ client.close if @client
126
+
127
+ # Remove callbacks runners that were registered
128
+ ::WaterDrop::Instrumentation.statistics_callbacks.delete(@id)
129
+ ::WaterDrop::Instrumentation.error_callbacks.delete(@id)
111
130
 
112
131
  @status.closed!
113
132
  end
@@ -3,5 +3,5 @@
3
3
  # WaterDrop library
4
4
  module WaterDrop
5
5
  # Current WaterDrop version
6
- VERSION = '2.0.1'
6
+ VERSION = '2.0.5'
7
7
  end
data/lib/water_drop.rb CHANGED
@@ -28,3 +28,9 @@ Zeitwerk::Loader
28
28
  .tap { |loader| loader.ignore("#{__dir__}/waterdrop.rb") }
29
29
  .tap(&:setup)
30
30
  .tap(&:eager_load)
31
+
32
+ # Rdkafka uses a single global callback for things. We bypass that by injecting a manager for
33
+ # each callback type. Callback manager allows us to register more than one callback
34
+ # @note Those managers are also used by Karafka for consumer related statistics
35
+ Rdkafka::Config.statistics_callback = WaterDrop::Instrumentation.statistics_callbacks
36
+ Rdkafka::Config.error_callback = WaterDrop::Instrumentation.error_callbacks
data/waterdrop.gemspec CHANGED
@@ -14,14 +14,14 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'https://github.com/karafka/waterdrop'
15
15
  spec.summary = 'Kafka messaging made easy!'
16
16
  spec.description = spec.summary
17
- spec.license = 'LGPL-3.0'
17
+ spec.license = 'MIT'
18
18
 
19
19
  spec.add_dependency 'concurrent-ruby', '>= 1.1'
20
- spec.add_dependency 'dry-configurable', '~> 0.8'
21
- spec.add_dependency 'dry-monitor', '~> 0.3'
22
- spec.add_dependency 'dry-validation', '~> 1.3'
23
- spec.add_dependency 'rdkafka', '>= 0.6.0'
24
- spec.add_dependency 'zeitwerk', '~> 2.1'
20
+ spec.add_dependency 'dry-configurable', '~> 0.13'
21
+ spec.add_dependency 'dry-monitor', '~> 0.5'
22
+ spec.add_dependency 'dry-validation', '~> 1.7'
23
+ spec.add_dependency 'rdkafka', '>= 0.10'
24
+ spec.add_dependency 'zeitwerk', '~> 2.3'
25
25
 
26
26
  spec.required_ruby_version = '>= 2.6.0'
27
27
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: waterdrop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -11,30 +11,30 @@ cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
13
  MIIEODCCAqCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhtYWNp
14
- ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMjAwODExMDkxNTM3WhcNMjEwODExMDkx
15
- NTM3WjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
16
- CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDCpXsCgmINb6lHBXXBdyrgsBPSxC4/
17
- 2H+weJ6L9CruTiv2+2/ZkQGtnLcDgrD14rdLIHK7t0o3EKYlDT5GhD/XUVhI15JE
18
- N7IqnPUgexe1fbZArwQ51afxz2AmPQN2BkB2oeQHXxnSWUGMhvcEZpfbxCCJH26w
19
- hS0Ccsma8yxA6hSlGVhFVDuCr7c2L1di6cK2CtIDpfDaWqnVNJEwBYHIxrCoWK5g
20
- sIGekVt/admS9gRhIMaIBg+Mshth5/DEyWO2QjteTodItlxfTctrfmiAl8X8T5JP
21
- VXeLp5SSOJ5JXE80nShMJp3RFnGw5fqjX/ffjtISYh78/By4xF3a25HdWH9+qO2Z
22
- tx0wSGc9/4gqNM0APQnjN/4YXrGZ4IeSjtE+OrrX07l0TiyikzSLFOkZCAp8oBJi
23
- Fhlosz8xQDJf7mhNxOaZziqASzp/hJTU/tuDKl5+ql2icnMv5iV/i6SlmvU29QNg
24
- LCV71pUv0pWzN+OZbHZKWepGhEQ3cG9MwvkCAwEAAaN3MHUwCQYDVR0TBAIwADAL
25
- BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFImGed2AXS070ohfRidiCEhXEUN+MB0GA1Ud
14
+ ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMjEwODExMTQxNTEzWhcNMjIwODExMTQx
15
+ NTEzWjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
16
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDV2jKH4Ti87GM6nyT6D+ESzTI0MZDj
17
+ ak2/TEwnxvijMJyCCPKT/qIkbW4/f0VHM4rhPr1nW73sb5SZBVFCLlJcOSKOBdUY
18
+ TMY+SIXN2EtUaZuhAOe8LxtxjHTgRHvHcqUQMBENXTISNzCo32LnUxweu66ia4Pd
19
+ 1mNRhzOqNv9YiBZvtBf7IMQ+sYdOCjboq2dlsWmJiwiDpY9lQBTnWORnT3mQxU5x
20
+ vPSwnLB854cHdCS8fQo4DjeJBRZHhEbcE5sqhEMB3RZA3EtFVEXOxlNxVTS3tncI
21
+ qyNXiWDaxcipaens4ObSY1C2HTV7OWb7OMqSCIybeYTSfkaSdqmcl4S6zxXkjH1J
22
+ tnjayAVzD+QVXGijsPLE2PFnJAh9iDET2cMsjabO1f6l1OQNyAtqpcyQcgfnyW0z
23
+ g7tGxTYD+6wJHffM9d9txOUw6djkF6bDxyqB8lo4Z3IObCx18AZjI9XPS9QG7w6q
24
+ LCWuMG2lkCcRgASqaVk9fEf9yMc2xxz5o3kCAwEAAaN3MHUwCQYDVR0TBAIwADAL
25
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFBqUFCKCOe5IuueUVqOB991jyCLLMB0GA1Ud
26
26
  EQQWMBSBEm1hY2llakBtZW5zZmVsZC5wbDAdBgNVHRIEFjAUgRJtYWNpZWpAbWVu
27
- c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBAKiHpwoENVrMi94V1zD4o8/6G3AU
28
- gWz4udkPYHTZLUy3dLznc/sNjdkJFWT3E6NKYq7c60EpJ0m0vAEg5+F5pmNOsvD3
29
- 2pXLj9kisEeYhR516HwXAvtngboUcb75skqvBCU++4Pu7BRAPjO1/ihLSBexbwSS
30
- fF+J5OWNuyHHCQp+kGPLtXJe2yUYyvSWDj3I2//Vk0VhNOIlaCS1+5/P3ZJThOtm
31
- zJUBI7h3HgovwRpcnmk2mXTmU4Zx/bCzX8EA6VY0khEvnmiq7S6eBF0H9qH8KyQ6
32
- EkVLpvmUDFcf/uNaBQdazEMB5jYtwoA8gQlANETNGPi51KlkukhKgaIEDMkBDJOx
33
- 65N7DzmkcyY0/GwjIVIxmRhcrCt1YeCUElmfFx0iida1/YRm6sB2AXqScc1+ECRi
34
- 2DND//YJUikn1zwbz1kT70XmHd97B4Eytpln7K+M1u2g1pHVEPW4owD/ammXNpUy
35
- nt70FcDD4yxJQ+0YNiHd0N8IcVBM1TMIVctMNQ==
27
+ c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBADD0/UuTTFgW+CGk2U0RDw2RBOca
28
+ W2LTF/G7AOzuzD0Tc4voc7WXyrgKwJREv8rgBimLnNlgmFJLmtUCh2U/MgxvcilH
29
+ yshYcbseNvjkrtYnLRlWZR4SSB6Zei5AlyGVQLPkvdsBpNegcG6w075YEwzX/38a
30
+ 8V9B/Yri2OGELBz8ykl7BsXUgNoUPA/4pHF6YRLz+VirOaUIQ4JfY7xGj6fSOWWz
31
+ /rQ/d77r6o1mfJYM/3BRVg73a3b7DmRnE5qjwmSaSQ7u802pJnLesmArch0xGCT/
32
+ fMmRli1Qb+6qOTl9mzD6UDMAyFR4t6MStLm0mIEqM0nBO5nUdUWbC7l9qXEf8XBE
33
+ 2DP28p3EqSuS+lKbAWKcqv7t0iRhhmaod+Yn9mcrLN1sa3q3KSQ9BCyxezCD4Mk2
34
+ R2P11bWoCtr70BsccVrN8jEhzwXngMyI2gVt750Y+dbTu1KgRqZKp/ECe7ZzPzXj
35
+ pIy9vHxTANKYVyI4qj8OrFdEM5BQNu8oQpL0iQ==
36
36
  -----END CERTIFICATE-----
37
- date: 2021-06-06 00:00:00.000000000 Z
37
+ date: 2021-11-28 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: concurrent-ruby
@@ -56,70 +56,70 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '0.8'
59
+ version: '0.13'
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: '0.8'
66
+ version: '0.13'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: dry-monitor
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: '0.3'
73
+ version: '0.5'
74
74
  type: :runtime
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: '0.3'
80
+ version: '0.5'
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: dry-validation
83
83
  requirement: !ruby/object:Gem::Requirement
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: '1.3'
87
+ version: '1.7'
88
88
  type: :runtime
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '1.3'
94
+ version: '1.7'
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: rdkafka
97
97
  requirement: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - ">="
100
100
  - !ruby/object:Gem::Version
101
- version: 0.6.0
101
+ version: '0.10'
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
- version: 0.6.0
108
+ version: '0.10'
109
109
  - !ruby/object:Gem::Dependency
110
110
  name: zeitwerk
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: '2.1'
115
+ version: '2.3'
116
116
  type: :runtime
117
117
  prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: '2.1'
122
+ version: '2.3'
123
123
  description: Kafka messaging made easy!
124
124
  email:
125
125
  - maciej@mensfeld.pl
@@ -129,7 +129,6 @@ extra_rdoc_files: []
129
129
  files:
130
130
  - ".coditsu/ci.yml"
131
131
  - ".diffend.yml"
132
- - ".github/FUNDING.yml"
133
132
  - ".github/workflows/ci.yml"
134
133
  - ".gitignore"
135
134
  - ".rspec"
@@ -138,7 +137,7 @@ files:
138
137
  - CHANGELOG.md
139
138
  - Gemfile
140
139
  - Gemfile.lock
141
- - LICENSE
140
+ - MIT-LICENSE
142
141
  - README.md
143
142
  - certs/mensfeld.pem
144
143
  - config/errors.yml
@@ -150,14 +149,20 @@ files:
150
149
  - lib/water_drop/contracts/message.rb
151
150
  - lib/water_drop/errors.rb
152
151
  - lib/water_drop/instrumentation.rb
152
+ - lib/water_drop/instrumentation/callbacks/delivery.rb
153
+ - lib/water_drop/instrumentation/callbacks/error.rb
154
+ - lib/water_drop/instrumentation/callbacks/statistics.rb
155
+ - lib/water_drop/instrumentation/callbacks/statistics_decorator.rb
156
+ - lib/water_drop/instrumentation/callbacks_manager.rb
153
157
  - lib/water_drop/instrumentation/monitor.rb
154
158
  - lib/water_drop/instrumentation/stdout_listener.rb
159
+ - lib/water_drop/patches/rdkafka/bindings.rb
160
+ - lib/water_drop/patches/rdkafka/producer.rb
155
161
  - lib/water_drop/producer.rb
156
162
  - lib/water_drop/producer/async.rb
157
163
  - lib/water_drop/producer/buffer.rb
158
164
  - lib/water_drop/producer/builder.rb
159
165
  - lib/water_drop/producer/dummy_client.rb
160
- - lib/water_drop/producer/statistics_decorator.rb
161
166
  - lib/water_drop/producer/status.rb
162
167
  - lib/water_drop/producer/sync.rb
163
168
  - lib/water_drop/version.rb
@@ -166,7 +171,7 @@ files:
166
171
  - waterdrop.gemspec
167
172
  homepage: https://github.com/karafka/waterdrop
168
173
  licenses:
169
- - LGPL-3.0
174
+ - MIT
170
175
  metadata: {}
171
176
  post_install_message:
172
177
  rdoc_options: []
@@ -183,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
188
  - !ruby/object:Gem::Version
184
189
  version: '0'
185
190
  requirements: []
186
- rubygems_version: 3.2.15
191
+ rubygems_version: 3.2.25
187
192
  signing_key:
188
193
  specification_version: 4
189
194
  summary: Kafka messaging made easy!
metadata.gz.sig CHANGED
Binary file
data/.github/FUNDING.yml DELETED
@@ -1 +0,0 @@
1
- open_collective: karafka