logstash-input-s3 0.1.9 → 0.1.10

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
  SHA1:
3
- metadata.gz: 23e08a044fa6f77d449aabcb4a738dbc60ccced5
4
- data.tar.gz: d11d3dbff1bd06b7d51dca355f59c91ac2fdae29
3
+ metadata.gz: 817a07b535fd53bce46a4015d694c66bbacb62db
4
+ data.tar.gz: 998c24e3ea4faa4d76c825d5f128a2024b9429be
5
5
  SHA512:
6
- metadata.gz: f587cca3d88b16db9941c92f4826d28c693f91f640471b887a74729afd9097ffcbc3637e7808c6daad630d56fec4bb95253aa21fefa46acabf581759bb2387cc
7
- data.tar.gz: d132d27dea448bf1e894a6164e57e5d171f865f3f689131b355d156879dfe12944e428c4e4e9ca5a741a62e825c0d35ab8b4e8ab23070d3d6bdd1aa14a53b5eb
6
+ metadata.gz: b6c8086b030bf048fb96e85409a106ac222500311c1531e9836304d44725d51ec5e4cc7457bc68480aa6c2c632e1fe2e62296890a8c9ae7f77def69e9fedbc14
7
+ data.tar.gz: eeee1c7e0a47bbe091ccf3ce6b8e49c70c40a100f10f1311b3fe0d6d966d3ebfb286802c82d408eac27ff73416ad877ad02ee6ebad9d095491832457188aac6f
@@ -2,7 +2,6 @@
2
2
  require "logstash/inputs/base"
3
3
  require "logstash/namespace"
4
4
  require "logstash/plugin_mixins/aws_config"
5
-
6
5
  require "time"
7
6
  require "tmpdir"
8
7
  require "stud/interval"
@@ -70,6 +69,7 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
70
69
 
71
70
  public
72
71
  def register
72
+ require "fileutils"
73
73
  require "digest/md5"
74
74
  require "aws-sdk"
75
75
 
@@ -91,6 +91,8 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
91
91
  unless @backup_to_dir.nil?
92
92
  Dir.mkdir(@backup_to_dir, 0700) unless File.exists?(@backup_to_dir)
93
93
  end
94
+
95
+ FileUtils.mkdir_p(@temporary_directory) unless Dir.exist?(@temporary_directory)
94
96
  end # def register
95
97
 
96
98
  public
@@ -188,7 +190,8 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
188
190
 
189
191
  private
190
192
  def event_is_metadata?(event)
191
- line = event['message']
193
+ return false if event["message"].nil?
194
+ line = event["message"]
192
195
  version_metadata?(line) || fields_metadata?(line)
193
196
  end
194
197
 
@@ -293,11 +296,12 @@ class LogStash::Inputs::S3 < LogStash::Inputs::Base
293
296
  backup_to_dir(filename)
294
297
 
295
298
  delete_file_from_bucket(object)
299
+ FileUtils.remove_entry_secure(filename, true)
296
300
  end
297
301
 
298
302
  private
299
303
  def download_remote_file(remote_object, local_filename)
300
- @logger.debug("S3 input: Download remove file", :remote_key => remote_object.key, :local_filename => local_filename)
304
+ @logger.debug("S3 input: Download remote file", :remote_key => remote_object.key, :local_filename => local_filename)
301
305
  File.open(local_filename, 'wb') do |s3file|
302
306
  remote_object.read do |chunk|
303
307
  s3file.write(chunk)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-s3'
4
- s.version = '0.1.9'
4
+ s.version = '0.1.10'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Stream events from files from 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/plugin install gemname. This gem is not a stand-alone program"
@@ -27,5 +27,6 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency 'logstash-devutils'
28
28
  s.add_development_dependency 'simplecov'
29
29
  s.add_development_dependency 'coveralls'
30
+ s.add_development_dependency "logstash-codec-json"
30
31
  end
31
32
 
@@ -0,0 +1,2 @@
1
+ { "hello": "world" }
2
+ { "hello": "awesome world" }
@@ -2,24 +2,49 @@
2
2
  require "logstash/devutils/rspec/spec_helper"
3
3
  require "logstash/inputs/s3"
4
4
  require "logstash/errors"
5
- require "aws-sdk"
6
- require "stud/temporary"
7
5
  require_relative "../support/helpers"
6
+ require "stud/temporary"
7
+ require "aws-sdk"
8
+ require "fileutils"
8
9
 
9
10
  describe LogStash::Inputs::S3 do
10
- before do
11
- AWS.stub!
12
- Thread.abort_on_exception = true
13
- end
11
+ let(:temporary_directory) { Stud::Temporary.pathname }
14
12
  let(:day) { 3600 * 24 }
