waterdrop 2.6.9 → 2.6.10

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 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