fluent-plugin-elb-log 0.0.5 → 0.0.6

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: d8b54e216c7f743ae8f8663bf1ad475bd840400b
4
- data.tar.gz: 7abdf722312a6f6019c39dc9e18779310a3b6ae2
3
+ metadata.gz: 758e11bd1e39f44c8f3fa111370b4a6c98f47234
4
+ data.tar.gz: 1d175b06fabd4016957b5093627c948174b7d1e2
5
5
  SHA512:
6
- metadata.gz: e63ce266899674a4d486ee0fd34dc231a1772d9d478748bb91ec8e26d107185b4ba77afb290ea01d1528cee993fd9d0d9546aac3f090e4be8ea9eabae5423a53
7
- data.tar.gz: d61f3d2b30aa47515572a027985f7a81633bd08c74a8b93d6c807c16c4d929b0a1d52808c722a2a4fca504d203a0de26ec906d787925ef5dd7431803233a0e34
6
+ metadata.gz: 7d603a8276abf6dae8990dd30becde23eb2e1749e621e04d0699cb3ba199c14d62026547855744770c51cbf475cc21f9a3a7ac4cc2bc83fcdf581baee93574a3
7
+ data.tar.gz: 87062acf6b2809effaa29f8df2db6d26c987511a9452b625b662ed4ee2ee6504a920c06b698f203b744d3653dd4b9bc9cd61c74c00acb2f70b2ddcf1b89d77d3
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ lang: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.*
7
+ branches:
8
+ only:
9
+ - master
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << 'lib' << 'test'
6
+ test.pattern = 'test/**/*.rb'
7
+ test.verbose = true
8
+ end
9
+
10
+ desc 'Run tests for all'
11
+ task :default => :test
@@ -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.0.5"
7
+ spec.version = "0.0.6"
8
8
  spec.authors = ["shinsaka"]
9
9
  spec.email = ["shinx1265@gmail.com"]
10
10
  spec.summary = "Amazon ELB log input plugin"
@@ -22,4 +22,5 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.5"
24
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "webmock"
25
26
  end
@@ -1,6 +1,6 @@
1
1
  class Fluent::Elb_LogInput < Fluent::Input
2
2
  Fluent::Plugin.register_input('elb_log', self)
3
-
3
+
4
4
  LOGFILE_REGEXP = /^((?<prefix>.+?)\/|)AWSLogs\/(?<account_id>[0-9]{12})\/elasticloadbalancing\/(?<region>.+?)\/(?<logfile_date>[0-9]{4}\/[0-9]{2}\/[0-9]{2})\/[0-9]{12}_elasticloadbalancing_.+?_(?<logfile_elb_name>[^_]+)_(?<elb_timestamp>[0-9]{8}T[0-9]{4}Z)_(?<elb_ip_address>.+?)_(?<logfile_hash>.+)\.log$/
5
5
  ACCESSLOG_REGEXP = /^(?<time>.+?) (?<elb>.+?) (?<client>.+)\:(?<client_port>.+) (?<backend>.+)\:(?<backend_port>.+) (?<request_processing_time>.+?) (?<backend_processing_time>.+?) (?<response_processing_time>.+?) (?<elb_status_code>.+?) (?<backend_status_code>.+?) (?<received_bytes>.+?) (?<sent_bytes>.+?) \"(?<request_method>.+?) (?<request_uri>.+?) (?<request_protocol>.+?)\"$/
6
6
 
@@ -15,12 +15,14 @@ class Fluent::Elb_LogInput < Fluent::Input
15
15
  def configure(conf)
16
16
  super
17
17
  require 'aws-sdk'
18
- require 'net/http'
19
- iam = Net::HTTP.get_response('169.254.169.254','/latest/meta-data/iam/info')
20
- if iam.msg != 'OK'
21
- raise Fluent::ConfigError.new("access_key_id is required") unless @access_key_id
22
- raise Fluent::ConfigError.new("secret_access_key is required") unless @secret_access_key
18
+
19
+ if @access_key_id.nil? and has_not_iam_role?
20
+ raise Fluent::ConfigError.new("access_key_id is required")
21
+ end
22
+ if @secret_access_key.nil? and has_not_iam_role?
23
+ raise Fluent::ConfigError.new("secret_access_key is required")
23
24
  end