15
13
  let(:settings) {
16
14
  {
17
15
  "access_key_id" => "1234",
18
16
  "secret_access_key" => "secret",
19
- "bucket" => "logstash-test"
17
+ "bucket" => "logstash-test",
18
+ "temporary_directory" => temporary_directory
20
19
  }
21
20
  }
22
21
 
22
+ before do
23
+ AWS.stub!
24
+ Thread.abort_on_exception = true
25
+ end
26
+
27
+ describe "#register" do
28
+ subject { LogStash::Inputs::S3.new(settings) }
29
+
30
+ context "with temporary directory" do
31
+ let(:settings) {
32
+ {
33
+ "access_key_id" => "1234",
34
+ "secret_access_key" => "secret",
35
+ "bucket" => "logstash-test",
36
+ "temporary_directory" => temporary_directory
37
+ }
38
+ }
39
+
40
+ let(:temporary_directory) { Stud::Temporary.pathname }
41
+
42
+ it "creates the direct when it doesn't exist" do
43
+ expect { subject.register }.to change { Dir.exist?(temporary_directory) }.from(false).to(true)
44
+ end
45
+ end
46
+ end
47
+
23
48
  describe "#list_new_files" do
24
49
  before { allow_any_instance_of(AWS::S3::ObjectCollection).to receive(:with_prefix).with(nil) { objects_list } }
25
50
 
@@ -160,6 +185,18 @@ describe LogStash::Inputs::S3 do
160
185
  end
161
186
  end
162
187
 
188
+ shared_examples "generated events" do
189
+ it 'should process events' do
190
+ events = fetch_events(settings)
191
+ expect(events.size).to eq(2)
192
+ end
193
+
194
+ it "deletes the temporary file" do
195
+ events = fetch_events(settings)
196
+ expect(Dir.glob(File.join(temporary_directory, "*")).size).to eq(0)
197
+ end
198
+ end
199
+
163
200
  context 'when working with logs' do
164
201
  let(:objects) { [log] }
165
202
  let(:log) { double(:key => 'uncompressed.log', :last_modified => Time.now - 2 * day) }
@@ -170,32 +207,38 @@ describe LogStash::Inputs::S3 do
170
207
  expect(log).to receive(:read) { |&block| block.call(File.read(log_file)) }
171
208
  end
172
209
 
210
+ context "when event doesn't have a `message` field" do
211
+ let(:log_file) { File.join(File.dirname(__FILE__), '..', 'fixtures', 'json.log') }
212
+ let(:settings) {
213
+ {
214
+ "access_key_id" => "1234",
215
+ "secret_access_key" => "secret",
216
+ "bucket" => "logstash-test",
217
+ "codec" => "json",
218
+ }
219
+ }
220
+
221
+ include_examples "generated events"
222
+ end
223
+
173
224
  context 'compressed' do
174
225
  let(:log) { double(:key => 'log.gz', :last_modified => Time.now - 2 * day) }
175
226
  let(:log_file) { File.join(File.dirname(__FILE__), '..', 'fixtures', 'compressed.log.gz') }
176
227
 
177
- it 'should process events' do
178
- events = fetch_events(settings)
179
- expect(events.size).to eq(2)
180
- end
228
+
229
+ include_examples "generated events"
181
230
  end
182
231
 
183
232
  context 'plain text' do
184
233
  let(:log_file) { File.join(File.dirname(__FILE__), '..', 'fixtures', 'uncompressed.log') }
185
234
 
186
- it 'should process events' do
187
- events = fetch_events(settings)
188
- expect(events.size).to eq(2)
189
- end
235
+ include_examples "generated events"
190
236
  end
191
237
 
192
238
  context 'encoded' do
193
239
  let(:log_file) { File.join(File.dirname(__FILE__), '..', 'fixtures', 'invalid_utf8.log') }
194
240
 
195
- it 'should work with invalid utf-8 log event' do
196
- events = fetch_events(settings)
197
- expect(events.size).to eq(2)
198
- end
241
+ include_examples "generated events"
199
242
  end
200
243
 
201
244
  context 'cloudfront' do
@@ -204,13 +247,13 @@ describe LogStash::Inputs::S3 do
204
247
  it 'should extract metadata from cloudfront log' do
205
248
  events = fetch_events(settings)
206
249
 
207
- expect(events.size).to eq(2)
208
-
209
250
  events.each do |event|
210
251
  expect(event['cloudfront_fields']).to eq('date time x-edge-location c-ip x-event sc-bytes x-cf-status x-cf-client-id cs-uri-stem cs-uri-query c-referrer x-page-url​ c-user-agent x-sname x-sname-query x-file-ext x-sid')
211
252
  expect(event['cloudfront_version']).to eq('1.0')
212
253
  end
213
254
  end
255
+
256
+ include_examples "generated events"
214
257
  end
