sbmt-kafka_consumer 2.3.1 → 2.4.1

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: 903e47e49b20391d11feb8f0f278b52ff6e765daa3a5fa27b50e7e673612d5db
4
- data.tar.gz: 95c9e87e8a1dde1c85d1266166694e0b06d82c645cd5affcb4f06200bb66d4af
3
+ metadata.gz: 3d328765bacde07e4c62f2a9844bb22ab61192ee180d2837a4fdfd1a5e4258dd
4
+ data.tar.gz: a7b441d6e0a6d2aa29b1e1e3e8474cc0076463b00b56697b8b3cccc204567a14
5
5
  SHA512:
6
- metadata.gz: 40aef0b43f7e39c7f61c32a2bd226893988970ad9d0be02692c12fdfaae06553d56d0464aff307b3a01445c0e683f90eb219768289aedea6423671a2f6e06136
7
- data.tar.gz: 6fe8bc839e28521bc8795aca004e3dbc0f79bda8d18c2844c01e3ac9d12bdbccb29be894dff8b5ddeb073ae7bcf7e20cfb189b76a2c349aada1457a4f8f857ae
6
+ metadata.gz: 61ecdb8df804c1fa008bb1421037f1f96c062d3ec3fb1ac3034ef0a45bfa9641e2bfef4b9bee364597781436e852661a3e04375a3c9236199e557c5abce521d5
7
+ data.tar.gz: 4eb7926ffb74c3423c0d83a0066ba33d35e6f0f722e93c2dff9f4f953dc7c5988953e5cd55ca5ed71084ee3834c4a8530c940f550a1be88d140c01b82102bc9f
data/CHANGELOG.md CHANGED
@@ -13,6 +13,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
13
13
 
14
14
  ### Fixed
15
15
 
16
+ ## [2.4.1] - 2024-06-15
17
+
18
+ ### Fixed
19
+
20
+ - Fixed display of metrics `kafka_api_calls` and `kafka_api_errors`
21
+
22
+ ## [2.4.0] - 2024-06-06
23
+
24
+ ### Added
25
+
26
+ - Added option `midlewares` to add middleware before message processing
27
+
16
28
  ## [2.3.1] - 2024-06-05
17
29
 
18
30
  ### Fixed
data/README.md CHANGED
@@ -183,12 +183,45 @@ consumer_groups:
183
183
  #### `consumer.init_attrs` options for `BaseConsumer`
184
184
 
185
185
  - `skip_on_error` - optional, default false, omit consumer errors in message processing and commit the offset to Kafka
186
+ - `middlewares` - optional, default [], type String, add middleware before message processing
187
+
188
+ ```yaml
189
+ init_attrs:
190
+ middlewares: ['SomeMiddleware']
191
+ ```
192
+
193
+ ```ruby
194
+ class SomeMiddleware
195
+ def call(message)
196
+ yield if message.payload.id.to_i % 2 == 0
197
+ end
198
+ end
199
+ ```
200
+ __CAUTION__:
201
+ - ⚠️ `yield` is mandatory for all middleware, as it returns control to the `process_message` method.
186
202
 
187
203
  #### `consumer.init_attrs` options for `InboxConsumer`
188
204
 
189
205
  - `inbox_item` - required, name of the inbox item class
190
206
  - `event_name` - optional, default nil, used when the inbox item keep several event types
191
207
  - `skip_on_error` - optional, default false, omit consumer errors in message processing and commit the offset to Kafka
208
+ - `middlewares` - optional, default [], type String, add middleware before message processing
209
+
210
+ ```yaml
211
+ init_attrs:
212
+ middlewares: ['SomeMiddleware']
213
+ ```
214
+
215
+ ```ruby
216
+ class SomeMiddleware
217
+ def call(message)
218
+ yield if message.payload.id.to_i % 2 == 0
219
+ end
220
+ end
221
+ ```
222
+ __CAUTION__:
223
+ - ⚠️ `yield` is mandatory for all middleware, as it returns control to the `process_message` method.
224
+ - ⚠️ Doesn't work with `process_batch`.
192
225
 