25
+
24
26
  raise Fluent::ConfigError.new("s3_bucketname is required") unless @s3_bucketname
25
27
  raise Fluent::ConfigError.new("timestamp_file is required") unless @timestamp_file
26
28
  end
@@ -65,7 +67,7 @@ class Fluent::Elb_LogInput < Fluent::Input
65
67
 
66
68
  def input
67
69
  $log.info "fluent-plugin-elb-log: input start"
68
-
70
+
69
71
  # get timestamp last proc
70
72
  @timestamp_file.rewind
71
73
  timestamp = @timestamp_file.read.to_i
@@ -120,7 +122,7 @@ class Fluent::Elb_LogInput < Fluent::Input
120
122
  request_uri: line_match[:request_uri],
121
123
  request_protocol: line_match[:request_protocol],
122
124
  }
123
-
125
+
124
126
  Fluent::Engine.emit("elb.access", Fluent::Engine.now, record_common.merge(record))
125
127
  end
126
128
  # timestamp save
@@ -131,6 +133,26 @@ class Fluent::Elb_LogInput < Fluent::Input
131
133
  end
132
134
  end
133
135
 
136
+ def has_iam_role?
137
+ return @has_iam_role unless @has_iam_role.nil?
138
+
139
+ require 'net/http'
140
+ @has_iam_role = false
141
+ begin
142
+ http = Net::HTTP.new('169.254.169.254', '80')
143
+ http.open_timeout = 5 # sec
144
+ response = http.request(Net::HTTP::Get.new('/latest/meta-data/iam/info'))
145
+ @has_iam_role = true if response.code == '200'
146
+ rescue => e
147
+ $log.warn "fluent-plugin-elb-log: #{e.message}"
148
+ end
149
+ @has_iam_role
150
+ end
151
+
152
+ def has_not_iam_role?
153
+ !has_iam_role?
154
+ end
155
+
134
156
  class TimerWatcher < Coolio::TimerWatcher
135
157
  def initialize(interval, repeat, &callback)
136
158
  @callback = callback
