fluent-plugin-elb-log 0.4.0 → 0.4.1

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: 6d34dc14c5627860aa7787a9c0e0dbac19edaf9d
4
- data.tar.gz: 57c8a63726d0ad90f47653b6f3d20286d1527129
3
+ metadata.gz: f565fbbe387bad73d53cee18557d89ae0acd9f4f
4
+ data.tar.gz: 6a37e1c172a8d1c5b20394dbaa38923b9b82b0e4
5
5
  SHA512:
6
- metadata.gz: 6854587f02206b4cdcd14863516d4df01b79eda6af2765d4250c3139e21ea1bb20896b7dba86cd29287aafa5b00e7983d02456ee50bfd29da6519d6c57622012
7
- data.tar.gz: cfb29cc94c144bf8a877a3cd287510be473c31f23fa2f6879b0421ccba0e8a992559057e27f5f2c0edc12bd6877544872c878b570511bc1eb05b58d0e173b612
6
+ metadata.gz: 58c8fd4c5ba84514c783afb2867438c4646a171f41d3d8fcb052db6624f807578b7bec83061f357b04791662b5a42d96cf973e0426aa5d091a5690b62625a5ba
7
+ data.tar.gz: 85870e3681ddc11eb40ad22feed503aacfddd970dfc108917af87f86fd06fadba084f1f09ff4bd0d3d38a2c88d436e463bfef1403fde1c690735ddb4b8accb04
data/.travis.yml CHANGED
@@ -1,4 +1,8 @@
1
- lang: ruby
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=bca5d9771c392e374d213de82dde44181a12b4c8b5d5bd37b249c81ca5bf32f1
4
+ - GIT_COMMITTED_AT=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then git log -1 --pretty=format:%ct; else git log -1 --skip 1 --pretty=format:%ct; fi)
5
+ language: ruby
2
6
 
3
7
  rvm:
4
8
  - 2.1
@@ -8,3 +12,9 @@ rvm:
8
12
  branches:
9
13
  only:
10
14
  - master
