logstash-output-elasticsearch 5.4.1-java → 6.0.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/logstash/outputs/elasticsearch.rb +6 -5
- data/lib/logstash/outputs/elasticsearch/common.rb +3 -4
- data/lib/logstash/outputs/elasticsearch/common_configs.rb +3 -1
- data/lib/logstash/outputs/elasticsearch/http_client.rb +151 -110
- data/lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb +43 -12
- data/lib/logstash/outputs/elasticsearch/http_client/pool.rb +26 -47
- data/lib/logstash/outputs/elasticsearch/http_client_builder.rb +4 -20
- data/lib/logstash/outputs/elasticsearch/template_manager.rb +1 -1
- data/logstash-output-elasticsearch.gemspec +1 -1
- data/spec/integration/outputs/sniffer_spec.rb +5 -1
- data/spec/unit/outputs/elasticsearch/http_client/manticore_adapter_spec.rb +25 -2
- data/spec/unit/outputs/elasticsearch/http_client/pool_spec.rb +24 -23
- data/spec/unit/outputs/elasticsearch/http_client_spec.rb +111 -44
- data/spec/unit/outputs/elasticsearch_proxy_spec.rb +33 -33
- data/spec/unit/outputs/elasticsearch_spec.rb +74 -16
- data/spec/unit/outputs/elasticsearch_ssl_spec.rb +23 -4
- metadata +2 -5
- data/lib/logstash/outputs/elasticsearch/safe_url.rb +0 -16
- data/spec/unit/safe_url_spec.rb +0 -46
@@ -4,12 +4,7 @@ require "logstash/outputs/elasticsearch"
|
|
4
4
|
require 'manticore/client'
|
5
5
|
|
6
6
|
describe "Proxy option" do
|
7
|
-
let(:settings) {
|
8
|
-
{
|
9
|
-
"hosts" => "node01",
|
10
|
-
"proxy" => proxy
|
11
|
-
}
|
12
|
-
}
|
7
|
+
let(:settings) { { "hosts" => "node01" } }
|
13
8
|
subject {
|
14
9
|
LogStash::Outputs::ElasticSearch.new(settings)
|
15
10
|
}
|
@@ -23,30 +18,46 @@ describe "Proxy option" do
|
|
23
18
|
subject.register
|
24
19
|
end
|
25
20
|
|
26
|
-
context "when specified as a
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
expect(
|
21
|
+
context "when specified as a URI" do
|
22
|
+
shared_examples("hash conversion") do |hash|
|
23
|
+
let(:settings) { super.merge("proxy" => proxy)}
|
24
|
+
|
25
|
+
it "should set the proxy to the correct hash value" do
|
26
|
+
expect(::Manticore::Client).to have_received(:new) do |options|
|
27
|
+
expect(options[:proxy]).to eq(hash)
|
28
|
+
end
|
32
29
|
end
|
33
30
|
end
|
34
|
-
|
31
|
+
|
32
|
+
describe "simple proxy" do
|
33
|
+
let(:proxy) { LogStash::Util::SafeURI.new("http://127.0.0.1:1234") }
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
include_examples("hash conversion",
|
36
|
+
{
|
37
|
+
:host => "127.0.0.1",
|
38
|
+
:scheme => "http",
|
39
|
+
:port => 1234
|
40
|
+
}
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
describe "a secure authed proxy" do
|
46
|
+
let(:proxy) { LogStash::Util::SafeURI.new("https://myuser:mypass@127.0.0.1:1234") }
|
38
47
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
include_examples("hash conversion",
|
49
|
+
{
|
50
|
+
:host => "127.0.0.1",
|
51
|
+
:scheme => "https",
|
52
|
+
:user => "myuser",
|
53
|
+
:password => "mypass",
|
54
|
+
:port => 1234
|
55
|
+
}
|
56
|
+
)
|
44
57
|
end
|
45
58
|
end
|
46
59
|
|
47
60
|
context "when not specified" do
|
48
|
-
let(:proxy) { nil }
|
49
|
-
|
50
61
|
it "should not send the proxy option to manticore" do
|
51
62
|
expect(::Manticore::Client).to have_received(:new) do |options|
|
52
63
|
expect(options).not_to include(:proxy)
|
@@ -54,15 +65,4 @@ describe "Proxy option" do
|
|
54
65
|
end
|
55
66
|
end
|
56
67
|
end
|
57
|
-
|
58
|
-
describe "invalid configs" do
|
59
|
-
let(:proxy) { ["bad", "stuff"] }
|
60
|
-
|
61
|
-
it "should have raised an exception" do
|
62
|
-
expect {
|
63
|
-
subject.register
|
64
|
-
}.to raise_error(LogStash::ConfigurationError)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
68
|
end
|
@@ -8,23 +8,34 @@ describe "outputs/elasticsearch" do
|
|
8
8
|
{
|
9
9
|
"index" => "my-index",
|
10
10
|
"hosts" => ["localhost","localhost:9202"],
|
11
|
-
"path" => "some-path"
|
11
|
+
"path" => "some-path",
|
12
|
+
"manage_template" => false
|
12
13
|
}
|
13
14
|
}
|
14
|
-
|
15
|
-
let(:eso) {LogStash::Outputs::ElasticSearch.new(options)}
|
15
|
+
|
16
|
+
let(:eso) { LogStash::Outputs::ElasticSearch.new(options) }
|
16
17
|
|
17
18
|
let(:manticore_urls) { eso.client.pool.urls }
|
18
19
|
let(:manticore_url) { manticore_urls.first }
|
19
20
|
|
20
21
|
let(:do_register) { true }
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
before(:each) do
|
24
|
+
if do_register
|
25
|
+
eso.register
|
26
|
+
|
27
|
+
# Rspec mocks can't handle background threads, so... we can't use any
|
28
|
+
allow(eso.client.pool).to receive(:start_resurrectionist)
|
29
|
+
allow(eso.client.pool).to receive(:start_sniffer)
|
30
|
+
allow(eso.client.pool).to receive(:healthcheck!)
|
31
|
+
eso.client.pool.adapter.manticore.respond_with(:body => "{}")
|
32
|
+
end
|
26
33
|
end
|
27
|
-
|
34
|
+
|
35
|
+
after(:each) do
|
36
|
+
eso.close
|
37
|
+
end
|
38
|
+
|
28
39
|
describe "getting a document type" do
|
29
40
|
it "should default to 'logs'" do
|
30
41
|
expect(eso.send(:get_event_type, LogStash::Event.new)).to eql("logs")
|
@@ -59,13 +70,43 @@ describe "outputs/elasticsearch" do
|
|
59
70
|
end
|
60
71
|
end
|
61
72
|
end
|
73
|
+
|
74
|
+
describe "with auth" do
|
75
|
+
let(:user) { "myuser" }
|
76
|
+
let(:password) { ::LogStash::Util::Password.new("mypassword") }
|
77
|
+
|
78
|
+
shared_examples "an authenticated config" do
|
79
|
+
it "should set the URL auth correctly" do
|
80
|
+
expect(manticore_url.user).to eq user
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "as part of a URL" do
|
85
|
+
let(:options) {
|
86
|
+
super.merge("hosts" => ["http://#{user}:#{password.value}@localhost:9200"])
|
87
|
+
}
|
88
|
+
|
89
|
+
include_examples("an authenticated config")
|
90
|
+
end
|
91
|
+
|
92
|
+
context "as a hash option" do
|
93
|
+
let(:options) {
|
94
|
+
super.merge!(
|
95
|
+
"user" => user,
|
96
|
+
"password" => password
|
97
|
+
)
|
98
|
+
}
|
99
|
+
|
100
|
+
include_examples("an authenticated config")
|
101
|
+
end
|
102
|
+
end
|
62
103
|
|
63
104
|
describe "with path" do
|
64
105
|
it "should properly create a URI with the path" do
|
65
106
|
expect(eso.path).to eql(options["path"])
|
66
107
|
end
|
67
108
|
|
68
|
-
|
109
|
+
it "should properly set the path on the HTTP client adding slashes" do
|
69
110
|
expect(manticore_url.path).to eql("/" + options["path"] + "/")
|
70
111
|
end
|
71
112
|
|
@@ -185,6 +226,7 @@ describe "outputs/elasticsearch" do
|
|
185
226
|
end
|
186
227
|
|
187
228
|
it "should fail after the timeout" do
|
229
|
+
#pending("This is tricky now that we do healthchecks on instantiation")
|
188
230
|
Thread.new { eso.multi_receive([LogStash::Event.new]) }
|
189
231
|
|
190
232
|
# Allow the timeout to occur
|
@@ -214,19 +256,35 @@ describe "outputs/elasticsearch" do
|
|
214
256
|
end
|
215
257
|
|
216
258
|
describe "SSL end to end" do
|
217
|
-
|
218
|
-
|
219
|
-
expect(eso.client.pool.urls.map(&:scheme).uniq).to eql(['https'])
|
220
|
-
end
|
259
|
+
let(:manticore_double) do
|
260
|
+
double("manticoreX#{self.inspect}")
|
221
261
|
end
|
222
|
-
|
262
|
+
|
223
263
|
let(:eso) {LogStash::Outputs::ElasticSearch.new(options)}
|
224
|
-
subject(:manticore) { eso.client.pool.adapter.client}
|
225
264
|
|
226
|
-
before do
|
265
|
+
before(:each) do
|
266
|
+
response_double = double("manticore response").as_null_object
|
267
|
+
# Allow healtchecks
|
268
|
+
allow(manticore_double).to receive(:head).with(any_args).and_return(response_double)
|
269
|
+
allow(manticore_double).to receive(:get).with(any_args).and_return(response_double)
|
270
|
+
allow(manticore_double).to receive(:close)
|
271
|
+
|
272
|
+
allow(::Manticore::Client).to receive(:new).and_return(manticore_double)
|
227
273
|
eso.register
|
228
274
|
end
|
275
|
+
|
276
|
+
after(:each) do
|
277
|
+
eso.close
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
shared_examples("an encrypted client connection") do
|
282
|
+
it "should enable SSL in manticore" do
|
283
|
+
expect(eso.client.pool.urls.map(&:scheme).uniq).to eql(['https'])
|
284
|
+
end
|
285
|
+
end
|
229
286
|
|
287
|
+
|
230
288
|
context "With the 'ssl' option" do
|
231
289
|
let(:options) { {"ssl" => true}}
|
232
290
|
|
@@ -3,6 +3,18 @@ require 'stud/temporary'
|
|
3
3
|
require "logstash/outputs/elasticsearch"
|
4
4
|
|
5
5
|
describe "SSL option" do
|
6
|
+
let(:manticore_double) { double("manticoreSSL #{self.inspect}") }
|
7
|
+
before do
|
8
|
+
allow(manticore_double).to receive(:close)
|
9
|
+
|
10
|
+
response_double = double("manticore response").as_null_object
|
11
|
+
# Allow healtchecks
|
12
|
+
allow(manticore_double).to receive(:head).with(any_args).and_return(response_double)
|
13
|
+
allow(manticore_double).to receive(:get).with(any_args).and_return(response_double)
|
14
|
+
|
15
|
+
allow(::Manticore::Client).to receive(:new).and_return(manticore_double)
|
16
|
+
end
|
17
|
+
|
6
18
|
context "when using ssl without cert verification" do
|
7
19
|
subject do
|
8
20
|
require "logstash/outputs/elasticsearch"
|
@@ -13,13 +25,18 @@ describe "SSL option" do
|
|
13
25
|
"pool_max" => 1,
|
14
26
|
"pool_max_per_route" => 1
|
15
27
|
}
|
16
|
-
|
28
|
+
LogStash::Outputs::ElasticSearch.new(settings)
|
17
29
|
end
|
18
|
-
|
30
|
+
|
31
|
+
after do
|
32
|
+
subject.close
|
33
|
+
end
|
34
|
+
|
19
35
|
it "should pass the flag to the ES client" do
|
20
|
-
expect(::Manticore::Client).to receive(:new)
|
36
|
+
expect(::Manticore::Client).to receive(:new) do |args|
|
21
37
|
expect(args[:ssl]).to eq(:enabled => true, :verify => false)
|
22
|
-
end
|
38
|
+
end.and_return(manticore_double)
|
39
|
+
|
23
40
|
subject.register
|
24
41
|
end
|
25
42
|
|
@@ -27,7 +44,9 @@ describe "SSL option" do
|
|
27
44
|
disabled_matcher = /You have enabled encryption but DISABLED certificate verification/
|
28
45
|
expect(subject.logger).to receive(:warn).with(disabled_matcher).at_least(:once)
|
29
46
|
allow(subject.logger).to receive(:warn).with(any_args)
|
47
|
+
|
30
48
|
subject.register
|
49
|
+
allow(LogStash::Outputs::ElasticSearch::HttpClient::Pool).to receive(:start)
|
31
50
|
end
|
32
51
|
end
|
33
52
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-elasticsearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,7 +189,6 @@ files:
|
|
189
189
|
- lib/logstash/outputs/elasticsearch/http_client/manticore_adapter.rb
|
190
190
|
- lib/logstash/outputs/elasticsearch/http_client/pool.rb
|
191
191
|
- lib/logstash/outputs/elasticsearch/http_client_builder.rb
|
192
|
-
- lib/logstash/outputs/elasticsearch/safe_url.rb
|
193
192
|
- lib/logstash/outputs/elasticsearch/template_manager.rb
|
194
193
|
- logstash-output-elasticsearch.gemspec
|
195
194
|
- spec/es_spec_helper.rb
|
@@ -216,7 +215,6 @@ files:
|
|
216
215
|
- spec/unit/outputs/elasticsearch_spec.rb
|
217
216
|
- spec/unit/outputs/elasticsearch_ssl_spec.rb
|
218
217
|
- spec/unit/outputs/error_whitelist_spec.rb
|
219
|
-
- spec/unit/safe_url_spec.rb
|
220
218
|
homepage: http://logstash.net/
|
221
219
|
licenses:
|
222
220
|
- apache-2.0
|
@@ -268,4 +266,3 @@ test_files:
|
|
268
266
|
- spec/unit/outputs/elasticsearch_spec.rb
|
269
267
|
- spec/unit/outputs/elasticsearch_ssl_spec.rb
|
270
268
|
- spec/unit/outputs/error_whitelist_spec.rb
|
271
|
-
- spec/unit/safe_url_spec.rb
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module LogStash; module Outputs; class ElasticSearch;
|
2
|
-
module SafeURL
|
3
|
-
PLACEHOLDER = "~hidden~".freeze
|
4
|
-
|
5
|
-
module_function
|
6
|
-
|
7
|
-
# Takes a URI object and returns a copy of it with any user or password
|
8
|
-
# information replaced with a placeholder `~hidden~`.
|
9
|
-
def without_credentials(url)
|
10
|
-
url.dup.tap do |u|
|
11
|
-
u.user = PLACEHOLDER if u.user
|
12
|
-
u.password = PLACEHOLDER if u.password
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end end end
|
data/spec/unit/safe_url_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require "logstash/outputs/elasticsearch/safe_url"
|
2
|
-
require "uri"
|
3
|
-
|
4
|
-
describe ::LogStash::Outputs::ElasticSearch::SafeURL do
|
5
|
-
let(:placeholder) { ::LogStash::Outputs::ElasticSearch::SafeURL::PLACEHOLDER }
|
6
|
-
|
7
|
-
context "#without_credentials" do
|
8
|
-
subject { described_class.without_credentials(url) }
|
9
|
-
|
10
|
-
shared_examples_for "returning a new object" do
|
11
|
-
it "should return a new url object" do
|
12
|
-
expect(subject.object_id).not_to be == url.object_id
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
context "when given a url without credentials" do
|
17
|
-
let(:url) { URI.parse("https://example.com/") }
|
18
|
-
|
19
|
-
it_behaves_like "returning a new object"
|
20
|
-
|
21
|
-
it "should return the same url" do
|
22
|
-
expect(subject).to be == url
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context "when url contains credentials" do
|
27
|
-
let(:url) { URI.parse("https://user:pass@example.com/") }
|
28
|
-
|
29
|
-
it_behaves_like "returning a new object"
|
30
|
-
|
31
|
-
it "should hide the user" do
|
32
|
-
expect(subject.user).to be == placeholder
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should hide the password" do
|
36
|
-
expect(subject.user).to be == placeholder
|
37
|
-
end
|
38
|
-
|
39
|
-
context "#to_s" do
|
40
|
-
it "should not contain credentials" do
|
41
|
-
expect(subject.to_s).to be == "https://#{placeholder}:#{placeholder}@example.com/"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|