193
226
  #### `deserializer.init_attrs` options
194
227
 
@@ -5,9 +5,10 @@ module Sbmt
5
5
  class BaseConsumer < Karafka::BaseConsumer
6
6
  attr_reader :trace_id
7
7
 
8
- def self.consumer_klass(skip_on_error: false)
8
+ def self.consumer_klass(skip_on_error: false, middlewares: [])
9
9
  Class.new(self) do
10
10
  const_set(:SKIP_ON_ERROR, skip_on_error)
11
+ const_set(:MIDDLEWARES, middlewares.map(&:constantize))
11
12
 
12
13
  def self.name
13
14
  superclass.name
@@ -93,7 +94,7 @@ module Sbmt
93
94
  # so we trigger it explicitly to catch undeserializable message early
94
95
  message.payload
95
96
 
96
- process_message(message)
97
+ call_middlewares(message, middlewares) { process_message(message) }
97
98
 
98
99
  mark_as_consumed!(message)
99
100
  end
@@ -102,6 +103,10 @@ module Sbmt
102
103
  self.class::SKIP_ON_ERROR
103
104
  end
104
105
 
106
+ def middlewares
107
+ self.class::MIDDLEWARES
108
+ end
109
+
105
110
  # can be overridden in consumer to enable message logging
106
111
  def log_payload?
107
112
  false
@@ -132,6 +137,21 @@ module Sbmt
132
137
  def message_payload(message)
133
138
  message.payload || message.raw_payload
134
139
  end
140
+
141
+ def call_middlewares(message, middlewares)
142
+ return yield if middlewares.empty?
143
+
144
+ chain = middlewares.map { |middleware_class| middleware_class.new }
145
+
146
+ traverse_chain = proc do
147
+ if chain.empty?
148
+ yield
149
+ else
150
+ chain.shift.call(message, &traverse_chain)
151
+ end
152
+ end
153
+ traverse_chain.call
154
+ end
135
155
  end
136
156
  end
137
157
  end
@@ -6,11 +6,12 @@ module Sbmt
6
6
  IDEMPOTENCY_HEADER_NAME = "Idempotency-Key"
7
7
  DEFAULT_SOURCE = "KAFKA"
8
8
 
9
- def self.consumer_klass(inbox_item:, event_name: nil, skip_on_error: false, name: nil)
9
+ def self.consumer_klass(inbox_item:, event_name: nil, skip_on_error: false, name: nil, middlewares: [])
10
10
  Class.new(self) do
11
11
  const_set(:INBOX_ITEM_CLASS_NAME, inbox_item)
12
12
  const_set(:EVENT_NAME, event_name)
13
13
  const_set(:SKIP_ON_ERROR, skip_on_error)
14
+ const_set(:MIDDLEWARES, middlewares.map(&:constantize))
14
15
 
15
16
  def self.name
16
17
  superclass.name
@@ -129,7 +129,7 @@ module Sbmt
129
129
  }
130
130
 
131
131
  Yabeda.kafka_api.calls
132
- .increment(broker_tags, by: broker_statistics["tx"])
132
+ .increment(broker_tags, by: broker_statistics["tx_d"])
133
133
  Yabeda.kafka_api.latency
134
134
  .measure(broker_tags, broker_statistics["rtt"]["avg"])
135
135
  Yabeda.kafka_api.request_size
@@ -137,7 +137,7 @@ module Sbmt
137
137
  Yabeda.kafka_api.response_size
138
138
  .measure(broker_tags, broker_statistics["rxbytes"])
139
139
  Yabeda.kafka_api.errors
140
- .increment(broker_tags, by: broker_statistics["txerrs"] + broker_statistics["rxerrs"])
140
+ .increment(broker_tags, by: broker_statistics["txerrs_d"] + broker_statistics["rxerrs_d"])
141
141
  end
142
142
  end
143
143
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sbmt
4
4
  module KafkaConsumer
5
- VERSION = "2.3.1"
5
+ VERSION = "2.4.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sbmt-kafka_consumer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sbermarket Ruby-Platform Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-05 00:00:00.000000000 Z
11
+ date: 2024-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails