fluent-plugin-elb-access-log 0.3.7 → 0.4.0

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: c576eb75af304916ce519a79377d8fe14204a8fd
4
- data.tar.gz: 659724f105a175477d751d33924a4eb862c9af8e
3
+ metadata.gz: 1c73cb54a193ee0d843ee5d038d2f7cf4e8c7cdf
4
+ data.tar.gz: 4da300a290b3d16f5eeffad7b4e5ee3ccbf66264
5
5
  SHA512:
6
- metadata.gz: 9b4f3229cc5bcded62629cf3e818f013edd7e7d6faab21c1bbb46f1b029bfc6c45bcabb7ebec72e5c0f544417a662ee0b19ebe85a7f3df3bd3b62430ef64942a
7
- data.tar.gz: 157d4fa797fc74bb6c78e2ba09c36279fc44b743a342cbeba17e8cdd7161ef2f3e3d4ad28a54ea8f343629f33b8c6a2de1f2f7ab3a030d5f11031818f0165cfb
6
+ metadata.gz: aed16e4faac1a13e8f9138443d925645f06110cd3168df5726596549896f2242a68e241c38e062c0c898f5c494cfc4d18888070630ec64367851fd0df0a09368
7
+ data.tar.gz: 2cb130b4b344352c6ebfa514288cf7705ca1c4da5893e7ff1d51594b416f34bb3d53b4bfa6c2994a837922c976a71e5e5ffda5ede54118dd3402228dc62c5a03
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.simplecov ADDED
@@ -0,0 +1,4 @@
1
+ SimpleCov.start do
2
+ # exclude directories and files
3
+ add_filter "/spec/"
4
+ end
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # fluent-plugin-elb-access-log
2
2
 