data/test/helper.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'webmock/test_unit'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'fluent/test'
16
+ require 'fluent/plugin/in_elb_log'
17
+
18
+ class Test::Unit::TestCase
19
+ end
@@ -0,0 +1,102 @@
1
+ require_relative '../helper'
2
+
3
+ class Elb_LogInputTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Fluent::Test.setup
7
+ end
8
+
9
+ DEFAULT_CONFIG = {
10
+ :access_key_id => 'dummy_access_key_id',
11
+ :secret_access_key => 'dummy_secret_access_key',
12
+ :s3_endpoint => 's3-ap-northeast-1.amazonaws.com',
13
+ :s3_bucketname => 'bummy_bucket',
14
+ :s3_prefix => 'test',
15
+ :timestamp_file => 'elb_last_at.dat',
16
+ :refresh_interval => 300
17
+ }
18
+
19
+ def parse_config(conf = {})
20
+ ''.tap{|s| conf.each { |k, v| s << "#{k} #{v}\n" } }
21
+ end
22
+
23
+ def create_driver(conf = DEFAULT_CONFIG)
24
+ Fluent::Test::InputTestDriver.new(Fluent::Elb_LogInput).configure(parse_config conf)
25
+ end
26
+
27
+ def iam_info
28
+ stub_request(:get, "http://169.254.169.254/latest/meta-data/iam/info")
29
+ end
30
+
31
+ def use_iam_role
32
+ iam_info.to_return(:status => [200, 'OK'])
33
+ end
34
+
35
+ def not_use_iam_role
36
+ iam_info.to_return(:status => [404, 'Not Found'])
37
+ end
38
+
39
+ def test_confiture_default
40
+ use_iam_role
41
+ assert_nothing_raised { driver = create_driver }
42
+
43
+ exception = assert_raise(Fluent::ConfigError) {
44
+ conf = DEFAULT_CONFIG.clone
45
+ conf.delete(:s3_bucketname)
46
+ driver = create_driver(conf)
47
+ }
48
+ assert_equal('s3_bucketname is required', exception.message)
49
+
50
+ exception = assert_raise(Fluent::ConfigError) {
51
+ conf = DEFAULT_CONFIG.clone
52
+ conf.delete(:timestamp_file)
53
+ driver = create_driver(conf)
54
+ }
55
+ assert_equal('timestamp_file is required', exception.message)
56
+ end
57
+
58
+ def test_configure_in_EC2_with_IAM_role
59
+ use_iam_role
60
+ conf = DEFAULT_CONFIG.clone
61
+ conf.delete(:access_key_id)
62
+ conf.delete(:secret_access_key)
63
+ assert_nothing_raised { driver = create_driver(conf) }
64
+ end
65
+
66
+ def test_configure_in_EC2_without_IAM_role
67
+ not_use_iam_role
68
+ exception = assert_raise(Fluent::ConfigError) {
69
+ conf = DEFAULT_CONFIG.clone
70
+ conf.delete(:access_key_id)
71
+ driver = create_driver(conf)
72
+ }
73
+ assert_equal('access_key_id is required', exception.message)
74
+
75
+ exception = assert_raise(Fluent::ConfigError) {
76
+ conf = DEFAULT_CONFIG.clone
77
+ conf.delete(:secret_access_key)
78
+ driver = create_driver(conf)
79
+ }
80
+ assert_equal('secret_access_key is required', exception.message)
81
+ end
82
+
83
+ def test_configure_outside_EC2
84
+ iam_info.to_timeout
85
+
86
+ assert_nothing_raised { driver = create_driver }
87
+ exception = assert_raise(Fluent::ConfigError) {
88
+ conf = DEFAULT_CONFIG.clone
89
+ conf.delete(:access_key_id)
90
+ driver = create_driver(conf)
91
+ }
92
+ assert_equal('access_key_id is required', exception.message)
93
+
94
+ exception = assert_raise(Fluent::ConfigError) {
95
+ conf = DEFAULT_CONFIG.clone
96
+ conf.delete(:secret_access_key)
97
+ driver = create_driver(conf)
98
+ }
99
+ assert_equal('secret_access_key is required', exception.message)
100
+ end
101
+
102
+ end
metadata CHANGED
@@ -1,69 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-elb-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - shinsaka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-01 00:00:00.000000000 Z
11
+ date: 2014-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
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
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aws-sdk
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  description: Amazon ELB log input plugin for fluentd
@@ -73,7 +87,8 @@ executables: []
73
87
  extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
76
- - ".gitignore"
90
+ - .gitignore
91
+ - .travis.yml
77
92
  - Gemfile
78
93
  - LICENSE.txt
79
94
  - README.md
@@ -81,6 +96,8 @@ files:
81
96
  - fluent-plugin-elb-log.gemspec
82
97
  - fluent.conf.sample
83
98
  - lib/fluent/plugin/in_elb_log.rb
99
+ - test/helper.rb
100
+ - test/plugin/in_elb_log.rb
84
101
  homepage: https://github.com/shinsaka/fluent-plugin-elb-log
85
102
  licenses:
86
103
  - MIT
@@ -91,18 +108,20 @@ require_paths:
91
108
  - lib
92
109
  required_ruby_version: !ruby/object:Gem::Requirement
93
110
  requirements:
94
- - - ">="
111
+ - - '>='
95
112
  - !ruby/object:Gem::Version
96
113
  version: '0'
97
114
  required_rubygems_version: !ruby/object:Gem::Requirement
98
115
  requirements:
99
- - - ">="
116
+ - - '>='
100
117
  - !ruby/object:Gem::Version
101
118
  version: '0'
102
119
  requirements: []
103
120
  rubyforge_project:
104
- rubygems_version: 2.0.3
121
+ rubygems_version: 2.0.14
105
122
  signing_key:
106
123
  specification_version: 4
107
124
  summary: Amazon ELB log input plugin
108
- test_files: []
125
+ test_files:
126
+ - test/helper.rb
127
+ - test/plugin/in_elb_log.rb