logstash-integration-kafka 10.0.1-java → 10.5.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTORS +2 -0
- data/LICENSE +199 -10
- data/docs/index.asciidoc +1 -1
- data/docs/input-kafka.asciidoc +118 -70
- data/docs/output-kafka.asciidoc +68 -23
- data/lib/logstash-integration-kafka_jars.rb +3 -3
- data/lib/logstash/inputs/kafka.rb +90 -54
- data/lib/logstash/outputs/kafka.rb +83 -45
- data/logstash-integration-kafka.gemspec +2 -2
- data/spec/integration/inputs/kafka_spec.rb +81 -112
- data/spec/integration/outputs/kafka_spec.rb +89 -72
- data/spec/unit/inputs/kafka_spec.rb +63 -1
- data/spec/unit/outputs/kafka_spec.rb +62 -9
- data/vendor/jar-dependencies/com/github/luben/zstd-jni/1.4.3-1/zstd-jni-1.4.3-1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/kafka/kafka-clients/2.4.1/kafka-clients-2.4.1.jar +0 -0
- data/vendor/jar-dependencies/org/slf4j/slf4j-api/1.7.28/slf4j-api-1.7.28.jar +0 -0
- metadata +6 -6
- data/vendor/jar-dependencies/com/github/luben/zstd-jni/1.4.2-1/zstd-jni-1.4.2-1.jar +0 -0
- data/vendor/jar-dependencies/org/apache/kafka/kafka-clients/2.3.0/kafka-clients-2.3.0.jar +0 -0
- data/vendor/jar-dependencies/org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar +0 -0
@@ -3,26 +3,29 @@
|
|
3
3
|
require "logstash/devutils/rspec/spec_helper"
|
4
4
|
require 'logstash/outputs/kafka'
|
5
5
|
require 'json'
|
6
|
-
require '
|
6
|
+
require 'kafka'
|
7
7
|
|
8
8
|
describe "outputs/kafka", :integration => true do
|
9
9
|
let(:kafka_host) { 'localhost' }
|
10
10
|
let(:kafka_port) { 9092 }
|
11
11
|
let(:num_events) { 10 }
|
12
|
+
|
12
13
|
let(:base_config) { {'client_id' => 'kafkaoutputspec'} }
|
13
|
-
let(:
|
14
|
+
let(:message_content) do
|
15
|
+
'"GET /scripts/netcat-webserver HTTP/1.1" 200 182 "-" "Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)"'
|
16
|
+
end
|
17
|
+
let(:event) do
|
18
|
+
LogStash::Event.new({ 'message' =>
|
19
|
+
'183.60.215.50 - - [11/Sep/2014:22:00:00 +0000] ' + message_content,
|
20
|
+
'@timestamp' => LogStash::Timestamp.at(0)
|
21
|
+
})
|
22
|
+
end
|
14
23
|
|
24
|
+
let(:kafka_client) { Kafka.new ["#{kafka_host}:#{kafka_port}"] }
|
15
25
|
|
16
26
|
context 'when outputting messages serialized as String' do
|
17
27
|
let(:test_topic) { 'logstash_integration_topic1' }
|
18
28
|
let(:num_events) { 3 }
|
19
|
-
let(:consumer) do
|
20
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
21
|
-
test_topic, 0, :earliest_offset)
|
22
|
-
end
|
23
|
-
subject do
|
24
|
-
consumer.fetch
|
25
|
-
end
|
26
29
|
|
27
30
|
before :each do
|
28
31
|
config = base_config.merge({"topic_id" => test_topic})
|
@@ -30,8 +33,10 @@ describe "outputs/kafka", :integration => true do
|
|
30
33
|
end
|
31
34
|
|
32
35
|
it 'should have data integrity' do
|
33
|
-
|
34
|
-
|
36
|
+
messages = fetch_messages(test_topic)
|
37
|
+
|
38
|
+
expect(messages.size).to eq(num_events)
|
39
|
+
messages.each do |m|
|
35
40
|
expect(m.value).to eq(event.to_s)
|
36
41
|
end
|
37
42
|
end
|
@@ -41,13 +46,6 @@ describe "outputs/kafka", :integration => true do
|
|
41
46
|
context 'when outputting messages serialized as Byte Array' do
|
42
47
|
let(:test_topic) { 'topic1b' }
|
43
48
|
let(:num_events) { 3 }
|
44
|
-
let(:consumer) do
|
45
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
46
|
-
test_topic, 0, :earliest_offset)
|
47
|
-
end
|
48
|
-
subject do
|
49
|
-
consumer.fetch
|
50
|
-
end
|
51
49
|
|
52
50
|
before :each do
|
53
51
|
config = base_config.merge(
|
@@ -60,8 +58,10 @@ describe "outputs/kafka", :integration => true do
|
|
60
58
|
end
|
61
59
|
|
62
60
|
it 'should have data integrity' do
|
63
|
-
|
64
|
-
|
61
|
+
messages = fetch_messages(test_topic)
|
62
|
+
|
63
|
+
expect(messages.size).to eq(num_events)
|
64
|
+
messages.each do |m|
|
65
65
|
expect(m.value).to eq(event.to_s)
|
66
66
|
end
|
67
67
|
end
|
@@ -71,14 +71,6 @@ describe "outputs/kafka", :integration => true do
|
|
71
71
|
context 'when setting message_key' do
|
72
72
|
let(:num_events) { 10 }
|
73
73
|
let(:test_topic) { 'logstash_integration_topic2' }
|
74
|
-
let!(:consumer0) do
|
75
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
76
|
-
test_topic, 0, :earliest_offset)
|
77
|
-
end
|
78
|
-
let!(:consumer1) do
|
79
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
80
|
-
test_topic, 1, :earliest_offset)
|
81
|
-
end
|
82
74
|
|
83
75
|
before :each do
|
84
76
|
config = base_config.merge({"topic_id" => test_topic, "message_key" => "static_key"})
|
@@ -86,19 +78,14 @@ describe "outputs/kafka", :integration => true do
|
|
86
78
|
end
|
87
79
|
|
88
80
|
it 'should send all events to one partition' do
|
89
|
-
|
81
|
+
data0 = fetch_messages(test_topic, partition: 0)
|
82
|
+
data1 = fetch_messages(test_topic, partition: 1)
|
83
|
+
expect(data0.size == num_events || data1.size == num_events).to be true
|
90
84
|
end
|
91
85
|
end
|
92
86
|
|
93
87
|
context 'when using gzip compression' do
|
94
88
|
let(:test_topic) { 'logstash_integration_gzip_topic' }
|
95
|
-
let!(:consumer) do
|
96
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
97
|
-
test_topic, 0, :earliest_offset)
|
98
|
-
end
|
99
|
-
subject do
|
100
|
-
consumer.fetch
|
101
|
-
end
|
102
89
|
|
103
90
|
before :each do
|
104
91
|
config = base_config.merge({"topic_id" => test_topic, "compression_type" => "gzip"})
|
@@ -106,8 +93,10 @@ describe "outputs/kafka", :integration => true do
|
|
106
93
|
end
|
107
94
|
|
108
95
|
it 'should have data integrity' do
|
109
|
-
|
110
|
-
|
96
|
+
messages = fetch_messages(test_topic)
|
97
|
+
|
98
|
+
expect(messages.size).to eq(num_events)
|
99
|
+
messages.each do |m|
|
111
100
|
expect(m.value).to eq(event.to_s)
|
112
101
|
end
|
113
102
|
end
|
@@ -115,13 +104,6 @@ describe "outputs/kafka", :integration => true do
|
|
115
104
|
|
116
105
|
context 'when using snappy compression' do
|
117
106
|
let(:test_topic) { 'logstash_integration_snappy_topic' }
|
118
|
-
let!(:consumer) do
|
119
|
-
Poseidon::PartitionConsumer.new("my_test_consumer", kafka_host, kafka_port,
|
120
|
-
test_topic, 0, :earliest_offset)
|
121
|
-
end
|
122
|
-
subject do
|
123
|
-
consumer.fetch
|
124
|
-
end
|
125
107
|
|
126
108
|
before :each do
|
127
109
|
config = base_config.merge({"topic_id" => test_topic, "compression_type" => "snappy"})
|
@@ -129,8 +111,10 @@ describe "outputs/kafka", :integration => true do
|
|
129
111
|
end
|
130
112
|
|
131
113
|
it 'should have data integrity' do
|
132
|
-
|
133
|
-
|
114
|
+
messages = fetch_messages(test_topic)
|
115
|
+
|
116
|
+
expect(messages.size).to eq(num_events)
|
117
|
+
messages.each do |m|
|
134
118
|
expect(m.value).to eq(event.to_s)
|
135
119
|
end
|
136
120
|
end
|
@@ -143,52 +127,85 @@ describe "outputs/kafka", :integration => true do
|
|
143
127
|
config = base_config.merge({"topic_id" => test_topic, "compression_type" => "lz4"})
|
144
128
|
load_kafka_data(config)
|
145
129
|
end
|
130
|
+
|
131
|
+
# NOTE: depends on extlz4 gem which is using a C-extension
|
132
|
+
# it 'should have data integrity' do
|
133
|
+
# messages = fetch_messages(test_topic)
|
134
|
+
#
|
135
|
+
# expect(messages.size).to eq(num_events)
|
136
|
+
# messages.each do |m|
|
137
|
+
# expect(m.value).to eq(event.to_s)
|
138
|
+
# end
|
139
|
+
# end
|
146
140
|
end
|
147
141
|
|
148
142
|
context 'when using multi partition topic' do
|
149
|
-
let(:num_events) {
|
143
|
+
let(:num_events) { 100 } # ~ more than (batch.size) 16,384 bytes
|
150
144
|
let(:test_topic) { 'logstash_integration_topic3' }
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
145
|
+
|
146
|
+
before :each do
|
147
|
+
config = base_config.merge("topic_id" => test_topic, "partitioner" => 'org.apache.kafka.clients.producer.UniformStickyPartitioner')
|
148
|
+
load_kafka_data(config) do # let's have a bit more (diverse) dataset
|
149
|
+
num_events.times.collect do
|
150
|
+
LogStash::Event.new.tap do |e|
|
151
|
+
e.set('message', event.get('message').sub('183.60.215.50') { "#{rand(126)+1}.#{rand(126)+1}.#{rand(126)+1}.#{rand(126)+1}" })
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
158
155
|
end
|
159
156
|
|
160
|
-
|
161
|
-
|
162
|
-
|
157
|
+
it 'should distribute events to all partitions' do
|
158
|
+
consumer0_records = fetch_messages(test_topic, partition: 0)
|
159
|
+
consumer1_records = fetch_messages(test_topic, partition: 1)
|
160
|
+
consumer2_records = fetch_messages(test_topic, partition: 2)
|
161
|
+
|
162
|
+
all_records = consumer0_records + consumer1_records + consumer2_records
|
163
|
+
expect(all_records.size).to eq(num_events * 2)
|
164
|
+
all_records.each do |m|
|
165
|
+
expect(m.value).to include message_content
|
166
|
+
end
|
167
|
+
|
168
|
+
expect(consumer0_records.size).to be > 1
|
169
|
+
expect(consumer1_records.size).to be > 1
|
170
|
+
expect(consumer2_records.size).to be > 1
|
163
171
|
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'setting partitioner' do
|
175
|
+
let(:test_topic) { 'logstash_integration_partitioner_topic' }
|
176
|
+
let(:partitioner) { nil }
|
164
177
|
|
165
178
|
before :each do
|
166
|
-
|
179
|
+
@messages_offset = fetch_messages_from_all_partitions
|
180
|
+
|
181
|
+
config = base_config.merge("topic_id" => test_topic, 'partitioner' => partitioner)
|
167
182
|
load_kafka_data(config)
|
168
183
|
end
|
169
184
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
consumer1_records.size > 1 &&
|
177
|
-
consumer2_records.size > 1).to be true
|
178
|
-
|
179
|
-
all_records = consumer0_records + consumer1_records + consumer2_records
|
180
|
-
expect(all_records.size).to eq(num_events)
|
181
|
-
all_records.each do |m|
|
182
|
-
expect(m.value).to eq(event.to_s)
|
185
|
+
[ 'default', 'round_robin', 'uniform_sticky' ].each do |partitioner|
|
186
|
+
describe partitioner do
|
187
|
+
let(:partitioner) { partitioner }
|
188
|
+
it 'loads data' do
|
189
|
+
expect(fetch_messages_from_all_partitions - @messages_offset).to eql num_events
|
190
|
+
end
|
183
191
|
end
|
184
192
|
end
|
193
|
+
|
194
|
+
def fetch_messages_from_all_partitions
|
195
|
+
3.times.map { |i| fetch_messages(test_topic, partition: i).size }.sum
|
196
|
+
end
|
185
197
|
end
|
186
198
|
|
187
199
|
def load_kafka_data(config)
|
188
200
|
kafka = LogStash::Outputs::Kafka.new(config)
|
189
201
|
kafka.register
|
190
202
|
kafka.multi_receive(num_events.times.collect { event })
|
203
|
+
kafka.multi_receive(Array(yield)) if block_given?
|
191
204
|
kafka.close
|
192
205
|
end
|
193
206
|
|
207
|
+
def fetch_messages(topic, partition: 0, offset: :earliest)
|
208
|
+
kafka_client.fetch_messages(topic: topic, partition: partition, offset: offset)
|
209
|
+
end
|
210
|
+
|
194
211
|
end
|
@@ -34,6 +34,68 @@ describe LogStash::Inputs::Kafka do
|
|
34
34
|
subject { LogStash::Inputs::Kafka.new(config) }
|
35
35
|
|
36
36
|
it "should register" do
|
37
|
-
expect {subject.register}.to_not raise_error
|
37
|
+
expect { subject.register }.to_not raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with client_rack' do
|
41
|
+
let(:config) { super.merge('client_rack' => 'EU-R1') }
|
42
|
+
|
43
|
+
it "sets broker rack parameter" do
|
44
|
+
expect(org.apache.kafka.clients.consumer.KafkaConsumer).
|
45
|
+
to receive(:new).with(hash_including('client.rack' => 'EU-R1')).
|
46
|
+
and_return kafka_client = double('kafka-consumer')
|
47
|
+
|
48
|
+
expect( subject.send(:create_consumer, 'sample_client-0') ).to be kafka_client
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'string integer config' do
|
53
|
+
let(:config) { super.merge('session_timeout_ms' => '25000', 'max_poll_interval_ms' => '345000') }
|
54
|
+
|
55
|
+
it "sets integer values" do
|
56
|
+
expect(org.apache.kafka.clients.consumer.KafkaConsumer).
|
57
|
+
to receive(:new).with(hash_including('session.timeout.ms' => '25000', 'max.poll.interval.ms' => '345000')).
|
58
|
+
and_return kafka_client = double('kafka-consumer')
|
59
|
+
|
60
|
+
expect( subject.send(:create_consumer, 'sample_client-1') ).to be kafka_client
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'integer config' do
|
65
|
+
let(:config) { super.merge('session_timeout_ms' => 25200, 'max_poll_interval_ms' => 123_000) }
|
66
|
+
|
67
|
+
it "sets integer values" do
|
68
|
+
expect(org.apache.kafka.clients.consumer.KafkaConsumer).
|
69
|
+
to receive(:new).with(hash_including('session.timeout.ms' => '25200', 'max.poll.interval.ms' => '123000')).
|
70
|
+
and_return kafka_client = double('kafka-consumer')
|
71
|
+
|
72
|
+
expect( subject.send(:create_consumer, 'sample_client-2') ).to be kafka_client
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'string boolean config' do
|
77
|
+
let(:config) { super.merge('enable_auto_commit' => 'false', 'check_crcs' => 'true') }
|
78
|
+
|
79
|
+
it "sets parameters" do
|
80
|
+
expect(org.apache.kafka.clients.consumer.KafkaConsumer).
|
81
|
+
to receive(:new).with(hash_including('enable.auto.commit' => 'false', 'check.crcs' => 'true')).
|
82
|
+
and_return kafka_client = double('kafka-consumer')
|
83
|
+
|
84
|
+
expect( subject.send(:create_consumer, 'sample_client-3') ).to be kafka_client
|
85
|
+
expect( subject.enable_auto_commit ).to be false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'boolean config' do
|
90
|
+
let(:config) { super.merge('enable_auto_commit' => true, 'check_crcs' => false) }
|
91
|
+
|
92
|
+
it "sets parameters" do
|
93
|
+
expect(org.apache.kafka.clients.consumer.KafkaConsumer).
|
94
|
+
to receive(:new).with(hash_including('enable.auto.commit' => 'true', 'check.crcs' => 'false')).
|
95
|
+
and_return kafka_client = double('kafka-consumer')
|
96
|
+
|
97
|
+
expect( subject.send(:create_consumer, 'sample_client-4') ).to be kafka_client
|
98
|
+
expect( subject.enable_auto_commit ).to be true
|
99
|
+
end
|
38
100
|
end
|
39
101
|
end
|
@@ -56,14 +56,15 @@ describe "outputs/kafka" do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context "when KafkaProducer#send() raises
|
59
|
+
context "when KafkaProducer#send() raises a retriable exception" do
|
60
60
|
let(:failcount) { (rand * 10).to_i }
|
61
61
|
let(:sendcount) { failcount + 1 }
|
62
62
|
|
63
63
|
let(:exception_classes) { [
|
64
64
|
org.apache.kafka.common.errors.TimeoutException,
|
65
|
+
org.apache.kafka.common.errors.DisconnectException,
|
66
|
+
org.apache.kafka.common.errors.CoordinatorNotAvailableException,
|
65
67
|
org.apache.kafka.common.errors.InterruptException,
|
66
|
-
org.apache.kafka.common.errors.SerializationException
|
67
68
|
] }
|
68
69
|
|
69
70
|
before do
|
@@ -88,6 +89,37 @@ describe "outputs/kafka" do
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
92
|
+
context "when KafkaProducer#send() raises a non-retriable exception" do
|
93
|
+
let(:failcount) { (rand * 10).to_i }
|
94
|
+
|
95
|
+
let(:exception_classes) { [
|
96
|
+
org.apache.kafka.common.errors.SerializationException,
|
97
|
+
org.apache.kafka.common.errors.RecordTooLargeException,
|
98
|
+
org.apache.kafka.common.errors.InvalidTopicException
|
99
|
+
] }
|
100
|
+
|
101
|
+
before do
|
102
|
+
count = 0
|
103
|
+
expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
|
104
|
+
.exactly(1).times
|
105
|
+
.and_wrap_original do |m, *args|
|
106
|
+
if count < failcount # fail 'failcount' times in a row.
|
107
|
+
count += 1
|
108
|
+
# Pick an exception at random
|
109
|
+
raise exception_classes.shuffle.first.new("injected exception for testing")
|
110
|
+
else
|
111
|
+
m.call(*args) # call original
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should not retry" do
|
117
|
+
kafka = LogStash::Outputs::Kafka.new(simple_kafka_config)
|
118
|
+
kafka.register
|
119
|
+
kafka.multi_receive([event])
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
91
123
|
context "when a send fails" do
|
92
124
|
context "and the default retries behavior is used" do
|
93
125
|
# Fail this many times and then finally succeed.
|
@@ -97,7 +129,7 @@ describe "outputs/kafka" do
|
|
97
129
|
let(:sendcount) { failcount + 1 }
|
98
130
|
|
99
131
|
it "should retry until successful" do
|
100
|
-
count = 0
|
132
|
+
count = 0
|
101
133
|
|
102
134
|
expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
|
103
135
|
.exactly(sendcount).times
|
@@ -107,7 +139,7 @@ describe "outputs/kafka" do
|
|
107
139
|
# inject some failures.
|
108
140
|
|
109
141
|
# Return a custom Future that will raise an exception to simulate a Kafka send() problem.
|
110
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
142
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
111
143
|
future.run
|
112
144
|
future
|
113
145
|
else
|
@@ -129,7 +161,7 @@ describe "outputs/kafka" do
|
|
129
161
|
.once
|
130
162
|
.and_wrap_original do |m, *args|
|
131
163
|
# Always fail.
|
132
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
164
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
133
165
|
future.run
|
134
166
|
future
|
135
167
|
end
|
@@ -143,7 +175,7 @@ describe "outputs/kafka" do
|
|
143
175
|
.once
|
144
176
|
.and_wrap_original do |m, *args|
|
145
177
|
# Always fail.
|
146
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
178
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
147
179
|
future.run
|
148
180
|
future
|
149
181
|
end
|
@@ -164,7 +196,7 @@ describe "outputs/kafka" do
|
|
164
196
|
.at_most(max_sends).times
|
165
197
|
.and_wrap_original do |m, *args|
|
166
198
|
# Always fail.
|
167
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
199
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
168
200
|
future.run
|
169
201
|
future
|
170
202
|
end
|
@@ -175,10 +207,10 @@ describe "outputs/kafka" do
|
|
175
207
|
|
176
208
|
it 'should only sleep retries number of times' do
|
177
209
|
expect_any_instance_of(org.apache.kafka.clients.producer.KafkaProducer).to receive(:send)
|
178
|
-
.at_most(max_sends)
|
210
|
+
.at_most(max_sends).times
|
179
211
|
.and_wrap_original do |m, *args|
|
180
212
|
# Always fail.
|
181
|
-
future = java.util.concurrent.FutureTask.new { raise "Failed" }
|
213
|
+
future = java.util.concurrent.FutureTask.new { raise org.apache.kafka.common.errors.TimeoutException.new("Failed") }
|
182
214
|
future.run
|
183
215
|
future
|
184
216
|
end
|
@@ -189,4 +221,25 @@ describe "outputs/kafka" do
|
|
189
221
|
end
|
190
222
|
end
|
191
223
|
end
|
224
|
+
|
225
|
+
context 'when ssl endpoint identification disabled' do
|
226
|
+
|
227
|
+
let(:config) do
|
228
|
+
simple_kafka_config.merge('ssl_endpoint_identification_algorithm' => '', 'security_protocol' => 'SSL')
|
229
|
+
end
|
230
|
+
|
231
|
+
subject { LogStash::Outputs::Kafka.new(config) }
|
232
|
+
|
233
|
+
it 'does not configure truststore' do
|
234
|
+
expect(org.apache.kafka.clients.producer.KafkaProducer).
|
235
|
+
to receive(:new).with(hash_excluding('ssl.truststore.location' => anything))
|
236
|
+
subject.register
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'sets empty ssl.endpoint.identification.algorithm' do
|
240
|
+
expect(org.apache.kafka.clients.producer.KafkaProducer).
|
241
|
+
to receive(:new).with(hash_including('ssl.endpoint.identification.algorithm' => ''))
|
242
|
+
subject.register
|
243
|
+
end
|
244
|
+
end
|
192
245
|
end
|