3
- Fluentd input plugin for [AWS ELB Access Logs](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/access-log-collection.html).
3
+ Fluentd input plugin for AWS ELB Access Logs.
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/fluent-plugin-elb-access-log.svg)](http://badge.fury.io/rb/fluent-plugin-elb-access-log)
6
6
  [![Build Status](https://travis-ci.org/winebarrel/fluent-plugin-elb-access-log.svg?branch=master)](https://travis-ci.org/winebarrel/fluent-plugin-elb-access-log)
@@ -55,6 +55,8 @@ Or install it yourself as:
55
55
 
56
56
  ### CLB
57
57
 
58
+ see http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/access-log-collection.html
59
+
58
60
  ```json
59
61
  // elb.access_log:
60
62
  {
@@ -90,6 +92,8 @@ Or install it yourself as:
90
92
 
91
93
  ### ALB
92
94
 
95
+ see http://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html
96
+
93
97
  ```json
94
98
  {
95
99
  "type": "https",
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'fluentd'
21
+ spec.add_dependency 'fluentd', '>= 0.14'
22
22
  spec.add_dependency 'aws-sdk-s3', '~> 1.8'
23
23
  spec.add_dependency 'addressable'
24
24
  spec.add_development_dependency 'bundler'
@@ -1,7 +1,15 @@
1
+ require 'csv'
2
+ require 'fileutils'
3
+ require 'logger'
4
+ require 'time'
5
+ require 'addressable/uri'
6
+ require 'aws-sdk-s3'
7
+ require 'zlib'
8
+
1
9
  require 'fluent/input'
2
10
  require 'fluent_plugin_elb_access_log/version'
3
11
 
4
- class Fluent::ElbAccessLogInput < Fluent::Input
12
+ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
5
13
  Fluent::Plugin.register_input('elb_access_log', self)
6
14
 
7
15
  USER_AGENT_SUFFIX = "fluent-plugin-elb-access-log/#{FluentPluginElbAccessLog::VERSION}"
@@ -52,14 +60,6 @@ class Fluent::ElbAccessLogInput < Fluent::Input
52
60
 
53
61
  ELB_TYPES = %(clb alb)
54
62
 
55
- unless method_defined?(:log)
56
- define_method('log') { $log }
57
- end
58
-
59
- unless method_defined?(:router)
60
- define_method('router') { Fluent::Engine }
61
- end
62
-
63
63
  config_param :elb_type, :string, default: 'clb'
64
64
  config_param :aws_key_id, :string, default: nil, secret: true
65
65
  config_param :aws_sec_key, :string, default: nil, secret: true
@@ -80,17 +80,6 @@ class Fluent::ElbAccessLogInput < Fluent::Input
80
80
  config_param :sampling_interval, :integer, default: 1
81
81
  config_param :debug, :bool, default: false
82
82
 
83
- def initialize
84
- super
85
- require 'csv'
86
- require 'fileutils'
87
- require 'logger'
88
- require 'time'
89
- require 'addressable/uri'
90
- require 'aws-sdk-s3'
91
- require 'zlib'
92
- end
93
-
94
83
  def configure(conf)
95
84
  super
96
85
 
@@ -212,8 +201,13 @@ class Fluent::ElbAccessLogInput < Fluent::Input
212
201
  records = parse_log(access_log)
213
202
 
214
203
  records.each do |record|
215
- time = Time.parse(record['timestamp'])
216
- router.emit(@tag, time.to_i, record)
204
+ begin
205
+ time = Time.parse(record['timestamp'])
206
+ router.emit(@tag, time.to_i, record)
207
+ rescue ArgumentError => e
208
+ @log.warn("#{e.message}: #{record}")
209
+ @log.warn('A record that has bad timestamp is not emitted.')
210
+ end
217
211
  end
218
212
  end
219
213
 
@@ -226,9 +220,6 @@ class Fluent::ElbAccessLogInput < Fluent::Input
226
220
  line = parse_clb_line(line)
227
221
  when 'alb'
228
222
  line = parse_alb_line(line)
229
- else
230
- # It is a bug if an exception is thrown
231
- raise 'must not happen'
232
223
  end
233
224
 
234
225
  parsed_access_log << line if line
@@ -238,32 +229,24 @@ class Fluent::ElbAccessLogInput < Fluent::Input
238
229
  access_log_fields = ACCESS_LOG_FIELDS.fetch(@elb_type)
239
230
 
240
231
  parsed_access_log.each do |row|
241
- begin
242
- record = Hash[access_log_fields.keys.zip(row)]
232
+ record = Hash[access_log_fields.keys.zip(row)]
243
233
 
244
- access_log_fields.each do |name, conv|
245
- record[name] = record[name].send(conv) if conv
246
- end
234
+ access_log_fields.each do |name, conv|
235
+ record[name] = record[name].send(conv) if conv
236
+ end
247
237
 
248
- split_address_port!(record, 'client')
238
+ split_address_port!(record, 'client')
249
239
 
250
- case @elb_type
251
- when 'clb'
252
- split_address_port!(record, 'backend')
253
- when 'alb'
254
- split_address_port!(record, 'target')
255
- else
256
- # It is a bug if an exception is thrown
257
- raise 'must not happen'
258
- end
240
+ case @elb_type
241
+ when 'clb'
242
+ split_address_port!(record, 'backend')
243
+ when 'alb'
244
+ split_address_port!(record, 'target')
245
+ end
259
246
 
260
- parse_request!(record)
247
+ parse_request!(record)
261
248
 
262
- records << record
263
- rescue ArgumentError => e
264
- @log.warn("#{e.message}: #{row}")
265
- @log.warn('A record that has bad timestamp is not emitted.')
266
- end
249
+ records << record
267
250
  end
268
251
 
269
252
  records
@@ -289,7 +272,7 @@ class Fluent::ElbAccessLogInput < Fluent::Input
289
272
  parsed[13] = ssl_cipher
290
273
  parsed[14] = ssl_protocol
291
274
  rescue => e2
292
- @log.warn("#{e.message}: #{line}")
275
+ @log.warn("#{e.message}: #{e2.message}: #{line}")
293
276
  end
294
277
  end
295
278
 
@@ -320,7 +303,7 @@ class Fluent::ElbAccessLogInput < Fluent::Input
320
303
  parsed[18] = unquote(domain_name)
321
304
  parsed[19] = unquote(chosen_cert_arn)
322
305
  rescue => e2
323
- @log.warn("#{e.message}: #{line}")
306
+ @log.warn("#{e.message}: #{e2.message}: #{line}")
324
307
  end
325
308
  end
326
309
 
@@ -443,4 +426,4 @@ class Fluent::ElbAccessLogInput < Fluent::Input
443
426
  @log.error_backtrace(e.backtrace)
444
427
  end
445
428
  end # TimerWatcher
446
- end # Fluent::ElbAccessLogInput
429
+ end # Fluent::Plugin::ElbAccessLogInput
@@ -1,3 +1,3 @@
1
1
  module FluentPluginElbAccessLog
2
- VERSION = '0.3.7'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -1,9 +1,9 @@
1
- describe Fluent::ElbAccessLogInput do
1
+ describe Fluent::Plugin::ElbAccessLogInput do
2
2
  let(:account_id) { '123456789012' }
3
3
  let(:s3_bucket) { 'my-bucket' }
4
4
  let(:region) { 'us-west-1' }
5
5
  let(:driver) { create_driver(fluentd_conf) }
6
- let(:client){ Aws::S3::Client.new(stub_responses: true) }
6
+ let!(:client){ Aws::S3::Client.new(stub_responses: true) }
7
7
 
8
8
  let(:fluentd_conf) do
9
9
  {
@@ -29,9 +29,9 @@ describe Fluent::ElbAccessLogInput do
29
29
 
30
30
  before do
31
31
  Timecop.freeze(today)
32
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:client) { client }
33
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:load_history) { [] }
34
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
32
+ allow(Aws::S3::Client).to receive(:new) { client }
33
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:load_history) { [] }
34
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
35
35
  allow(FileUtils).to receive(:touch)
36
36
  expect(driver.instance.log).to_not receive(:error)
37
37
  end
@@ -40,7 +40,7 @@ describe Fluent::ElbAccessLogInput do
40
40
  Timecop.return
41
41
  end
42
42
 
43
- subject { driver.emits }
43
+ subject { driver.events }
44
44
 
45
45
  context 'when access log does not exist' do
46
46
  before do
@@ -51,7 +51,7 @@ describe Fluent::ElbAccessLogInput do
51
51
  expect(driver.instance).to receive(:save_history)
52
52
  expect(driver.instance.log).to_not receive(:warn)
53
53
 
54
- driver.run
54
+ driver_run(driver)
55
55
  end
56
56
 
57
57
  it { is_expected.to be_empty }
@@ -97,7 +97,7 @@ https 2015-05-25T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
97
97
  expect(driver.instance).to receive(:save_history)
98
98
  expect(driver.instance.log).to_not receive(:warn)
99
99
 
100
- driver.run
100
+ driver_run(driver)
101
101
  end
102
102
 
103
103
  let(:expected_emits) do
@@ -302,7 +302,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
302
302
  allow(Addressable::URI).to receive(:parse).and_raise('parse error')
303
303
  expect(driver.instance.log).to receive(:warn).with('parse error: http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/')
304
304
 
305
- driver.run
305
+ driver_run(driver)
306
306
  end
307
307
 
308
308
  let(:expected_emits) do
@@ -376,7 +376,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
376
376
  expect(driver.instance).to receive(:save_history)
377
377
  expect(driver.instance.log).to_not receive(:warn)
378
378
 
379
- driver.run
379
+ driver_run(driver)
380
380
  end
381
381
 
382
382
  let(:expected_emits) do
@@ -449,7 +449,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
449
449
  expect(driver.instance).to receive(:save_history)
450
450
  expect(driver.instance.log).to_not receive(:warn)
451
451
 
452
- driver.run
452
+ driver_run(driver)
453
453
  end
454
454
 
455
455
  let(:expected_emits) do
@@ -521,7 +521,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
521
521
  expect(CSV).to receive(:parse_line).and_raise('parse error')
522
522
  expect(driver.instance.log).to_not receive(:warn)
523
523
 
524
- driver.run
524
+ driver_run(driver)
525
525
  end
526
526
 
527
527
  let(:expected_emits) do
@@ -610,7 +610,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
610
610
  expect(driver.instance).to receive(:save_history)
611
611
  expect(driver.instance.log).to_not receive(:warn)
612
612
 
613
- driver.run
613
+ driver_run(driver)
614
614
  end
615
615
 
616
616
  it { is_expected.to be_empty }
@@ -639,7 +639,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
639
639
  expect(driver.instance).to receive(:save_history)
640
640
  expect(driver.instance.log).to_not receive(:warn)
641
641
 
642
- driver.run
642
+ driver_run(driver)
643
643
  end
644
644
 
645
645
  it { is_expected.to be_empty }
@@ -675,7 +675,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
675
675
 
676
676
  context 'when history.length <= 100' do
677
677
  before do
678
- driver.run
678
+ driver_run(driver)
679
679
  end
680
680
 
681
681
  it { is_expected.to eq 1 }
@@ -684,7 +684,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
684
684
  context 'when history.length > 100' do
685
685
  before do
686
686
  history.concat (1..100).map(&:to_s)
687
- driver.run
687
+ driver_run(driver)
688
688
  end
689
689
 
690
690
  it { is_expected.to eq 100 }
@@ -714,7 +714,7 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
714
714
  expect(driver.instance).to receive(:save_history)
715
715
  expect(driver.instance.log).to_not receive(:warn)
716
716
 
717
- driver.run
717
+ driver_run(driver)
718
718
  end
719
719
 
720
720
  let(:expected_emits) do
@@ -760,4 +760,94 @@ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
760
760
 
761
761
  it { is_expected.to match_table expected_emits }
762
762
  end
763
+
764
+ context 'when inflate fails' do
765
+ let(:today_access_log) do
766
+ <<-EOS
767
+ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.000053 0.000913 0.000036 200 200 0 3 "GET http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app/xxx "Root=xxx" "-" "arn:aws:acm:ap-northeast-1:123456789012:certificate/xxx"
768
+ EOS
769
+ end
770
+
771
+ before do
772
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: yesterday_prefix) { [] }
773
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: tomorrow_prefix) { [] }
774
+
775
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: today_prefix) do
776
+ [double('today_objects', contents: [double('today_object', key: today_object_key)])]
777
+ end
778
+
779
+ expect(client).to receive(:get_object).with(bucket: s3_bucket, key: today_object_key) do
780
+ double('today_s3_object', body: StringIO.new(today_access_log))
781
+ end
782
+
783
+ expect(driver.instance).to receive(:save_history)
784
+ end
785
+
786
+ specify do
787
+ expect(driver.instance.log).to receive(:warn).with('incorrect header check: "https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.')
788
+ driver_run(driver)
789
+ end
790
+ end
791
+
792
+ context 'when bad timestamp' do
793
+ let(:today_access_log) do
794
+ Zlib::Deflate.deflate(<<-EOS)
795
+ https xxx hoge 14.14.124.20:57673 10.0.199.184:80 0.000053 0.000913 0.000036 200 200 0 3 "GET http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.30.0" ssl_cipher ssl_protocol arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app/xxx "Root=xxx" "-" "arn:aws:acm:ap-northeast-1:123456789012:certificate/xxx"
796
+ EOS
797
+ end
798
+
799
+ before do
800
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: yesterday_prefix) { [] }
801
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: tomorrow_prefix) { [] }
802
+
803
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: today_prefix) do
804
+ [double('today_objects', contents: [double('today_object', key: today_object_key)])]
805
+ end
806
+
807
+ expect(client).to receive(:get_object).with(bucket: s3_bucket, key: today_object_key) do
808
+ double('today_s3_object', body: StringIO.new(today_access_log))
809
+ end
810
+
811
+ expect(driver.instance).to receive(:save_timestamp).with(today)
812
+ expect(driver.instance).to receive(:save_history)
813
+ end
814
+
815
+ specify do
816
+ expect(driver.instance.log).to receive(:warn).with(/no time information in "xxx":/)
817
+ expect(driver.instance.log).to receive(:warn).with('A record that has bad timestamp is not emitted.')
818
+ driver_run(driver)
819
+ end
820
+ end
821
+
822
+ context 'when unquote fails' do
823
+ let(:today_access_log) do
824
+ Zlib::Deflate.deflate(<<-EOS)
825
+ https 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.000053 0.000913 0.000036 200 200 0 3 "GET http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.30.0" ssl_cipher ssl_protocol arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app/xxx "Root=xxx" "-" "arn:aws:acm:ap-northeast-1:123456789012:certificate/xxx"
826
+ EOS
827
+ end
828
+
829
+ before do
830
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: yesterday_prefix) { [] }
831
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: tomorrow_prefix) { [] }
832
+
833
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: today_prefix) do
834
+ [double('today_objects', contents: [double('today_object', key: today_object_key)])]
835
+ end
836
+
837
+ expect(client).to receive(:get_object).with(bucket: s3_bucket, key: today_object_key) do
838
+ double('today_s3_object', body: StringIO.new(today_access_log))
839
+ end
840
+
841
+ expect(driver.instance).to receive(:save_timestamp).with(today)
842
+ expect(driver.instance).to receive(:save_history)
843
+
844
+ expect(CSV).to receive(:parse_line).and_raise('parse error')
845
+ expect(driver.instance).to receive(:unquote).and_raise('unquote error')
846
+ end
847
+
848
+ specify do
849
+ expect(driver.instance.log).to receive(:warn).with(/parse error: unquote error:/)
850
+ driver_run(driver)
851
+ end
852
+ end
763
853
  end
