logstash-output-elasticsearch 10.2.3-java → 10.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6be61b215a17faa3cec976576510d0f153be3a343162fa921e77398659b764a7
4
- data.tar.gz: 35ab3d0b82ada32bd091091b2f1759681b976356837301c35bf0d14016cc6fa9
3
+ metadata.gz: 95ca05594f4d76e1bb341f14088bcafab677339c4322db449c24022d320d22ee
4
+ data.tar.gz: 79ec3c6d83999b68f9ebfca2c144c5556badfb9046d1f5c968628319623001d4
5
5
  SHA512:
6
- metadata.gz: 134a73bd275a3f1c50d453fc9d4ee3f7b17a54293099d0b0c539e8cb87f2fc66993f2ad237b62ea789580a18a0ddeb785bade259ca24305d0211cea18f477e52
7
- data.tar.gz: 23f201b5a03917d066f558f34d3b14d7bb6218cc8ef090ec3d26766f4aaab318d430256463a61cc00828fc60a3f24de290411a0015dbd689dd93a9b8add4bf87
6
+ metadata.gz: '049db8893d70c206be9cfe8e3e93354c98bfbd50d0718b936db79f6e9a07a3927fcdacc352f6e0eec02c0ac22ebd5cc866cd8193efa18a93a9c87f1a40251e7e'
7
+ data.tar.gz: 6509ec1cc74743832955ed52ecd868546f64712d99f6984285390b41adb71dd09d179d3e180decf9596e587f1b374cf611d0bda33e1e93b8421625d439fd8ae1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 10.3.0
2
+ - Feat: Added support for cloud_id and cloud_auth [#906](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/906)
3
+
1
4
  ## 10.2.3
2
5
  - Opened type removal logic for extension. This allows X-Pack Elasticsearch output to continue using types for special case `/_monitoring` bulk endpoint, enabling a fix for LogStash #11312. [#900](https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/900)
3
6
 
data/docs/index.asciidoc CHANGED
@@ -230,6 +230,8 @@ This plugin supports the following configuration options plus the <<plugins-{typ
230
230
  | <<plugins-{type}s-{plugin}-action>> |<<string,string>>|No
231
231
  | <<plugins-{type}s-{plugin}-bulk_path>> |<<string,string>>|No
232
232
  | <<plugins-{type}s-{plugin}-cacert>> |a valid filesystem path|No
233
+ | <<plugins-{type}s-{plugin}-cloud_auth>> |<<password,password>>|No
234
+ | <<plugins-{type}s-{plugin}-cloud_id>> |<<string,string>>|No
233
235
  | <<plugins-{type}s-{plugin}-custom_headers>> |<<hash,hash>>|No
234
236
  | <<plugins-{type}s-{plugin}-doc_as_upsert>> |<<boolean,boolean>>|No
235
237
  | <<plugins-{type}s-{plugin}-document_id>> |<<string,string>>|No
@@ -325,6 +327,26 @@ this defaults to a concatenation of the path parameter and "_bulk"
325
327
 
326
328
  The .cer or .pem file to validate the server's certificate
327
329
 
330
+ [id="plugins-{type}s-{plugin}-cloud_auth"]
331
+ ===== `cloud_auth`
332
+
333
+ * Value type is <<password,password>>
334
+ * There is no default value for this setting.
335
+
336
+ Cloud authentication string ("<username>:<password>" format) is an alternative for the `user`/`password` pair.
337
+
338
+ For mode details, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_auth[cloud documentation]
339
+
340
+ [id="plugins-{type}s-{plugin}-cloud_id"]
341
+ ===== `cloud_id`
342
+
343
+ * Value type is <<string,string>>
344
+ * There is no default value for this setting.
345
+
346
+ Cloud ID, from the Elastic Cloud web console. If set `hosts` should not be used.
347
+
348
+ For mode details, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_id[cloud documentation]
349
+
328
350
  [id="plugins-{type}s-{plugin}-doc_as_upsert"]
329
351
  ===== `doc_as_upsert`
330
352
 
@@ -340,8 +362,7 @@ Create a new document with source if `document_id` doesn't exist in Elasticsearc
340
362
  * Value type is <<string,string>>
341
363
  * There is no default value for this setting.
342
364
 
343
- The document ID for the index. Useful for overwriting existing entries in
344
- Elasticsearch with the same ID.
365
+ The document ID for the index. Useful for overwriting existing entries in Elasticsearch with the same ID.
345
366
 
346
367
  [id="plugins-{type}s-{plugin}-document_type"]
347
368
  ===== `document_type`
@@ -17,7 +17,7 @@ require "forwardable"
17
17
  # called `http.content_type.required`. If this option is set to `true`, and you
18
18
  # are using Logstash 2.4 through 5.2, you need to update the Elasticsearch output
19
19
  # plugin to version 6.2.5 or higher.
20
- #
20
+ #
21
21
  # ================================================================================
22
22
  #
23
23
  # This plugin is the recommended method of storing logs in Elasticsearch.
@@ -26,8 +26,8 @@ require "forwardable"
26
26
  # This output only speaks the HTTP protocol. HTTP is the preferred protocol for interacting with Elasticsearch as of Logstash 2.0.
27
27
  # We strongly encourage the use of HTTP over the node protocol for a number of reasons. HTTP is only marginally slower,
28
28
  # yet far easier to administer and work with. When using the HTTP protocol one may upgrade Elasticsearch versions without having
29
- # to upgrade Logstash in lock-step.
30
- #
29
+ # to upgrade Logstash in lock-step.
30
+ #
31
31
  # You can learn more about Elasticsearch at <https://www.elastic.co/products/elasticsearch>
32
32
  #
33
33
  # ==== Template management for Elasticsearch 5.x
@@ -122,6 +122,11 @@ class LogStash::Outputs::ElasticSearch < LogStash::Outputs::Base
122
122
  # Password to authenticate to a secure Elasticsearch cluster
123
123
  config :password, :validate => :password
124
124
 
125
+ # Cloud authentication string ("<username>:<password>" format) is an alternative for the `user`/`password` configuration.
126
+ #
127
+ # For mode details, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_auth[cloud documentation]
128
+ config :cloud_auth, :validate => :password
129
+
125
130
  # HTTP Path at which the Elasticsearch server lives. Use this if you must run Elasticsearch behind a proxy that remaps
126
131
  # the root path for the Elasticsearch HTTP API lives.
127
132
  # Note that if you use paths as components of URLs in the 'hosts' field you may
@@ -21,6 +21,8 @@ module LogStash; module Outputs; class ElasticSearch;
21
21
  # To support BWC, we check if DLQ exists in core (< 5.4). If it doesn't, we use nil to resort to previous behavior.
22
22
  @dlq_writer = dlq_enabled? ? execution_context.dlq_writer : nil
23
23
 
24
+ fill_hosts_from_cloud_id
25
+ fill_user_password_from_cloud_auth
24
26
  setup_hosts # properly sets @hosts
25
27
  build_client
26
28
  setup_after_successful_connection
@@ -118,6 +120,67 @@ module LogStash; module Outputs; class ElasticSearch;
118
120
  end
119
121
  end
120
122
 
123
+ def hosts_default?(hosts)
124
+ # NOTE: would be nice if pipeline allowed us a clean way to detect a config default :
125
+ hosts.is_a?(Array) && hosts.size == 1 && hosts.first.equal?(CommonConfigs::DEFAULT_HOST)
126
+ end
127
+ private :hosts_default?
128
+
129
+ def fill_hosts_from_cloud_id
130
+ return unless @cloud_id
131
+
132
+ if @hosts && !hosts_default?(@hosts)
133
+ raise LogStash::ConfigurationError, 'Both cloud_id and hosts specified, please only use one of those.'
134
+ end
135
+ @hosts = parse_host_uri_from_cloud_id(@cloud_id)
136
+ end
137
+
138
+ def fill_user_password_from_cloud_auth
139
+ return unless @cloud_auth
140
+
141
+ if @user || @password
142
+ raise LogStash::ConfigurationError, 'Both cloud_auth and user/password specified, please only use one.'
143
+ end
144
+ @user, @password = parse_user_password_from_cloud_auth(@cloud_auth)
145
+ params['user'], params['password'] = @user, @password
146
+ end
147
+
148
+ def parse_host_uri_from_cloud_id(cloud_id)
149
+ begin # might not be available on older LS
150
+ require 'logstash/util/cloud_setting_id'
151
+ rescue LoadError
152
+ raise LogStash::ConfigurationError, 'The cloud_id setting is not supported by your version of Logstash, ' +
153
+ 'please upgrade your installation (or set hosts instead).'
154
+ end
155
+
156
+ begin
157
+ cloud_id = LogStash::Util::CloudSettingId.new(cloud_id) # already does append ':{port}' to host
158
+ rescue ArgumentError => e
159
+ raise LogStash::ConfigurationError, e.message.to_s.sub(/Cloud Id/i, 'cloud_id')
160
+ end
161
+ cloud_uri = "#{cloud_id.elasticsearch_scheme}://#{cloud_id.elasticsearch_host}"
162
+ LogStash::Util::SafeURI.new(cloud_uri)
163
+ end
164
+ private :parse_host_uri_from_cloud_id
165
+
166
+ def parse_user_password_from_cloud_auth(cloud_auth)
167
+ begin # might not be available on older LS
168
+ require 'logstash/util/cloud_setting_auth'
169
+ rescue LoadError
170
+ raise LogStash::ConfigurationError, 'The cloud_auth setting is not supported by your version of Logstash, ' +
171
+ 'please upgrade your installation (or set user/password instead).'
172
+ end
173
+
174
+ cloud_auth = cloud_auth.value if cloud_auth.is_a?(LogStash::Util::Password)
175
+ begin
176
+ cloud_auth = LogStash::Util::CloudSettingAuth.new(cloud_auth)
177
+ rescue ArgumentError => e
178
+ raise LogStash::ConfigurationError, e.message.to_s.sub(/Cloud Auth/i, 'cloud_auth')
179
+ end
180
+ [ cloud_auth.username, cloud_auth.password ]
181
+ end
182
+ private :parse_user_password_from_cloud_auth
183
+
121
184
  def maximum_seen_major_version
122
185
  client.maximum_seen_major_version
123
186
  end
@@ -7,6 +7,8 @@ module LogStash; module Outputs; class ElasticSearch
7
7
  DEFAULT_POLICY = "logstash-policy"
8
8
  DEFAULT_ROLLOVER_ALIAS = 'logstash'
9
9
 
10
+ DEFAULT_HOST = ::LogStash::Util::SafeURI.new("//127.0.0.1")
11
+
10
12
  def self.included(mod)
11
13
  # The index to write events to. This can be dynamic using the `%{foo}` syntax.
12
14
  # The default value will partition your indices by day so you can more easily
@@ -93,9 +95,14 @@ module LogStash; module Outputs; class ElasticSearch
93
95
  # `["https://127.0.0.1:9200/mypath"]` (If using a proxy on a subpath)
94
96
  # It is important to exclude http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html[dedicated master nodes] from the `hosts` list
95
97
  # to prevent LS from sending bulk requests to the master nodes. So this parameter should only reference either data or client nodes in Elasticsearch.
96
- #
98
+ #
97
99
  # Any special characters present in the URLs here MUST be URL escaped! This means `#` should be put in as `%23` for instance.
98
- mod.config :hosts, :validate => :uri, :default => [::LogStash::Util::SafeURI.new("//127.0.0.1")], :list => true
100
+ mod.config :hosts, :validate => :uri, :default => [ DEFAULT_HOST ], :list => true
101
+
102
+ # Cloud ID, from the Elastic Cloud web console. If set `hosts` should not be used.
103
+ #
104
+ # For mode details, check out the https://www.elastic.co/guide/en/logstash/current/connecting-to-cloud.html#_cloud_id[cloud documentation]
105
+ mod.config :cloud_id, :validate => :string
99
106
 
100
107
  # Set upsert content for update mode.s
101
108
  # Create a new document with this parameter as json string if `document_id` doesn't exists
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-elasticsearch'
3
- s.version = '10.2.3'
3
+ s.version = '10.3.0'
4
4
  s.licenses = ['apache-2.0']
5
5
  s.summary = "Stores logs in Elasticsearch"
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -337,18 +337,9 @@ describe LogStash::Outputs::ElasticSearch do
337
337
 
338
338
  describe "SSL end to end" do
339
339
  let(:do_register) { false } # skip the register in the global before block, as is called here.
340
- let(:manticore_double) do
341
- double("manticoreX#{self.inspect}")
342
- end
343
340
 
344
341
  before(:each) do
345
- response_double = double("manticore response").as_null_object
346
- # Allow healtchecks
347
- allow(manticore_double).to receive(:head).with(any_args).and_return(response_double)
348
- allow(manticore_double).to receive(:get).with(any_args).and_return(response_double)
349
- allow(manticore_double).to receive(:close)
350
-
351
- allow(::Manticore::Client).to receive(:new).and_return(manticore_double)
342
+ stub_manticore_client!
352
343
  subject.register
353
344
  end
354
345
 
@@ -522,6 +513,75 @@ describe LogStash::Outputs::ElasticSearch do
522
513
  end
523
514
  end
524
515
 
516
+ describe "cloud.id" do
517
+ let(:do_register) { false }
518
+
519
+ let(:valid_cloud_id) do
520
+ 'sample:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvJGFjMzFlYmI5MDI0MTc3MzE1NzA0M2MzNGZkMjZmZDQ2OjkyNDMkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA6OTI0NA=='
521
+ end
522
+
523
+ let(:options) { { 'cloud_id' => valid_cloud_id } }
524
+
525
+ before(:each) do
526
+ stub_manticore_client!
527
+ end
528
+
529
+ it "should set host(s)" do
530
+ subject.register
531
+ es_url = subject.client.pool.urls.first
532
+ expect( es_url.to_s ).to eql('https://ac31ebb90241773157043c34fd26fd46.us-central1.gcp.cloud.es.io:9243/')
533
+ end
534
+
535
+ context 'invalid' do
536
+ let(:options) { { 'cloud_id' => 'invalid:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlv' } }
537
+
538
+ it "should fail" do
539
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /cloud_id.*? is invalid/
540
+ end
541
+ end
542
+
543
+ context 'hosts also set' do
544
+ let(:options) { { 'cloud_id' => valid_cloud_id, 'hosts' => [ 'localhost' ] } }
545
+
546
+ it "should fail" do
547
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /cloud_id and hosts/
548
+ end
549
+ end
550
+ end
551
+
552
+ describe "cloud.auth" do
553
+ let(:do_register) { false }
554
+
555
+ let(:options) { { 'cloud_auth' => LogStash::Util::Password.new('elastic:my-passwd-00') } }
556
+
557
+ before(:each) do
558
+ stub_manticore_client!
559
+ end
560
+
561
+ it "should set host(s)" do
562
+ subject.register
563
+ es_url = subject.client.pool.urls.first
564
+ expect( es_url.user ).to eql('elastic')
565
+ expect( es_url.password ).to eql('my-passwd-00')
566
+ end
567
+
568
+ context 'invalid' do
569
+ let(:options) { { 'cloud_auth' => 'invalid-format' } }
570
+
571
+ it "should fail" do
572
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /cloud_auth.*? format/
573
+ end
574
+ end
575
+
576
+ context 'user also set' do
577
+ let(:options) { { 'cloud_auth' => 'elastic:my-passwd-00', 'user' => 'another' } }
578
+
579
+ it "should fail" do
580
+ expect { subject.register }.to raise_error LogStash::ConfigurationError, /cloud_auth and user/
581
+ end
582
+ end
583
+ end
584
+
525
585
  context 'handling elasticsearch document-level status meant for the DLQ' do
526
586
  let(:options) { { "manage_template" => false } }
527
587
 
@@ -598,4 +658,18 @@ describe LogStash::Outputs::ElasticSearch do
598
658
  end
599
659
  end
600
660
  end
661
+
662
+ @private
663
+
664
+ def stub_manticore_client!(manticore_double = nil)
665
+ manticore_double ||= double("manticore #{self.inspect}")
666
+ response_double = double("manticore response").as_null_object
667
+ # Allow healtchecks
668
+ allow(manticore_double).to receive(:head).with(any_args).and_return(response_double)
669
+ allow(manticore_double).to receive(:get).with(any_args).and_return(response_double)
670
+ allow(manticore_double).to receive(:close)
671
+
672
+ allow(::Manticore::Client).to receive(:new).and_return(manticore_double)
673
+ end
674
+
601
675
  end
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: 10.2.3
4
+ version: 10.3.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2020-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement