deimos-ruby 2.2.2 → 2.2.3.pre.beta2

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: ca14735549cff155e75b761beafaf9cc663da80a5b0cc5db9a7ad67934cb7276
4
- data.tar.gz: 302d52cf0d80701337ce576b55ff201ebce7968b37194070bdfe5f269901f51b
3
+ metadata.gz: bf4ddbfc7afab6d397364f0108d2eb845e2b646e8615783d2376b92edc34d380
4
+ data.tar.gz: 5f3a404983d2dfa8f0c5324d8ba4d728b1f976940b9242756d81fcc53a6a6cab
5
5
  SHA512:
6
- metadata.gz: b3044b241cb7dab960e1e394d1438c39fa0fda920db8ce57375ac9e864bd3698182b400886efbdd7057e8232dfbfafa02a97d8ab9313f1a6edf502360dbb5c14
7
- data.tar.gz: 8b1c0b604484db8425fd3f5dc57fc136d46ef2bbdfbc11027638f89b10db90088a0496ff00ea0022cd897b55fca16afe8daa86b5ca13f777aa3a2509b13fa5d5
6
+ metadata.gz: db87d1ed05ccae6430adfd1749902b319e53b7039f29512fb8335cceef4395e4ad26ad0a6437b87ec622f301923a3b27f9855471f3b8a1b5c5a86e4991d51dc0
7
+ data.tar.gz: 996d61652323b29bf40152ccb9fb71c74b050948bc1363b0d1a26191e8595240a20344b6256a0cfa6821ae31c7f1ee64501b54bfb071564bb06abc81e831a790
data/.gitignore CHANGED
@@ -41,3 +41,4 @@ test.sqlite3
41
41
 
42
42
  .idea
43
43
  /.gem_rbs_collection/
44
+ .claude
data/CHANGELOG.md CHANGED
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ - Feature: Support broker setting per topic in producer configs.
11
+
10
12
  # 2.2.2 - 2025-11-7
11
13
 
