logstash-integration-kafka 11.3.3-java → 11.4.0-java

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: b779dc371104b0d12e9c0653c3503c316da6c283f240a48d9e93af8aab1a6657
4
- data.tar.gz: 5cc97ac62bf631856947cab6f408bff40f39d77b038fd169445cca102a54beb2
3
+ metadata.gz: fa23de31ba8ec88920997f731d28d11e68148b0179b85abeddcfc999f9e96bcf
4
+ data.tar.gz: bed04421d5654eb1cb3774c60e0a2989be5d79edf537ec1c23ca5c70bedfec82
5
5
  SHA512:
6
- metadata.gz: e6f4198f56a1f964db493573fa8b66a89f6c869885b43b964e43c947f1e81906eac078be550d8d1e32a59f1f5d7b89428adba125dfc4324fbb7fc0075382b3dd
7
- data.tar.gz: f27c13d89ebe188e952177dbab113cdc9748b40c854d044a51be94ca69ec636627256e79e403bfac4e32300affbd1176381accc40cb7ee3c5740b51127bfffca
6
+ metadata.gz: 38688f3130feb2ad66bef528007250d98adb28d9d8f3ab1df3817c894dceadbadbd7fa6a62f98b046c97b79089dcaadabda9f05b1663d58249e1f4e37fa845c0
7
+ data.tar.gz: 618a06ed2dd6c15c05f76e293ac83dd226e9b5d60876f35f58027468a8701468c0dcf4b621fdadb245697211ea7cde9d498af0f7123e0ab0c7299d229cd95c2d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 11.4.0
2
+ - Add support for setting Kafka message headers in output plugin [#162](https://github.com/logstash-plugins/logstash-integration-kafka/pull/162)
3
+
4
+ ## 11.3.4
5
+ - Fix "retries" and "value_serializer" error handling in output plugin (#160) [#160](https://github.com/logstash-plugins/logstash-integration-kafka/pull/160)
6
+
1
7
  ## 11.3.3
2
8
  - Fix "Can't modify frozen string" error when record value is `nil` (tombstones) [#155](https://github.com/logstash-plugins/logstash-integration-kafka/pull/155)
3
9
 
@@ -91,6 +91,7 @@ See the https://kafka.apache.org/{kafka_client_doc}/documentation for more detai
91
91
  | <<plugins-{type}s-{plugin}-key_serializer>> |<<string,string>>|No
92
92
  | <<plugins-{type}s-{plugin}-linger_ms>> |<<number,number>>|No
93
93
  | <<plugins-{type}s-{plugin}-max_request_size>> |<<number,number>>|No
94
+ | <<plugins-{type}s-{plugin}-message_header>> |<<hash,hash>>|No
94
95
  | <<plugins-{type}s-{plugin}-message_key>> |<<string,string>>|No
95
96
  | <<plugins-{type}s-{plugin}-metadata_fetch_timeout_ms>> |<<number,number>>|No
96
97
  | <<plugins-{type}s-{plugin}-metadata_max_age_ms>> |<<number,number>>|No
@@ -184,7 +185,7 @@ resolved and expanded into a list of canonical names.
184
185
  [NOTE]
185
186
  ====
186
187
  Starting from Kafka 3 `default` value for `client.dns.lookup` value has been removed.
187
- If explicitly configured it fallbacks to `use_all_dns_ips`.
188
+ If not explicitly configured it defaults to `use_all_dns_ips`.
188
189
  ====
189
190
 
190
191
  [id="plugins-{type}s-{plugin}-client_id"]
@@ -275,6 +276,22 @@ to allow other records to be sent so that the sends can be batched together.
275
276
 
276
277
  The maximum size of a request
277
278
 
279
+ [id="plugins-{type}s-{plugin}-message_headers"]
280
+ ===== `message_headers`
281
+
282
+ * Value type is <<hash,hash>>
283
+ ** Keys are header names, and must be <<string,string>>
284
+ ** Values are header values, and must be <<string,string>>
285
+ ** Values support interpolation from event field values
286
+ * There is no default value for this setting.
287
+
288
+ A map of key value pairs, each corresponding to a header name and its value respectively.
289
+ Example:
290
+ [source,ruby]
291
+ ----------------------------------
292
+ message_header => { "event_timestamp" => "%{@timestamp}" }
293
+ ----------------------------------
294
+
278
295
  [id="plugins-{type}s-{plugin}-message_key"]
279
296
  ===== `message_key`
280
297
 
@@ -348,7 +365,7 @@ retries are exhausted.
348
365
  * There is no default value for this setting.
349
366
 
350
367
  The default retry behavior is to retry until successful. To prevent data loss,
351
- the use of this setting is discouraged.
368
+ changing this setting is discouraged.
352
369
 
353
370
  If you choose to set `retries`, a value greater than zero will cause the
354
371
  client to only retry a fixed number of times. This will result in data loss
@@ -106,6 +106,8 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
106
106
  config :max_request_size, :validate => :number, :default => 1_048_576 # (1MB) Kafka default
107
107
  # The key for the message
108
108
  config :message_key, :validate => :string
109
+ # Headers added to kafka message in the form of key-value pairs
110
+ config :message_headers, :validate => :hash, :default => {}
109
111
  # the timeout setting for initial metadata request to fetch topic metadata.
110
112
  config :metadata_fetch_timeout_ms, :validate => :number, :default => 60_000
111
113
  # Partitioner to use - can be `default`, `uniform_sticky`, `round_robin` or a fully qualified class name of a custom partitioner.
@@ -185,7 +187,7 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
185
187
 
186
188
  if !@retries.nil?
187
189
  if @retries < 0
188
- raise ConfigurationError, "A negative retry count (#{@retries}) is not valid. Must be a value >= 0"
190
+ raise LogStash::ConfigurationError, "A negative retry count (#{@retries}) is not valid. Must be a value >= 0"
189
191
  end
190
192
 
191
193
  logger.warn("Kafka output is configured with finite retry. This instructs Logstash to LOSE DATA after a set number of send attempts fails. If you do not want to lose data if Kafka is down, then you must remove the retry setting.", :retries => @retries)
@@ -193,7 +195,6 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
193
195
 
194
196
  reassign_dns_lookup
195
197
 
196
- @producer = create_producer
197
198
  if value_serializer == 'org.apache.kafka.common.serialization.StringSerializer'
198
199
  @codec.on_event do |event, data|
199
200
  write_to_kafka(event, data)
@@ -203,8 +204,14 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
203
204
  write_to_kafka(event, data.to_java_bytes)
204
205
  end
205
206
  else
206
- raise ConfigurationError, "'value_serializer' only supports org.apache.kafka.common.serialization.ByteArraySerializer and org.apache.kafka.common.serialization.StringSerializer"
207
+ raise LogStash::ConfigurationError, "'value_serializer' only supports org.apache.kafka.common.serialization.ByteArraySerializer and org.apache.kafka.common.serialization.StringSerializer"
208
+ end
209
+ @message_headers.each do |key, value|
210
+ if !key.is_a? String
211
+ raise LogStash::ConfigurationError, "'message_headers' contains a key that is not a string!"
212
+ end
207
213
  end
214
+ @producer = create_producer
208
215
  end
209
216
 
210
217
  def prepare(record)
@@ -315,6 +322,9 @@ class LogStash::Outputs::Kafka < LogStash::Outputs::Base
315
322
  else
316
323
  record = ProducerRecord.new(event.sprintf(@topic_id), event.sprintf(@message_key), serialized_data)
317
324
  end
325
+ @message_headers.each do |key, value|
326
+ record.headers().add(key, event.sprintf(value).to_java_bytes)
327
+ end
318
328
  prepare(record)
319
329
  rescue LogStash::ShutdownSignal
320
330
  logger.debug('producer received shutdown signal')
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-integration-kafka'
3
- s.version = '11.3.3'
3
+ s.version = '11.4.0'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = "Integration with Kafka - input and output plugins"
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline "+
@@ -191,6 +191,25 @@ describe "outputs/kafka", :integration => true do
191
191
  end
192
192
  end
193
193
 
194
+ context 'when setting message_headers' do
195
+ let(:num_events) { 10 }
196
+ let(:test_topic) { 'logstash_integration_topic4' }
197
+
198
+ before :each do
199
+ config = base_config.merge({"topic_id" => test_topic, "message_headers" => {"event_timestamp" => "%{@timestamp}"}})
200
+ load_kafka_data(config)
201
+ end
202
+
203
+ it 'messages should contain headers' do
204
+ messages = fetch_messages(test_topic)
205
+
206
+ expect(messages.size).to eq(num_events)
207
+ messages.each do |m|
208
+ expect(m.headers).to eq({"event_timestamp" => LogStash::Timestamp.at(0).to_s})
209
+ end
210
+ end
211
+ end
212
+
194
213
  context 'setting partitioner' do
195
214
  let(:test_topic) { 'logstash_integration_partitioner_topic' }
196
215
  let(:partitioner) { nil }
@@ -60,6 +60,16 @@ describe "outputs/kafka" do
60
60
  kafka.multi_receive([event])
61
61
  end
62
62
 
63
+ it 'should support field referenced message_headers' do
64
+ expect(org.apache.kafka.clients.producer.ProducerRecord).to receive(:new).
65
+ with("test", event.to_s).and_call_original
66
+ expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
67
+ expect_any_instance_of(org.apache.kafka.common.header.internals.RecordHeaders).to receive(:add).with("host","172.0.0.1".to_java_bytes).and_call_original
68
+ kafka = LogStash::Outputs::Kafka.new(simple_kafka_config.merge({"message_headers" => { "host" => "%{host}"}}))
69
+ kafka.register
70
+ kafka.multi_receive([event])
71
+ end
72
+
63
73
  it 'should not raise config error when truststore location is not set and ssl is enabled' do
64
74
  kafka = LogStash::Outputs::Kafka.new(simple_kafka_config.merge("security_protocol" => "SSL"))
65
75
  expect(org.apache.kafka.clients.producer.KafkaProducer).to receive(:new)
@@ -221,6 +231,26 @@ describe "outputs/kafka" do
221
231
  kafka.multi_receive([event])
222
232
  end
223
233
  end
234
+ context 'when retries is -1' do
235
+ let(:retries) { -1 }
236
+
237
+ it "should raise a Configuration error" do
238
+ kafka = LogStash::Outputs::Kafka.new(simple_kafka_config.merge("retries" => retries))
239
+ expect { kafka.register }.to raise_error(LogStash::ConfigurationError)
240
+ end
241
+ end
242
+ end
243
+
244
+ describe "value_serializer" do
245
+ let(:output) { LogStash::Plugin.lookup("output", "kafka").new(config) }
246
+
247
+ context "when a random string is set" do
248
+ let(:config) { { "topic_id" => "random", "value_serializer" => "test_string" } }
249
+
250
+ it "raises a ConfigurationError" do
251
+ expect { output.register }.to raise_error(LogStash::ConfigurationError)
252
+ end
253
+ end
224
254
  end
225
255
 
226
256
  context 'when ssl endpoint identification disabled' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-integration-kafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.3.3
4
+ version: 11.4.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-09 00:00:00.000000000 Z
11
+ date: 2024-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement