logstash-input-s3 3.7.0 → 3.8.3

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: 0b5ad2fe42e0003da67ebb3e1aad774f5bab3cb2afc07e4699fbfa5e84c0d472
4
- data.tar.gz: fb8691a6276181e17a2c80319247d04f11c8d547affff1b109f5447547eca4be
3
+ metadata.gz: 584ac32b0d4a7d0c3d478b90ad92d3170d5926d6d802d46b31a5075fc7bd27e9
4
+ data.tar.gz: 2a24ecd946ce52b6aa29acf3352314a26750c9b1350f33ecd685f0e206cd5d4a
5
5
  SHA512:
6
- metadata.gz: 3782d59c63fe4e53cb01dff9c7a431773fc69126dfc17c90ea45b8018205897dfabd8d942a732c37cb1740a4c924608110e81955205734523a9f5d1a928bed5d
7
- data.tar.gz: 3ff5255afa6d8a978a2231bc69a3c11dd9f354a90895e779be569971aaa75c34c456d35b979effbb0304801160cb15ce5f81b5967e121133d79e0a48f59638b7
6
+ metadata.gz: c306fb6d68a0b58cbb109508590d07cbd9cca9b67534e039c2fad2cc033e8756bdddd2ecde0f9177e8faf2ec65e4fb84f8b2e6576d65742d32f0867da0ab10b0
7
+ data.tar.gz: 293e978d3301e7d545927daa5a087bc433bf948d18662bf97cfb164dd59928c7e58719b6dcc7ede1fbed6c5d9b519c416ff44a043a5fd130123a1bf64d86231e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 3.8.3
2
+ - Fix missing `metadata` and `type` of the last event [#223](https://github.com/logstash-plugins/logstash-input-s3/pull/223)
3
+
4
+ ## 3.8.2
5
+ - Refactor: read sincedb time once per bucket listing [#233](https://github.com/logstash-plugins/logstash-input-s3/pull/233)
6
+
7
+ ## 3.8.1
8
+ - Feat: cast true/false values for additional_settings [#232](https://github.com/logstash-plugins/logstash-input-s3/pull/232)
9
+
10
+ ## 3.8.0
11
+ - Add ECS v8 support.
12
+
1
13
  ## 3.7.0
2
14
  - Add ECS support. [#228](https://github.com/logstash-plugins/logstash-input-s3/pull/228)
3
15
  - Fix missing file in cutoff time change. [#224](https://github.com/logstash-plugins/logstash-input-s3/pull/224)
data/docs/index.asciidoc CHANGED
@@ -189,7 +189,7 @@ Whether to delete processed files from the original bucket.
189
189
  * Value type is <<string,string>>
190
190
  * Supported values are:
191
191
  ** `disabled`: does not use ECS-compatible field names
192
- ** `v1`: uses metadata fields that are compatible with Elastic Common Schema
192
+ ** `v1`,`v8`: uses metadata fields that are compatible with Elastic Common Schema
193
193
 
194
194
  Controls this plugin's compatibility with the
195
195
  {ecs-ref}[Elastic Common Schema (ECS)].
@@ -28,7 +28,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
28
28
  java_import java.util.zip.ZipException
29
29
 
30
30
  include LogStash::PluginMixins::AwsConfig::V2
31
- include LogStash::PluginMixins::ECSCompatibilitySupport(:disabled, :v1)
31
+ include LogStash::PluginMixins::ECSCompatibilitySupport(:disabled, :v1, :v8 => :v1)
32
32
 
33
33
  config_name "s3"
34
34
 
@@ -139,6 +139,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
139
139
  objects = []
140
140
  found = false
141
141
  current_time = Time.now
142
+ sincedb_time = sincedb.read
142
143
  begin
143
144
  @s3bucket.objects(:prefix => @prefix).each do |log|
144
145
  found = true
@@ -147,7 +148,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
147
148
  @logger.debug('Ignoring', :key => log.key)
148
149
  elsif log.content_length <= 0
149
150
  @logger.debug('Object Zero Length', :key => log.key)
150
- elsif !sincedb.newer?(log.last_modified)
151
+ elsif log.last_modified <= sincedb_time
151
152
  @logger.debug('Object Not Modified', :key => log.key)
152
153
  elsif log.last_modified > (current_time - CUTOFF_SECOND).utc # file modified within last two seconds will be processed in next cycle
153
154
  @logger.debug('Object Modified After Cutoff Time', :key => log.key)
@@ -234,30 +235,34 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
234
235
  @logger.debug('Event is metadata, updating the current cloudfront metadata', :event => event)
235
236
  update_metadata(metadata, event)
236
237
  else
237
- decorate(event)
238
-
239
- if @include_object_properties
240
- event.set("[@metadata][s3]", object.data.to_h)
241
- else
242
- event.set("[@metadata][s3]", {})
243
- end
244
-
245
- event.set("[@metadata][s3][key]", object.key)
246
- event.set(@cloudfront_version_key, metadata[:cloudfront_version]) unless metadata[:cloudfront_version].nil?
247
- event.set(@cloudfront_fields_key, metadata[:cloudfront_fields]) unless metadata[:cloudfront_fields].nil?
248
-
249
- queue << event
238
+ push_decoded_event(queue, metadata, object, event)
250
239
  end
251
240
  end
252
241
  end
253
242
  # #ensure any stateful codecs (such as multi-line ) are flushed to the queue
254
243
  @codec.flush do |event|
255
- queue << event
244
+ push_decoded_event(queue, metadata, object, event)
256
245
  end
257
246
 
258
247
  return true
259
248
  end # def process_local_log
260
249
 
250
+ def push_decoded_event(queue, metadata, object, event)
251
+ decorate(event)
252
+
253
+ if @include_object_properties
254
+ event.set("[@metadata][s3]", object.data.to_h)
255
+ else
256
+ event.set("[@metadata][s3]", {})
257
+ end
258
+
259
+ event.set("[@metadata][s3][key]", object.key)
260
+ event.set(@cloudfront_version_key, metadata[:cloudfront_version]) unless metadata[:cloudfront_version].nil?
261
+ event.set(@cloudfront_fields_key, metadata[:cloudfront_fields]) unless metadata[:cloudfront_fields].nil?
262
+
263
+ queue << event
264
+ end
265
+
261
266
  def event_is_metadata?(event)
262
267
  return false unless event.get("message").class == String
263
268
  line = event.get("message")
@@ -353,14 +358,22 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
353
358
  end
354
359
 
355
360
  def symbolized_settings
356
- @symbolized_settings ||= symbolize(@additional_settings)
361
+ @symbolized_settings ||= symbolize_keys_and_cast_true_false(@additional_settings)
357
362
  end
358
363
 
359
- def symbolize(hash)
360
- return hash unless hash.is_a?(Hash)
361
- symbolized = {}
362
- hash.each { |key, value| symbolized[key.to_sym] = symbolize(value) }
363
- symbolized
364
+ def symbolize_keys_and_cast_true_false(hash)
365
+ case hash
366
+ when Hash
367
+ symbolized = {}
368
+ hash.each { |key, value| symbolized[key.to_sym] = symbolize_keys_and_cast_true_false(value) }
369
+ symbolized
370
+ when 'true'
371
+ true
372
+ when 'false'
373
+ false
374
+ else
375
+ hash
376
+ end
364
377
  end
365
378
 
366
379
  def ignore_filename?(filename)
@@ -456,10 +469,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
456
469
  @sincedb_path = file
457
470
  end
458
471
 
459
- def newer?(date)
460
- date > read
461
- end
462
-
472
+ # @return [Time]
463
473
  def read
464
474
  if ::File.exists?(@sincedb_path)
465
475
  content = ::File.read(@sincedb_path).chomp.strip
@@ -471,7 +481,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
471
481
  end
472
482
 
473
483
  def write(since = nil)
474
- since = Time.now() if since.nil?
484
+ since = Time.now if since.nil?
475
485
  ::File.open(@sincedb_path, 'w') { |file| file.write(since.to_s) }
476
486
  end
477
487
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-s3'
4
- s.version = '3.7.0'
4
+ s.version = '3.8.3'
5
5
  s.licenses = ['Apache-2.0']
6
6
  s.summary = "Streams events from files in a S3 bucket"
7
7
  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"
@@ -27,5 +27,5 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency 'logstash-devutils'
28
28
  s.add_development_dependency "logstash-codec-json"
29
29
  s.add_development_dependency "logstash-codec-multiline"
30
- s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.1'
30
+ s.add_runtime_dependency 'logstash-mixin-ecs_compatibility_support', '~>1.2'
31
31
  end
@@ -42,7 +42,9 @@ describe LogStash::Inputs::S3 do
42
42
  expect_any_instance_of(LogStash::Inputs::S3).to receive(:list_new_files).and_return(TestInfiniteS3Object.new(s3_obj))
43
43
  end
44
44
 
45
- it_behaves_like "an interruptible input plugin"
45
+ it_behaves_like "an interruptible input plugin" do
46
+ let(:allowed_lag) { 16 } if LOGSTASH_VERSION.split('.').first.to_i <= 6
47
+ end
46
48
  end
47
49
 
48
50
  describe "#register" do
@@ -82,10 +84,10 @@ describe LogStash::Inputs::S3 do
82
84
  end
83
85
 
84
86
  describe "additional_settings" do
85
- context 'when force_path_style is set' do
87
+ context "supported settings" do
86
88
  let(:settings) {
87
89
  {
88
- "additional_settings" => { "force_path_style" => true },
90
+ "additional_settings" => { "force_path_style" => 'true', "ssl_verify_peer" => 'false', "profile" => 'logstash' },
89
91
  "bucket" => "logstash-test",
90
92
  }
91
93
  }
@@ -93,7 +95,7 @@ describe LogStash::Inputs::S3 do
93
95
  it 'should instantiate AWS::S3 clients with force_path_style set' do
94
96
  expect(Aws::S3::Resource).to receive(:new).with({
95
97
  :region => subject.region,
96
- :force_path_style => true
98
+ :force_path_style => true, :ssl_verify_peer => false, :profile => 'logstash'
97
99
  }).and_call_original
98
100
 
99
101
  subject.send(:get_s3object)
@@ -193,6 +195,7 @@ describe LogStash::Inputs::S3 do
193
195
  it 'should log that no files were found in the bucket' do
194
196
  plugin = LogStash::Inputs::S3.new(config)
195
197
  plugin.register
198
+ allow(plugin.logger).to receive(:info).with(/Using the provided sincedb_path/, anything)
196
199
  expect(plugin.logger).to receive(:info).with(/No files found/, anything)
197
200
  expect(plugin.list_new_files).to be_empty
198
201
  end
@@ -326,6 +329,7 @@ describe LogStash::Inputs::S3 do
326
329
  events = fetch_events(config)
327
330
  expect(events.size).to eq(events_to_process)
328
331
  expect(events[0].get("[@metadata][s3][key]")).to eql log.key
332
+ expect(events[1].get("[@metadata][s3][key]")).to eql log.key
329
333
  end
330
334
 
331
335
  it "deletes the temporary file" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.0
4
+ version: 3.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-24 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -105,7 +105,7 @@ dependencies:
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '1.1'
108
+ version: '1.2'
109
109
  name: logstash-mixin-ecs_compatibility_support
110
110
  prerelease: false
111
111
  type: :runtime
@@ -113,7 +113,7 @@ dependencies:
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '1.1'
116
+ version: '1.2'
117
117
  description: This gem is a Logstash plugin required to be installed on top of the
118
118
  Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
119
119
  gem is not a stand-alone program
@@ -167,8 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  - !ruby/object:Gem::Version
168
168
  version: '0'
169
169
  requirements: []
170
- rubyforge_project:
171
- rubygems_version: 2.6.13
170
+ rubygems_version: 3.1.6
172
171
  signing_key:
173
172
  specification_version: 4
174
173
  summary: Streams events from files in a S3 bucket