@@ -1,9 +1,9 @@
1
- describe Fluent::ElbAccessLogInput do
1
+ describe Fluent::Plugin::ElbAccessLogInput do
2
2
  let(:account_id) { '123456789012' }
3
3
  let(:s3_bucket) { 'my-bucket' }
4
4
  let(:region) { 'us-west-1' }
5
5
  let(:driver) { create_driver(fluentd_conf) }
6
- let(:client){ Aws::S3::Client.new(stub_responses: true) }
6
+ let!(:client){ Aws::S3::Client.new(stub_responses: true) }
7
7
 
8
8
  let(:fluentd_conf) do
9
9
  {
@@ -28,18 +28,18 @@ describe Fluent::ElbAccessLogInput do
28
28
 
29
29
  before do
30
30
  Timecop.freeze(today)
31
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:client) { client }
32
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:load_history) { [] }
33
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
31
+ allow(Aws::S3::Client).to receive(:new) { client }
32
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:load_history) { [] }
33
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
34
34
  allow(FileUtils).to receive(:touch)
35
35
  expect(driver.instance.log).to_not receive(:error)
36
- end
36
+ end
37
37
 
38
38
  after do
39
39
  Timecop.return
40
40
  end
41
41
 
42
- subject { driver.emits }
42
+ subject { driver.events }
43
43
 
