waterdrop 2.6.9 → 2.6.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4811e6ec1f3cbea82e4604e95b9cd3deddce9337e9fd935f786bd97d008e914
4
- data.tar.gz: baf54ded0ca2e0ec90e659c199138a36932cd5e2f8d6afffbfdb6b770ebbd29c
3
+ metadata.gz: f8108bc92f548809ab7220d8d36a03ceb72e283dd651d2d2fc0629bb81a36fc8
4
+ data.tar.gz: a9bbb98af4e8b1425082fd5816e1441c91a263acabbeb987b75d7d598fe72d8c
5
5
  SHA512:
6
- metadata.gz: 4b2b33cfd43d78ae534c14780accb6193a6ec6ff930168c7c7e2813eb9e2599702c2db923b05793a7366f236e9d51250b07894c7cb11b8f1eca81cb79bafa3b7
7
- data.tar.gz: bde20c38e6ebbac05db6085381928516c050512adffd9a4a36a14c80edfed9788b8375edc1e058f38d809cf7862d742f4116fe94efca6fddc5bb0242d4ba216f
6
+ metadata.gz: 3e11745fc2986fcdc1ac8c5b4a8f4eeeb71c812b961eb296585e71d12d3601e9fcf124ad02d219db049f774a6417f6a293ce9cf5ce282ff5b70a05067fd310ec
7
+ data.tar.gz: 9488e3cf3753077bf790dbbd815889214dc0e66a4de871e460dd25a287ee3df309a14eed28969bf41cc77c76b4b3eaa64cd2c44a8f8f1556d78828cdf0a08659
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # WaterDrop changelog
2
2
 
3
+ ## 2.6.10 (2023-10-24)
4
+ - [Improvement] Introduce `message.purged` event to indicate that a message that was not delivered to Kafka was purged. This most of the time refers to messages that were part of a transaction and were not yet dispatched to Kafka. It always means, that given message was not delivered but in case of transactions it is expected. In case of non-transactional it usually means `#purge` usage or exceeding `message.timeout.ms` so `librdkafka` removes this message from its internal queue. Non-transactional producers do **not** use this and pipe purges to `error.occurred`.
5
+ - [Fix] Fix a case where `message.acknowledged` would not have `caller` key.
6
+ - [Fix] Fix a bug where critical errors (like `IRB::Abort`) would not abort the ongoing transaction.
7
+
3
8
  ## 2.6.9 (2023-10-23)
4
9
  - [Improvement] Introduce a `transaction.finished` event to indicate that transaction has finished whether it was aborted or committed.
5
10
  - [Improvement] Use `transaction.committed` event to indicate that transaction has been committed.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- waterdrop (2.6.9)
4
+ waterdrop (2.6.10)
5
5
  karafka-core (>= 2.2.3, < 3.0.0)
6
6
  zeitwerk (~> 2.3)
7
7
 
@@ -19,6 +19,7 @@ module WaterDrop
19
19
  # callbacks manager to make it work
20
20
  client.delivery_callback = Instrumentation::Callbacks::Delivery.new(
21
21
  producer.id,
22
+ producer.transactional?,
22
23
  producer.config.monitor
23
24
  )
24
25
 
@@ -6,19 +6,41 @@ module WaterDrop
6
6
  # Creates a callable that we want to run upon each message delivery or failure
7
7
  #
8
8
  # @note We don't have to provide client_name here as this callback is per client instance
9
+ #
10
+ # @note We do not consider `message.purge` as an error for transactional producers, because
11
+ # this is a standard behaviour for not yet dispatched messages on aborted transactions.
12
+ # We do however still want to instrument it for traceability.
9
13
  class Delivery
14
+ # Error emitted when a message was not yet dispatched and was purged from the queue
15
+ RD_KAFKA_RESP_PURGE_QUEUE = -152
16
+
17
+ # Error emitted when a message was purged while it was dispatched
18
+ RD_KAFKA_RESP_PURGE_INFLIGHT = -151
19
+
20
+ # Errors related to queue purging that is expected in transactions
21
+ PURGE_ERRORS = [RD_KAFKA_RESP_PURGE_INFLIGHT, RD_KAFKA_RESP_PURGE_QUEUE].freeze
22
+
23
+ private_constant :RD_KAFKA_RESP_PURGE_QUEUE, :RD_KAFKA_RESP_PURGE_INFLIGHT, :PURGE_ERRORS
24
+
10
25
  # @param producer_id [String] id of the current producer