215
258
  end
216
259
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-20 00:00:00.000000000 Z
11
+ date: 2015-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: logstash-core
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - '>='
17
18
  - !ruby/object:Gem::Version
@@ -19,10 +20,7 @@ dependencies:
19
20
  - - <
20
21
  - !ruby/object:Gem::Version
21
22
  version: 2.0.0
22
- name: logstash-core
23
- prerelease: false
24
- type: :runtime
25
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: !ruby/object:Gem::Requirement
26
24
  requirements:
27
25
  - - '>='
28
26
  - !ruby/object:Gem::Version
@@ -30,76 +28,92 @@ dependencies:
30
28
  - - <
31
29
  - !ruby/object:Gem::Version
32
30
  version: 2.0.0
31
+ prerelease: false
32
+ type: :runtime
33
33
  - !ruby/object:Gem::Dependency
34
+ name: logstash-mixin-aws
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
34
40
  requirement: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - '>='
37
43
  - !ruby/object:Gem::Version
38
44
  version: '0'
39
- name: logstash-mixin-aws
40
45
  prerelease: false
41
46
  type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: stud
42
49
  version_requirements: !ruby/object:Gem::Requirement
43
50
  requirements:
44
- - - '>='
51
+ - - ~>
45
52
  - !ruby/object:Gem::Version
46
- version: '0'
47
- - !ruby/object:Gem::Dependency
53
+ version: 0.0.18
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
50
56
  - - ~>
51
57
  - !ruby/object:Gem::Version
52
58
  version: 0.0.18
53
- name: stud
54
59
  prerelease: false
55
60
  type: :runtime
61
+ - !ruby/object:Gem::Dependency
62
+ name: logstash-devutils
56
63
  version_requirements: !ruby/object:Gem::Requirement
57
64
  requirements:
58
- - - ~>
65
+ - - '>='
59
66
  - !ruby/object:Gem::Version
60
- version: 0.0.18
61
- - !ruby/object:Gem::Dependency
67
+ version: '0'
62
68
  requirement: !ruby/object:Gem::Requirement
63
69
  requirements:
64
70
  - - '>='
65
71
  - !ruby/object:Gem::Version
66
72
  version: '0'
67
- name: logstash-devutils
68
73
  prerelease: false
69
74
  type: :development
75
+ - !ruby/object:Gem::Dependency
76
+ name: simplecov
70
77
  version_requirements: !ruby/object:Gem::Requirement
71
78
  requirements:
72
79
  - - '>='
73
80
  - !ruby/object:Gem::Version
74
81
  version: '0'
75
- - !ruby/object:Gem::Dependency
76
82
  requirement: !ruby/object:Gem::Requirement
77
83
  requirements:
78
84
  - - '>='
79
85
  - !ruby/object:Gem::Version
80
86
  version: '0'
81
- name: simplecov
82
87
  prerelease: false
83
88
  type: :development
89
+ - !ruby/object:Gem::Dependency
90
+ name: coveralls
84
91
  version_requirements: !ruby/object:Gem::Requirement
85
92
  requirements:
86
93
  - - '>='
87
94
  - !ruby/object:Gem::Version
88
95
  version: '0'
89
- - !ruby/object:Gem::Dependency
90
96
  requirement: !ruby/object:Gem::Requirement
91
97
  requirements:
92
98
  - - '>='
93
99
  - !ruby/object:Gem::Version
94
100
  version: '0'
95
- name: coveralls
96
101
  prerelease: false
97
102
  type: :development
103
+ - !ruby/object:Gem::Dependency
104
+ name: logstash-codec-json
98
105
  version_requirements: !ruby/object:Gem::Requirement
99
106
  requirements:
100
107
  - - '>='
101
108
  - !ruby/object:Gem::Version
102
109
  version: '0'
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ prerelease: false
116
+ type: :development
103
117
  description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
104
118
  email: info@elastic.co
105
119
  executables: []
@@ -117,6 +131,7 @@ files:
117
131
  - spec/fixtures/cloudfront.log
118
132
  - spec/fixtures/compressed.log.gz
119
133
  - spec/fixtures/invalid_utf8.log
134
+ - spec/fixtures/json.log
120
135
  - spec/fixtures/uncompressed.log
121
136
  - spec/inputs/s3_spec.rb
122
137
  - spec/integration/s3_spec.rb
@@ -151,6 +166,7 @@ test_files:
151
166
  - spec/fixtures/cloudfront.log
152
167
  - spec/fixtures/compressed.log.gz
153
168
  - spec/fixtures/invalid_utf8.log
169
+ - spec/fixtures/json.log
154
170
  - spec/fixtures/uncompressed.log
155
171
  - spec/inputs/s3_spec.rb
156
172
  - spec/integration/s3_spec.rb