44
44
  context 'when access log does not exist' do
45
45
  before do
@@ -50,7 +50,7 @@ describe Fluent::ElbAccessLogInput do
50
50
  expect(driver.instance).to receive(:save_history)
51
51
  expect(driver.instance.log).to_not receive(:warn)
52
52
 
53
- driver.run
53
+ driver_run(driver)
54
54
  end
55
55
 
56
56
  it { is_expected.to be_empty }
@@ -96,7 +96,7 @@ describe Fluent::ElbAccessLogInput do
96
96
  expect(driver.instance).to receive(:save_history)
97
97
  expect(driver.instance.log).to_not receive(:warn)
98
98
 
99
- driver.run
99
+ driver_run(driver)
100
100
  end
101
101
 
102
102
  let(:expected_emits) do
@@ -272,7 +272,7 @@ describe Fluent::ElbAccessLogInput do
272
272
  allow(Addressable::URI).to receive(:parse).and_raise('parse error')
273
273
  expect(driver.instance.log).to receive(:warn).with('parse error: http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/')
274
274
 
275
- driver.run
275
+ driver_run(driver)
276
276
  end
277
277
 
278
278
  let(:expected_emits) do
@@ -338,7 +338,7 @@ describe Fluent::ElbAccessLogInput do
338
338
  expect(driver.instance).to receive(:save_history)