26
+ # @param transactional [Boolean] is this handle for a transactional or regular producer
11
27
  # @param monitor [WaterDrop::Instrumentation::Monitor] monitor we are using
12
- def initialize(producer_id, monitor)
28
+ def initialize(producer_id, transactional, monitor)
13
29
  @producer_id = producer_id
30
+ @transactional = transactional
14
31
  @monitor = monitor
15
32
  end
16
33
 
17
34
  # Emits delivery details to the monitor
18
35
  # @param delivery_report [Rdkafka::Producer::DeliveryReport] delivery report
19
36
  def call(delivery_report)
20
- if delivery_report.error.to_i.zero?
37
+ error_code = delivery_report.error.to_i
38
+
39
+ if error_code.zero?
21
40
  instrument_acknowledged(delivery_report)
41
+
42
+ elsif @transactional && PURGE_ERRORS.include?(error_code)
43
+ instrument_purged(delivery_report)
22
44
  else
23
45
  instrument_error(delivery_report)
24
46
  end
@@ -27,24 +49,24 @@ module WaterDrop
27
49
  private
28
50
 
29
51
  # @param delivery_report [Rdkafka::Producer::DeliveryReport] delivery report
30
- def instrument_error(delivery_report)
52
+ def instrument_acknowledged(delivery_report)
31
53
  @monitor.instrument(
32
- 'error.occurred',
54
+ 'message.acknowledged',
33
55
  caller: self,
34
- error: ::Rdkafka::RdkafkaError.new(delivery_report.error),
35
56
  producer_id: @producer_id,
36
57
  offset: delivery_report.offset,
37
58
  partition: delivery_report.partition,
38
59
  topic: delivery_report.topic_name,
39
- delivery_report: delivery_report,
40
- type: 'librdkafka.dispatch_error'
60
+ delivery_report: delivery_report
41
61
  )
42
62
  end
43
63
 
44
64
  # @param delivery_report [Rdkafka::Producer::DeliveryReport] delivery report
45
- def instrument_acknowledged(delivery_report)
65
+ def instrument_purged(delivery_report)
46
66
  @monitor.instrument(
47
- 'message.acknowledged',
67
+ 'message.purged',
68
+ caller: self,
69
+ error: build_error(delivery_report),
48
70
  producer_id: @producer_id,
49
71
  offset: delivery_report.offset,
50
72
  partition: delivery_report.partition,
@@ -52,6 +74,28 @@ module WaterDrop
52
74
  delivery_report: delivery_report
53
75
  )
54
76
  end
77
+
78
+ # @param delivery_report [Rdkafka::Producer::DeliveryReport] delivery report
79
+ def instrument_error(delivery_report)
80
+ @monitor.instrument(
81
+ 'error.occurred',
82
+ caller: self,
83
+ error: build_error(delivery_report),
84
+ producer_id: @producer_id,
85
+ offset: delivery_report.offset,
86
+ partition: delivery_report.partition,
87
+ topic: delivery_report.topic_name,
88
+ delivery_report: delivery_report,
89
+ type: 'librdkafka.dispatch_error'
90
+ )
91
+ end
92
+
93
+ # Builds appropriate rdkafka error
94
+ # @param delivery_report [Rdkafka::Producer::DeliveryReport] delivery report
95
+ # @return [::Rdkafka::RdkafkaError]
96
+ def build_error(delivery_report)
97
+ ::Rdkafka::RdkafkaError.new(delivery_report.error)
98
+ end
55
99
  end
56
100
  end
57
101
  end
@@ -12,6 +12,7 @@ module WaterDrop
12
12
  message.produced_async
13
13
  message.produced_sync
14
14
  message.acknowledged
15
+ message.purged
15
16
  message.buffered
16
17
 
17
18
  messages.produced_async
@@ -3,5 +3,5 @@
3
3
  # WaterDrop library
4
4
  module WaterDrop
5
5
  # Current WaterDrop version
6
- VERSION = '2.6.9'
6
+ VERSION = '2.6.10'
7
7
  end
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.6.9
4
+ version: 2.6.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -35,7 +35,7 @@ cert_chain:
35
35
  AnG1dJU+yL2BK7vaVytLTstJME5mepSZ46qqIJXMuWob/YPDmVaBF39TDSG9e34s
36
36
  msG3BiCqgOgHAnL23+CN3Rt8MsuRfEtoTKpJVcCfoEoNHOkc
37
37
  -----END CERTIFICATE-----
38
- date: 2023-10-23 00:00:00.000000000 Z
38
+ date: 2023-10-24 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: karafka-core
metadata.gz.sig CHANGED
Binary file