1
1
require 'logstash/namespace'
2
2
require 'logstash/outputs/base'
3
3
require 'java'
4
+ require 'concurrent/map'
4
5
require 'logstash-integration-kafka_jars.rb'
5
6
require 'logstash/plugin_mixins/kafka_support'
6
7
@@ -190,7 +191,7 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
190
191
191
192
public
192
193
def register
193
- @thread_batch_map = Concurrent ::Hash . new
194
+ @thread_batch_map = Concurrent ::Map . new
194
195
195
196
if !@retries . nil?
196
197
if @retries < 0
@@ -204,33 +205,29 @@ def register
204
205
@producer = create_producer
205
206
if value_serializer == 'org.apache.kafka.common.serialization.StringSerializer'
206
207
@codec . on_event do |event , data |
207
- write_to_kafka ( event , data )
208
+ push_event_data ( event , data )
208
209
end
209
210
elsif value_serializer == 'org.apache.kafka.common.serialization.ByteArraySerializer'
210
211
@codec . on_event do |event , data |
211
- write_to_kafka ( event , data . to_java_bytes )
212
+ push_event_data ( event , data . to_java_bytes )
212
213
end
213
214
else
214
215
raise ConfigurationError , "'value_serializer' only supports org.apache.kafka.common.serialization.ByteArraySerializer and org.apache.kafka.common.serialization.StringSerializer"
215
216
end
216
217
end
217
218
218
- def prepare ( record )
219
+ def append_record ( record )
219
220
# This output is threadsafe, so we need to keep a batch per thread.
220
- @thread_batch_map [ Thread . current ] . add ( record )
221
+ @thread_batch_map . get ( Thread . current ) << record
221
222
end
222
223
223
224
def multi_receive ( events )
224
- t = Thread . current
225
- if !@thread_batch_map . include? ( t )
226
- @thread_batch_map [ t ] = java . util . ArrayList . new ( events . size )
227
- end
225
+ batch = @thread_batch_map . fetch_or_store ( Thread . current ) { Array . new ( events . size ) . clear }
228
226
229
227
events . each do |event |
230
228
@codec . encode ( event )
231
229
end
232
230
233
- batch = @thread_batch_map [ t ]
234
231
if batch . any?
235
232
retrying_send ( batch )
236
233
batch . clear
@@ -314,13 +311,13 @@ def handle_kafka_error(e, record)
314
311
end
315
312
end
316
313
317
- def write_to_kafka ( event , serialized_data )
314
+ def push_event_data ( event , serialized_data )
318
315
if @message_key . nil?
319
316
record = ProducerRecord . new ( event . sprintf ( @topic_id ) , serialized_data )
320
317
else
321
318
record = ProducerRecord . new ( event . sprintf ( @topic_id ) , event . sprintf ( @message_key ) , serialized_data )
322
319
end
323
- prepare ( record )
320
+ append_record ( record )
324
321
rescue LogStash ::ShutdownSignal
325
322
logger . debug ( 'producer received shutdown signal' )
326
323
rescue => e
0 commit comments