339
339
  expect(driver.instance.log).to_not receive(:warn)
340
340
 
341
- driver.run
341
+ driver_run(driver)
342
342
  end
343
343
 
344
344
  let(:expected_emits) do
@@ -403,7 +403,7 @@ describe Fluent::ElbAccessLogInput do
403
403
  expect(driver.instance).to receive(:save_history)
404
404
  expect(driver.instance.log).to_not receive(:warn)
405
405
 
406
- driver.run
406
+ driver_run(driver)
407
407
  end
408
408
 
409
409
  let(:expected_emits) do
@@ -468,7 +468,7 @@ describe Fluent::ElbAccessLogInput do
468
468
  expect(CSV).to receive(:parse_line).and_raise('parse error')
469
469
  expect(driver.instance.log).to_not receive(:warn)
470
470
 
471
- driver.run
471
+ driver_run(driver)
472
472
  end
473
473
 
474
474
  let(:expected_emits) do
@@ -546,7 +546,7 @@ describe Fluent::ElbAccessLogInput do
546
546
  expect(driver.instance).to receive(:save_history)
547
547
  expect(driver.instance.log).to_not receive(:warn)
548
548
 
549
- driver.run
549
+ driver_run(driver)
550
550
  end
551
551
 
552
552
  it { is_expected.to be_empty }