15
+
16
+ before_script:
17
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
18
+ - chmod +x ./cc-test-reporter
19
+ after_script:
20
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Amazon ELB log input plugin for fluentd
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-elb-log.svg)](https://badge.fury.io/rb/fluent-plugin-elb-log)
4
+ [![Build Status](https://travis-ci.org/shinsaka/fluent-plugin-elb-log.svg?branch=master)](https://travis-ci.org/shinsaka/fluent-plugin-elb-log)
5
+ [![Code Climate](https://codeclimate.com/github/shinsaka/fluent-plugin-elb-log/badges/gpa.svg)](https://codeclimate.com/github/shinsaka/fluent-plugin-elb-log)
6
+ [![Test Coverage](https://codeclimate.com/github/shinsaka/fluent-plugin-elb-log/badges/coverage.svg)](https://codeclimate.com/github/shinsaka/fluent-plugin-elb-log/coverage)
7
+
3
8
  ## Overview
4
9
  - Amazon Web Services ELB log input plubin for fluentd
5
10
 
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-elb-log"
7
- spec.version = "0.4.0"
7
+ spec.version = "0.4.1"
8
8
  spec.authors = ["shinsaka"]
9
9
  spec.email = ["shinx1265@gmail.com"]
10
10
  spec.summary = "Amazon ELB log input plugin"
@@ -21,7 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "aws-sdk", "~> 2"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.7"
24
- spec.add_development_dependency "rake"
25
- spec.add_development_dependency "test-unit", ">= 3.1.0"
26
- spec.add_development_dependency "webmock"
24
+ spec.add_development_dependency "rake", "~> 12"
25
+ spec.add_development_dependency "test-unit", "~> 3.2"
26
+ spec.add_development_dependency "webmock", "~>3"
27
+ spec.add_development_dependency "simplecov", "~>0"
27
28
  end
@@ -33,6 +33,7 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
33
33
  end
34
34
  raise Fluent::ConfigError.new("s3_bucketname is required") unless @s3_bucketname
35
35
  raise Fluent::ConfigError.new("timestamp_file is required") unless @timestamp_file
36
+ raise Fluent::ConfigError.new("s3 bucket not found #{@s3_bucketname}") unless s3bucket_is_ok?
36
37
  end
37
38
 
38
39
  def start
@@ -42,8 +43,6 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
42
43
  File.open(@timestamp_file, File::RDWR|File::CREAT).close
43
44
  File.open(@buf_file, File::RDWR|File::CREAT).close
44
45
 
45
- raise StandardError.new("s3 bucket not found #{@s3_bucketname}") unless s3bucket_is_ok()
46
-
47
46
  timer_execute(:in_elb_log, @refresh_interval, &method(:input))
48
47
  end
49
48
 
@@ -104,15 +103,15 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
104
103
  end
105
104
  end
106
105
 
107
- def s3bucket_is_ok
108
- begin
109
- log.debug "search bucket #{@s3_bucketname}"
106
+ def s3bucket_is_ok?
107
+ log.debug "searching for bucket #{@s3_bucketname}"
110
108
 
111
- s3_client.list_buckets.buckets.any? do |bucket|
112
- bucket.name == @s3_bucketname
113
- end
109
+ begin
110
+ # try get one
111
+ !(get_object_list(1).nil?)
114
112
  rescue => e
115
- log.warn "S3 Client error occurred: #{e.message}"
113
+ log.warn "error occurred: #{e.message}"
114
+ false
116
115
  end
117
116
  end
118
117
 
@@ -180,14 +179,8 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
180
179
 
181
180
  def get_object_keys_from_s3
182
181
  begin
183
- objects = s3_client.list_objects(
184
- bucket: @s3_bucketname,
185
- max_keys: 100,
186
- prefix: @s3_prefix,
187
- )
188
-
189
182
  object_keys = []
190
- objects.each do |object|
183
+ get_object_list(100).each do |object|
191
184
  object.contents.each do |content|
192
185
  object_keys << content.key
193
186
  end
@@ -208,6 +201,14 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
208
201
  end
209
202
  end
210
203
 
204
+ def get_object_list(max_num)
205
+ s3_client.list_objects(
206
+ bucket: @s3_bucketname,
207
+ max_keys: max_num,
208
+ prefix: @s3_prefix
209
+ )
210
+ end
211
+
211
212
  def get_file_from_s3(object_name)
212
213
  begin
213
214
  log.debug "getting object from s3 name is #{object_name}"
@@ -244,37 +245,38 @@ class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
244
245
  next
245
246
  end
246
247
 
247
- record = {
248
- "time" => line_match[:time].gsub(/Z/, "+0000"),
249
- "elb" => line_match[:elb],
250
- "client" => line_match[:client],
251
- "client_port" => line_match[:client_port],
252
- "backend" => line_match[:backend],
253
- "backend_port" => line_match[:backend_port],
254
- "request_processing_time" => line_match[:request_processing_time].to_f,
255
- "backend_processing_time" => line_match[:backend_processing_time].to_f,
256
- "response_processing_time" => line_match[:response_processing_time].to_f,
257
- "elb_status_code" => line_match[:elb_status_code],
258
- "backend_status_code" => line_match[:backend_status_code],
259
- "received_bytes" => line_match[:received_bytes].to_i,
260
- "sent_bytes" => line_match[:sent_bytes].to_i,
261
- "request_method" => line_match[:request_method],
262
- "request_uri" => line_match[:request_uri],
263
- "request_protocol" => line_match[:request_protocol],
264
- "user_agent" => line_match[:user_agent],
265
- "ssl_cipher" => line_match[:ssl_cipher],
266
- "ssl_protocol" => line_match[:ssl_protocol],
267
- "type" => line_match[:type],
268
- "target_group_arn" => line_match[:target_group_arn],
269
- "trace_id" => line_match[:trace_id],
270
- "option3" => line_match[:option3],
271
- }
272
-
273
- router.emit(@tag, Fluent::Engine.now, record_common.merge(record))
248
+ router.emit(@tag, Fluent::Engine.now, record_common.merge(format_record(line_match)))
274
249
  end
275
250
  end
276
251
  rescue => e
277
252
  log.warn "error occurred: #{e.message}"
278
253
  end
279
254
  end
255
+
256
+ def format_record(item)
257
+ { "time" => item[:time].gsub(/Z/, '+0000'),
258
+ "elb" => item[:elb],
259
+ "client" => item[:client],
260
+ "client_port" => item[:client_port],
261
+ "backend" => item[:backend],
262
+ "backend_port" => item[:backend_port],
263
+ "request_processing_time" => item[:request_processing_time].to_f,
264
+ "backend_processing_time" => item[:backend_processing_time].to_f,
265
+ "response_processing_time" => item[:response_processing_time].to_f,
266
+ "elb_status_code" => item[:elb_status_code],
267
+ "backend_status_code" => item[:backend_status_code],
268
+ "received_bytes" => item[:received_bytes].to_i,
269
+ "sent_bytes" => item[:sent_bytes].to_i,
270
+ "request_method" => item[:request_method],
271
+ "request_uri" => item[:request_uri],
272
+ "request_protocol" => item[:request_protocol],
273
+ "user_agent" => item[:user_agent],
274
+ "ssl_cipher" => item[:ssl_cipher],
275
+ "ssl_protocol" => item[:ssl_protocol],
276
+ "type" => item[:type],
277
+ "target_group_arn" => item[:target_group_arn],
278
+ "trace_id" => item[:trace_id],
279
+ "option3" => item[:option3]
280
+ }
281
+ end
280
282
  end
data/test/helper.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'bundler/setup'
2
2
  require 'test/unit'
3
3
  require 'webmock/test_unit'
4
+ require 'simplecov'
5
+
6
+ SimpleCov.start
4
7
 
5
8
  $LOAD_PATH.unshift(File.join(__dir__, '..', 'lib'))
6
9
  $LOAD_PATH.unshift(__dir__)
@@ -10,7 +10,7 @@ class Elb_LogInputTest < Test::Unit::TestCase
10
10
  access_key_id: 'dummy_access_key_id',
11
11
  secret_access_key: 'dummy_secret_access_key',
12
12
  s3_endpoint: 's3-ap-northeast-1.amazonaws.com',
13
- s3_bucketname: 'bummy_bucket',
13
+ s3_bucketname: 'dummy_bucket',
14
14
  s3_prefix: 'test',
15
15
  region: 'ap-northeast-1',
16
16
  timestamp_file: 'elb_last_at.dat',
@@ -26,7 +26,7 @@ class Elb_LogInputTest < Test::Unit::TestCase
26
26
  end
27
27
 
28
28
  def iam_info_url
29
- "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
29
+ 'http://169.254.169.254/latest/meta-data/iam/security-credentials/'
30
30
  end
31
31
 
32
32
  def use_iam_role
@@ -50,7 +50,18 @@ class Elb_LogInputTest < Test::Unit::TestCase
50
50
  .to_return(status: [404, 'Not Found'])
51
51
  end
52
52
 
53
- def test_confiture_default
53
+ def s3bucket_ok
54
+ stub_request(:get, 'https://s3-ap-northeast-1.amazonaws.com/dummy_bucket?encoding-type=url&max-keys=1&prefix=test')
55
+ .to_return(status: 200, body: "", headers: {})
56
+ end
57
+
58
+ def s3bucket_not_found
59
+ stub_request(:get, 'https://s3-ap-northeast-1.amazonaws.com/dummy_bucket?encoding-type=url&max-keys=1&prefix=test')
60
+ .to_return(status: 404, body: "", headers: {})
61
+ end
62
+
63
+ def test_configure_default
64
+ s3bucket_ok
54
65
  use_iam_role
55
66
  assert_nothing_raised { create_driver }
56
67
 
@@ -70,6 +81,7 @@ class Elb_LogInputTest < Test::Unit::TestCase
70
81
  end
71
82
 
72
83
  def test_configure_in_EC2_with_IAM_role
84
+ s3bucket_ok
73
85
  use_iam_role
74
86
  conf = DEFAULT_CONFIG.clone
75
87
  conf.delete(:access_key_id)
@@ -78,8 +90,9 @@ class Elb_LogInputTest < Test::Unit::TestCase
78
90
  end
79
91
 
80
92
  def test_configure_in_EC2_without_IAM_role
81
- not_use_iam_role
82
93
  exception = assert_raise(Fluent::ConfigError) {
94
+ s3bucket_ok
95
+ not_use_iam_role
83
96
  conf = DEFAULT_CONFIG.clone
84
97
  conf.delete(:access_key_id)
85
98
  create_driver(conf)
@@ -95,6 +108,7 @@ class Elb_LogInputTest < Test::Unit::TestCase
95
108
  end
96
109
 
97
110
  def test_configure_outside_EC2
111
+ s3bucket_ok
98
112
  iam_info_timeout
99
113
 
100
114
  assert_nothing_raised { create_driver }
@@ -113,6 +127,15 @@ class Elb_LogInputTest < Test::Unit::TestCase
113
127
  assert_equal('secret_access_key is required', exception.message)
114
128
  end
115
129
 
130
+ def test_not_found_s3bucket
131
+ e = assert_raise(Fluent::ConfigError) {
132
+ use_iam_role
133
+ s3bucket_not_found
134
+ create_driver(DEFAULT_CONFIG.clone)
135
+ }
136
+ assert_equal('s3 bucket not found dummy_bucket', e.message)
137
+ end
138
+
116
139
  def test_logfilename_classic_lb_parse
117
140
  logfile_classic = 'classic/AWSLogs/123456789012/elasticloadbalancing/ap-northeast-1/2017/05/03/123456789012_elasticloadbalancing_ap-northeast-1_elbname_20170503T1250Z_10.0.0.1_43nzjpdj.log'
118
141
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-elb-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - shinsaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-07 00:00:00.000000000 Z
11
+ date: 2017-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -62,42 +62,56 @@ dependencies:
62
62
  name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '12'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0'
74
+ version: '12'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: test-unit
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - ">="
79
+ - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: 3.1.0
81
+ version: '3.2'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
- - - ">="
86
+ - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: 3.1.0
88
+ version: '3.2'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: webmock
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ">="
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3'
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
94
108
  - !ruby/object:Gem::Version
95
109
  version: '0'
96
110
  type: :development
97
111
  prerelease: false
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - ">="
114
+ - - "~>"
101
115
  - !ruby/object:Gem::Version
102
116
  version: '0'
103
117
  description: Amazon ELB log input plugin for fluentd