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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/ci.yml +7 -3
- data/.ruby-version +1 -1
- data/CHANGELOG.md +33 -0
- data/Gemfile.lock +31 -34
- data/MIT-LICENSE +18 -0
- data/README.md +101 -33
- data/certs/mensfeld.pem +21 -21
- data/docker-compose.yml +2 -1
- data/lib/water_drop/config.rb +43 -8
- data/lib/water_drop/contracts/message.rb +1 -0
- data/lib/water_drop/instrumentation/callbacks/delivery.rb +30 -0
- data/lib/water_drop/instrumentation/callbacks/error.rb +35 -0
- data/lib/water_drop/instrumentation/callbacks/statistics.rb +41 -0
- data/lib/water_drop/instrumentation/callbacks/statistics_decorator.rb +77 -0
- data/lib/water_drop/instrumentation/callbacks_manager.rb +35 -0
- data/lib/water_drop/instrumentation/monitor.rb +8 -2
- data/lib/water_drop/instrumentation.rb +14 -0
- data/lib/water_drop/patches/rdkafka/bindings.rb +42 -0
- data/lib/water_drop/patches/rdkafka/producer.rb +20 -0
- data/lib/water_drop/producer/builder.rb +7 -42
- data/lib/water_drop/producer.rb +22 -3
- data/lib/water_drop/version.rb +1 -1
- data/lib/water_drop.rb +6 -0
- data/waterdrop.gemspec +6 -6
- data.tar.gz.sig +0 -0
- metadata +43 -38
- metadata.gz.sig +0 -0
- data/.github/FUNDING.yml +0 -1
- data/LICENSE +0 -165
- data/lib/water_drop/producer/statistics_decorator.rb +0 -71
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/water_drop/producer.rb
CHANGED
@@ -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
|
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(
|
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
|
-
|
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
|
data/lib/water_drop/version.rb
CHANGED
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 = '
|
17
|
+
spec.license = 'MIT'
|
18
18
|
|
19
19
|
spec.add_dependency 'concurrent-ruby', '>= 1.1'
|
20
|
-
spec.add_dependency 'dry-configurable', '~> 0.
|
21
|
-
spec.add_dependency 'dry-monitor', '~> 0.
|
22
|
-
spec.add_dependency 'dry-validation', '~> 1.
|
23
|
-
spec.add_dependency 'rdkafka', '>= 0.
|
24
|
-
spec.add_dependency 'zeitwerk', '~> 2.
|
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.
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
-
-
|
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.
|
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
|