@@ -575,7 +575,7 @@ describe Fluent::ElbAccessLogInput do
575
575
  expect(driver.instance).to receive(:save_history)
576
576
  expect(driver.instance.log).to_not receive(:warn)
577
577
 
578
- driver.run
578
+ driver_run(driver)
579
579
  end
580
580
 
581
581
  it { is_expected.to be_empty }
@@ -611,7 +611,7 @@ describe Fluent::ElbAccessLogInput do
611
611
 
612
612
  context 'when history.length <= 100' do
613
613
  before do
614
- driver.run
614
+ driver_run(driver)
615
615
  end
616
616
 
617
617
  it { is_expected.to eq 1 }
@@ -620,7 +620,7 @@ describe Fluent::ElbAccessLogInput do
620
620
  context 'when history.length > 100' do
621
621
  before do
622
622
  history.concat (1..100).map(&:to_s)
623
- driver.run
623
+ driver_run(driver)
624
624
  end
625
625
 
626
626
  it { is_expected.to eq 100 }
@@ -650,7 +650,7 @@ describe Fluent::ElbAccessLogInput do
650
650
  expect(driver.instance).to receive(:save_history)
651
651
  expect(driver.instance.log).to_not receive(:warn)
652
652
 
653
- driver.run
653
+ driver_run(driver)
654
654
  end
655
655
 
656
656
  let(:expected_emits) do
@@ -689,4 +689,36 @@ describe Fluent::ElbAccessLogInput do
689
689
 
690
690
  it { is_expected.to match_table expected_emits }
691
691
  end
692
+
693
+ context 'when no user_agent' do
694
+ let(:today_access_log) do
695
+ <<-EOS
696
+ 2015-05-24T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.000053 0.000913 0.000036 200 200 0 3 "GET http://hoge-1876938939.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.30.0" ssl_cipher ssl_protocol
697
+ EOS
698
+ end
699
+
700
+ before do
701
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: yesterday_prefix) { [] }
702
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: tomorrow_prefix) { [] }
703
+
704
+ expect(client).to receive(:list_objects).with(bucket: s3_bucket, prefix: today_prefix) do
705
+ [double('today_objects', contents: [double('today_object', key: today_object_key)])]
706
+ end
707
+
708
+ expect(client).to receive(:get_object).with(bucket: s3_bucket, key: today_object_key) do
709
+ double('today_s3_object', body: StringIO.new(today_access_log))
710
+ end
711
+
712
+ expect(driver.instance).to receive(:save_timestamp).with(today)
713
+ expect(driver.instance).to receive(:save_history)
714
+
715
+ expect(CSV).to receive(:parse_line).and_raise('parse error')
716
+ expect(driver.instance).to receive(:unquote).and_raise('unquote error')
717
+ end
718
+
719
+ specify do
720
+ expect(driver.instance.log).to receive(:warn).with(/parse error: unquote error:/)
721
+ driver_run(driver)
722
+ end
723
+ end
692
724
  end
