diff --git a/docs/index.asciidoc b/docs/index.asciidoc
index 42ea523f..fbdfc964 100644
--- a/docs/index.asciidoc
+++ b/docs/index.asciidoc
@@ -252,6 +252,16 @@ List of one or more Elasticsearch hosts to use for querying. Each host
can be either IP, HOST, IP:port, or HOST:port. The port defaults to
9200.
+This option can accept an environment variable containing one or more hostnames separated by whitespace.
+Strings separated by whitespace are treated as separate entries.
+
+*Examples:*
+
+* `ES_HOSTS="es1.example.com es2.example.com:9201 es3.example.com:9201"`
+* `ES_HOSTS="127.0.0.1:9200 127.0.0.2:9200"`
+* `ES_HOSTS="http://127.0.0.1 http://127.0.0.2"`
+* `ES_HOSTS="https://127.0.0.1:9200/mypath https://127.0.0.2:9200/mypath"`
+
[id="plugins-{type}s-{plugin}-index"]
===== `index`
diff --git a/spec/inputs/elasticsearch_spec.rb b/spec/inputs/elasticsearch_spec.rb
index f90934ad..492d9b47 100644
--- a/spec/inputs/elasticsearch_spec.rb
+++ b/spec/inputs/elasticsearch_spec.rb
@@ -166,7 +166,7 @@ class LogStash::Inputs::TestableElasticsearch < LogStash::Inputs::Elasticsearch
end
context 'without slices directive' do
- let(:config) { super.tap { |h| h.delete('slices') } }
+ let(:config) { super().tap { |h| h.delete('slices') } }
it 'runs just one slice' do
expect(plugin).to receive(:do_run_slice).with(duck_type(:<<))
expect(Thread).to_not receive(:new)
@@ -563,22 +563,22 @@ def synchronize_method!(object, method_name)
'sample:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2OjkyNDMkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA=='
end
- let(:config) { super.merge({ 'cloud_id' => valid_cloud_id }) }
+ let(:config) { super().merge({ 'cloud_id' => valid_cloud_id }) }
it "should set host(s)" do
plugin.register
client = plugin.send(:client)
- expect( client.transport.hosts ).to eql [{
- :scheme => "https",
- :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
- :port => 9243,
- :path => "",
- :protocol => "https"
- }]
+ expect( client.transport.instance_variable_get(:@hosts) ).to eql [{
+ :scheme => "https",
+ :host => "ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io",
+ :port => 9243,
+ :path => "",
+ :protocol => "https"
+ }]
end
context 'invalid' do
- let(:config) { super.merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
+ let(:config) { super().merge({ 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id.*? is invalid/
@@ -586,7 +586,7 @@ def synchronize_method!(object, method_name)
end
context 'hosts also set' do
- let(:config) { super.merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
+ let(:config) { super().merge({ 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost:9200' ] }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_id and hosts/
@@ -595,18 +595,18 @@ def synchronize_method!(object, method_name)
end if LOGSTASH_VERSION > '6.0'
describe "cloud.auth" do
- let(:config) { super.merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
+ let(:config) { super().merge({ 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') }) }
it "should set authorization" do
plugin.register
client = plugin.send(:client)
- auth_header = client.transport.options[:transport_options][:headers][:Authorization]
+ auth_header = client.transport.instance_variable_get(:@options)[:transport_options][:headers][:Authorization]
expect( auth_header ).to eql "Basic #{Base64.encode64('elastic:my-passwd-00').rstrip}"
end
context 'invalid' do
- let(:config) { super.merge({ 'cloud_auth' => 'invalid-format' }) }
+ let(:config) { super().merge({ 'cloud_auth' => 'invalid-format' }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /cloud_auth.*? format/
@@ -614,7 +614,7 @@ def synchronize_method!(object, method_name)
end
context 'user also set' do
- let(:config) { super.merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
+ let(:config) { super().merge({ 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
@@ -624,7 +624,7 @@ def synchronize_method!(object, method_name)
describe "api_key" do
context "without ssl" do
- let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
+ let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar') }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /api_key authentication requires SSL\/TLS/
@@ -632,18 +632,18 @@ def synchronize_method!(object, method_name)
end
context "with ssl" do
- let(:config) { super.merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
+ let(:config) { super().merge({ 'api_key' => LogStash::Util::Password.new('foo:bar'), "ssl" => true }) }
it "should set authorization" do
plugin.register
client = plugin.send(:client)
- auth_header = client.transport.options[:transport_options][:headers][:Authorization]
+ auth_header = client.transport.instance_variable_get(:@options)[:transport_options][:headers][:Authorization]
expect( auth_header ).to eql "ApiKey #{Base64.strict_encode64('foo:bar')}"
end
context 'user also set' do
- let(:config) { super.merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
+ let(:config) { super().merge({ 'api_key' => 'foo:bar', 'user' => 'another' }) }
it "should fail" do
expect { plugin.register }.to raise_error LogStash::ConfigurationError, /Multiple authentication options are specified/
@@ -653,24 +653,24 @@ def synchronize_method!(object, method_name)
end if LOGSTASH_VERSION > '6.0'
describe "proxy" do
- let(:config) { super.merge({ 'proxy' => 'http://localhost:1234' }) }
+ let(:config) { super().merge({ 'proxy' => 'http://localhost:1234' }) }
it "should set proxy" do
plugin.register
client = plugin.send(:client)
- proxy = client.transport.options[:transport_options][:proxy]
+ proxy = client.transport.instance_variable_get(:@options)[:transport_options][:proxy]
expect( proxy ).to eql "http://localhost:1234"
end
context 'invalid' do
- let(:config) { super.merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
+ let(:config) { super().merge({ 'proxy' => '${A_MISSING_ENV_VAR:}' }) }
it "should not set proxy" do
plugin.register
client = plugin.send(:client)
- expect( client.transport.options[:transport_options] ).to_not include(:proxy)
+ expect( client.transport.instance_variable_get(:@options)[:transport_options] ).to_not include(:proxy)
end
end
end
diff --git a/spec/inputs/integration/elasticsearch_spec.rb b/spec/inputs/integration/elasticsearch_spec.rb
index 107c24d7..059cf7de 100644
--- a/spec/inputs/integration/elasticsearch_spec.rb
+++ b/spec/inputs/integration/elasticsearch_spec.rb
@@ -51,7 +51,7 @@
let(:password) { 'abc123' }
let(:ca_file) { "spec/fixtures/test_certs/test.crt" }
let(:client_options) {{:ca_file => ca_file, :user => user, :password => password}}
- let(:config) { super.merge({
+ let(:config) { super().merge({
'user' => user,
'password' => password,
'ssl' => true,