waterdrop 2.0.1 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -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