@@ -1,4 +1,4 @@
1
- describe 'Fluent::ElbAccessLogInput#configure' do
1
+ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
2
2
  let(:account_id) { '123456789012' }
3
3
  let(:s3_bucket) { 'my-bucket' }
4
4
  let(:region) { 'us-west-1' }
@@ -11,8 +11,8 @@ describe 'Fluent::ElbAccessLogInput#configure' do
11
11
  Timecop.freeze(today)
12
12
  allow(FileUtils).to receive(:touch)
13
13
  allow(File).to receive(:read) { nil }
14
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:load_history) { [] }
15
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
14
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:load_history) { [] }
15
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:parse_tsfile) { nil }
16
16
  end
17
17
 
18
18
  context 'when default' do
@@ -140,7 +140,7 @@ describe 'Fluent::ElbAccessLogInput#configure' do
140
140
  end
141
141
 
142
142
  before do
143
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:parse_tsfile) { Time.parse(tsfile_datetime) }
143
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:parse_tsfile) { Time.parse(tsfile_datetime) }
144
144
  end
145
145
 
146
146
  it do
@@ -162,7 +162,7 @@ describe 'Fluent::ElbAccessLogInput#configure' do
162
162
  end
163
163
 
164
164
  before do
165
- allow_any_instance_of(Fluent::ElbAccessLogInput).to receive(:parse_tsfile) { Time.parse(tsfile_datetime) }
165
+ allow_any_instance_of(Fluent::Plugin::ElbAccessLogInput).to receive(:parse_tsfile) { Time.parse(tsfile_datetime) }
166
166
  allow_any_instance_of(Fluent::Test::TestLogger).to receive(:warn).with("start_datetime(#{start_datetime}) is set. but tsfile datetime(#{tsfile_datetime}) is used")
167
167
  end
168
168
 
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,8 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require 'fluent/test'
5
+ require 'fluent/test/driver/input'
2
6
  require 'fluent/plugin/in_elb_access_log'
3
7
 
4
8
  require 'aws-sdk-s3'
@@ -6,16 +10,6 @@ require 'time'
6
10
  require 'timecop'
7
11
  require 'rspec/match_table'
8
12
 
9
- if ENV['TRAVIS']
10
- require 'simplecov'
11
- require 'coveralls'
12
-
13
- SimpleCov.formatter = Coveralls::SimpleCov::Formatter
14
- SimpleCov.start do
15
- add_filter "spec/"
16
- end
17
- end
18
-
19
13
  # Disable Test::Unit
20
14
  module Test::Unit::RunCount; def run(*); end; end
21
15
 
@@ -46,8 +40,14 @@ region #{region}
46
40
  #{additional_options}
47
41
  EOS
48
42
 
49
- tag = options[:tag] || 'test.default'
50
- Fluent::Test::OutputTestDriver.new(Fluent::ElbAccessLogInput, tag).configure(fluentd_conf)
43
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::ElbAccessLogInput).configure(fluentd_conf)
44
+ end
45
+
46
+ def driver_run(driver)
47
+ driver.run do
48
+ coolio_loop = driver.instance.instance_variable_get(:@loop)
49
+ sleep 0.1 until coolio_loop.instance_variable_get(:@running)
50
+ end
51
51
  end
52
52
 
53
53
  # prevent Test::Unit's AutoRunner from executing during RSpec's rake task
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-elb-access-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.14'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.14'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aws-sdk-s3
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -157,8 +157,10 @@ executables: []
157
157
  extensions: []
158
158
  extra_rdoc_files: []
159
159
  files:
160
+ - ".coveralls.yml"
160
161
  - ".gitignore"
161
162
  - ".rspec"
163
+ - ".simplecov"
162
164
  - ".travis.yml"
163
165
  - Gemfile
164
166
  - LICENSE.txt