12
14
  - Fix: Calling `producer_classes` on a topic config could make all topics disappear. :(
@@ -6,7 +6,7 @@ module Deimos
6
6
  class Kafka < Base
7
7
  # :nodoc:
8
8
  def self.execute(producer_class:, messages:)
9
- Karafka.producer.produce_many_sync(messages)
9
+ Deimos.producer_for(producer_class.topic).produce_many_sync(messages)
10
10
  end
11
11
  end
12
12
  end
@@ -4,9 +4,10 @@ module Deimos
4
4
  module Backends
5
5
  # Backend which produces to Kafka via an async producer.
6
6
  class KafkaAsync < Base
7
+
7
8
  # :nodoc:
8
9
  def self.execute(producer_class:, messages:)
9
- Karafka.producer.produce_many_async(messages)
10
+ Deimos.producer_for(producer_class.topic).produce_many_async(messages)
10
11
  end
11
12
  end
12
13
  end
@@ -58,7 +58,9 @@ module Deimos
58
58
  end
59
59
  end
60
60
  Karafka::Setup::Config.setup if Karafka.producer.nil?
61
- Karafka.producer.monitor.subscribe(waterdrop_listener)
61
+ Deimos.waterdrop_producers.each do |producer|
62
+ producer.monitor.subscribe(waterdrop_listener)
63
+ end
62
64
  end
63
65
 
64
66
  # :nodoc:
@@ -16,6 +16,11 @@ module Deimos
16
16
  def self.included(base)
17
17
  super
18
18
  base.include Karafka::Testing::RSpec::Helpers
19
+ RSpec.configure do |config|
20
+ config.before(:each) do
21
+ allow(Deimos).to receive(:producer_for).and_return(Karafka.producer)
22
+ end
23
+ end
19
24
  end
20
25
 
21
26
  # @return [Array<Hash>]
@@ -207,7 +207,7 @@ module Deimos
207
207
 
208
208
  batch[current_index..-1].in_groups_of(batch_size, false).each do |group|
209
209
  @logger.debug("Publishing #{group.size} messages to #{@current_topic}")
210
- Karafka.producer.produce_many_sync(group)
210
+ Deimos.producer_for(@current_topic).produce_many_sync(group)
211
211
  current_index += group.size
212
212
  @logger.info("Sent #{group.size} messages to #{@current_topic}")
213
213
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Deimos
4
- VERSION = '2.2.2'
4
+ VERSION = '2.2.3-beta2'
5
5
  end
data/lib/deimos.rb CHANGED
@@ -142,23 +142,34 @@ module Deimos
142
142
  signal_handler.run!
143
143
  end
144
144
 
145
- def setup_karafka
146
- Karafka.producer.middleware.append(Deimos::ProducerMiddleware)
147
- # for multiple setup calls
148
- Karafka.producer.config.kafka =
149
- Karafka::Setup::AttributesMap.producer(Karafka::Setup::Config.config.kafka.dup)
150
- EVENT_TYPES.each { |type| Karafka.monitor.notifications_bus.register_event(type) }
151
-
152
- Karafka.producer.monitor.subscribe(ProducerMetricsListener.new)
145
+ def setup_producers
146
+ @producers = {}
147
+ producers_by_broker = {}
148
+ Deimos.karafka_configs.each do |topic|
149
+ broker = topic.kafka[:'bootstrap.servers']
150
+ producers_by_broker[broker] ||= ::WaterDrop::Producer.new do |p_config|
151
+ config_hash = Karafka::Setup::Config.config.kafka.merge(topic.kafka)
152
+ p_config.kafka = Karafka::Setup::AttributesMap.producer(config_hash)
153
+ end
154
+ @producers[topic.name] = producers_by_broker[broker]
155
+ end
156
+ end
153
157
 
154
- Karafka.producer.monitor.subscribe('error.occurred') do |event|
155
- if event.payload.key?(:messages)
156
- topic = event[:messages].first[:topic]
157
- config = Deimos.karafka_config_for(topic: topic)
158
- message = Deimos::Logging.messages_log_text(config&.payload_log, event[:messages])
159
- Karafka.logger.error("Error producing messages: #{event[:error].message} #{message.to_json}")
158
+ def setup_karafka
159
+ setup_producers
160
+ waterdrop_producers.each do |producer|
161
+ producer.middleware.append(Deimos::ProducerMiddleware)
162
+ producer.monitor.subscribe(ProducerMetricsListener.new)
163
+ producer.monitor.subscribe('error.occurred') do |event|
164
+ if event.payload.key?(:messages)
165
+ topic = event[:messages].first[:topic]
166
+ config = Deimos.karafka_config_for(topic: topic)
167
+ message = Deimos::Logging.messages_log_text(config&.payload_log, event[:messages])
168
+ Karafka.logger.error("Error producing messages: #{event[:error].message} #{message.to_json}")
169
+ end
160
170
  end
161
171
  end
172
+ EVENT_TYPES.each { |type| Karafka.monitor.notifications_bus.register_event(type) }
162
173
  end
163
174
 
164
175
  # @return [Array<Karafka::Routing::Topic]
@@ -176,7 +187,16 @@ module Deimos
176
187
  end
177
188
  end
178
189
 
179
- # @param handler_class [Class]
190
+ # @return [Array<::WaterDrop::Producer>]
191
+ def waterdrop_producers
192
+ (@producers.values + [Karafka.producer]).uniq
193
+ end
194
+
195
+ # @param topic [String]
196
+ def producer_for(topic)
197
+ @producers[topic] || Karafka.producer
198
+ end
199
+
180
200
  # @return [String,nil]
181
201
  def topic_for_consumer(handler_class)
182
202
  Deimos.karafka_configs.each do |topic|
data/spec/deimos_spec.rb CHANGED
@@ -50,4 +50,36 @@ describe Deimos do
50
50
  end
51
51
  end
52
52
 
53
+ specify '#producer_for' do
54
+ allow(described_class).to receive(:producer_for).and_call_original
55
+ Karafka::App.routes.redraw do
56
+ topic 'main-broker' do
57
+ active false
58
+ kafka({
59
+ 'bootstrap.servers': 'broker1:9092'
60
+ })
61
+ end
62
+ topic 'main-broker2' do
63
+ active false
64
+ kafka({
65
+ 'bootstrap.servers': 'broker1:9092'
66
+ })
67
+ end
68
+ topic 'other-broker' do
69
+ active false
70
+ kafka({
71
+ 'bootstrap.servers': 'broker2:9092'
72
+ })
73
+ end
74
+ end
75
+ described_class.setup_producers
76
+
77
+ producer1 = described_class.producer_for('main-broker')
78
+ producer2 = described_class.producer_for('main-broker2')
79
+ producer3 = described_class.producer_for('other-broker')
80
+ expect(producer1).to eq(producer2)
81
+ expect(producer1.config.kafka[:'bootstrap.servers']).to eq('broker1:9092')
82
+ expect(producer3.config.kafka[:'bootstrap.servers']).to eq('broker2:9092')
83
+ end
84
+
53
85
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deimos-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.2.3.pre.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
@@ -698,7 +698,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
698
698
  - !ruby/object:Gem::Version
699
699
  version: '0'
700
700
  requirements: []
701
- rubygems_version: 3.6.9
701
+ rubygems_version: 4.0.3
702
702
  specification_version: 4
703
703
  summary: Kafka libraries for Ruby.
704
704
  test_files: []