fluent-plugin-elb-log 0.2.8 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/README.md +9 -0
- data/Rakefile +1 -0
- data/fluent-plugin-elb-log.gemspec +5 -2
- data/lib/fluent/plugin/in_elb_log.rb +18 -52
- data/test/helper.rb +7 -11
- data/test/plugin/in_elb_log.rb +36 -22
- metadata +54 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e2cdd52d7bb6925077930b4af585a251b7adefc
|
4
|
+
data.tar.gz: 64429389036f8c97f4a502dad80cfebce71aaa83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05735444de0f2eceaaa76a417cd146971bc90ac614626dbaab1d4881b85651c06ab24aabad039fa9c90047f96e53e9dc406ba12c47743522d8f6947e34dce660
|
7
|
+
data.tar.gz: 8592521b71b5bb4df3311ea87f833627e129e7582ccb5cb8360a5bab67140e4efc284a35d273b767ec088db432aebea1505ba2b76efa2e1871027e989181e2a9
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,15 @@
|
|
3
3
|
## Overview
|
4
4
|
- Amazon Web Services ELB log input plubin for fluentd
|
5
5
|
|
6
|
+
## Requirements
|
7
|
+
|
8
|
+
## Requirements
|
9
|
+
|
10
|
+
| fluent-plugin-elb-log | fluentd | ruby |
|
11
|
+
|-----------------------|------------|--------|
|
12
|
+
| >= 0.3.0 | >= v0.14.0 | >= 2.1 |
|
13
|
+
| < 0.3.0 | >= v0.12.0 | >= 1.9 |
|
14
|
+
|
6
15
|
## Installation
|
7
16
|
|
8
17
|
$ fluentd-gem fluent-plugin-elb-log
|
data/Rakefile
CHANGED
@@ -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.
|
7
|
+
spec.version = "0.3.0"
|
8
8
|
spec.authors = ["shinsaka"]
|
9
9
|
spec.email = ["shinx1265@gmail.com"]
|
10
10
|
spec.summary = "Amazon ELB log input plugin"
|
@@ -17,8 +17,11 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_dependency "fluentd", "
|
20
|
+
spec.add_dependency "fluentd", ">= 0.14.0", "< 2"
|
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
27
|
end
|
@@ -1,38 +1,30 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'aws-sdk'
|
1
3
|
require 'fluent/input'
|
2
4
|
|
3
|
-
class Fluent::Elb_LogInput < Fluent::Input
|
5
|
+
class Fluent::Plugin::Elb_LogInput < Fluent::Plugin::Input
|
4
6
|
Fluent::Plugin.register_input('elb_log', self)
|
5
7
|
|
8
|
+
helpers :timer
|
9
|
+
|
6
10
|
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$/
|
7
11
|
ACCESSLOG_REGEXP = /^(?<time>\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{6}Z) (?<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>.+?)\"( \"(?<user_agent>.*?)\" (?<ssl_cipher>.+?) (?<ssl_protocol>.+)(| (?<option3>.*)))?/
|
8
12
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
config_param :
|
20
|
-
config_param :secret_access_key, :string, :default => nil, :secret => true
|
21
|
-
config_param :region, :string, :default => nil
|
22
|
-
config_param :s3_bucketname, :string, :default => nil
|
23
|
-
config_param :s3_prefix, :string, :default => nil
|
24
|
-
config_param :tag, :string, :default => 'elb.access'
|
25
|
-
config_param :timestamp_file, :string, :default => nil
|
26
|
-
config_param :refresh_interval, :integer, :default => 300
|
27
|
-
config_param :buf_file, :string, :default => './fluentd_elb_log_buf_file'
|
28
|
-
config_param :http_proxy, :string, :default => nil
|
29
|
-
config_param :start_time, :string, :default => nil
|
13
|
+
config_param :access_key_id, :string, default: nil, secret: true
|
14
|
+
config_param :secret_access_key, :string, default: nil, secret: true
|
15
|
+
config_param :region, :string
|
16
|
+
config_param :s3_bucketname, :string, default: nil
|
17
|
+
config_param :s3_prefix, :string, default: nil
|
18
|
+
config_param :tag, :string, default: 'elb.access'
|
19
|
+
config_param :timestamp_file, :string, default: nil
|
20
|
+
config_param :refresh_interval, :integer, default: 300
|
21
|
+
config_param :buf_file, :string, default: './fluentd_elb_log_buf_file'
|
22
|
+
config_param :http_proxy, :string, default: nil
|
23
|
+
config_param :start_time, :string, default: nil
|
30
24
|
|
31
25
|
def configure(conf)
|
32
26
|
super
|
33
|
-
require 'aws-sdk'
|
34
27
|
|
35
|
-
raise Fluent::ConfigError.new("region is required") unless @region
|
36
28
|
if !has_iam_role?
|
37
29
|
raise Fluent::ConfigError.new("access_key_id is required") if @access_key_id.nil?
|
38
30
|
raise Fluent::ConfigError.new("secret_access_key is required") if @secret_access_key.nil?
|
@@ -50,16 +42,7 @@ class Fluent::Elb_LogInput < Fluent::Input
|
|
50
42
|
|
51
43
|
raise StandardError.new("s3 bucket not found #{@s3_bucketname}") unless s3bucket_is_ok()
|
52
44
|
|
53
|
-
@
|
54
|
-
timer_trigger = TimerWatcher.new(@refresh_interval, true, &method(:input))
|
55
|
-
timer_trigger.attach(@loop)
|
56
|
-
@thread = Thread.new(&method(:run))
|
57
|
-
end
|
58
|
-
|
59
|
-
def shutdown
|
60
|
-
super
|
61
|
-
@loop.stop
|
62
|
-
@thread.join
|
45
|
+
timer_execute(:in_elb_log, @refresh_interval, &method(:input))
|
63
46
|
end
|
64
47
|
|
65
48
|
private
|
@@ -74,7 +57,6 @@ class Fluent::Elb_LogInput < Fluent::Input
|
|
74
57
|
end
|
75
58
|
|
76
59
|
def get_timestamp_file
|
77
|
-
require 'time'
|
78
60
|
begin
|
79
61
|
# get timestamp last proc
|
80
62
|
start_time = @start_time ? Time.parse(@start_time).utc : Time.at(0)
|
@@ -104,7 +86,7 @@ class Fluent::Elb_LogInput < Fluent::Input
|
|
104
86
|
def s3_client
|
105
87
|
begin
|
106
88
|
options = {
|
107
|
-
:
|
89
|
+
region: @region,
|
108
90
|
}
|
109
91
|
if @access_key_id && @secret_access_key
|
110
92
|
options[:access_key_id] = @access_key_id
|
@@ -273,20 +255,4 @@ class Fluent::Elb_LogInput < Fluent::Input
|
|
273
255
|
log.warn "error occurred: #{e.message}"
|
274
256
|
end
|
275
257
|
end
|
276
|
-
|
277
|
-
def run
|
278
|
-
@loop.run
|
279
|
-
end
|
280
|
-
|
281
|
-
class TimerWatcher < Coolio::TimerWatcher
|
282
|
-
def initialize(interval, repeat, &callback)
|
283
|
-
@callback = callback
|
284
|
-
on_timer # first call
|
285
|
-
super(interval, repeat)
|
286
|
-
end
|
287
|
-
|
288
|
-
def on_timer
|
289
|
-
@callback.call
|
290
|
-
end
|
291
|
-
end
|
292
258
|
end
|
data/test/helper.rb
CHANGED
@@ -1,19 +1,15 @@
|
|
1
|
-
require '
|
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
|
1
|
+
require 'bundler/setup'
|
10
2
|
require 'test/unit'
|
11
3
|
require 'webmock/test_unit'
|
12
4
|
|
13
|
-
$LOAD_PATH.unshift(File.join(
|
14
|
-
$LOAD_PATH.unshift(
|
5
|
+
$LOAD_PATH.unshift(File.join(__dir__, '..', 'lib'))
|
6
|
+
$LOAD_PATH.unshift(__dir__)
|
15
7
|
require 'fluent/test'
|
8
|
+
require 'fluent/test/helpers'
|
9
|
+
require 'fluent/test/driver/input'
|
16
10
|
require 'fluent/plugin/in_elb_log'
|
17
11
|
|
18
12
|
class Test::Unit::TestCase
|
13
|
+
include Fluent::Test::Helpers
|
14
|
+
extend Fluent::Test::Helpers
|
19
15
|
end
|
data/test/plugin/in_elb_log.rb
CHANGED
@@ -7,13 +7,14 @@ class Elb_LogInputTest < Test::Unit::TestCase
|
|
7
7
|
end
|
8
8
|
|
9
9
|
DEFAULT_CONFIG = {
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
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
|
+
region: 'ap-northeast-1',
|
16
|
+
timestamp_file: 'elb_last_at.dat',
|
17
|
+
refresh_interval: 300
|
17
18
|
}
|
18
19
|
|
19
20
|
def parse_config(conf = {})
|
@@ -21,36 +22,49 @@ class Elb_LogInputTest < Test::Unit::TestCase
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def create_driver(conf = DEFAULT_CONFIG)
|
24
|
-
Fluent::Test::
|
25
|
+
Fluent::Test::Driver::Input.new(Fluent::Plugin::Elb_LogInput).configure(parse_config conf)
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
-
|
28
|
+
def iam_info_url
|
29
|
+
"http://169.254.169.254/latest/meta-data/iam/security-credentials/"
|
29
30
|
end
|
30
31
|
|
31
32
|
def use_iam_role
|
32
|
-
|
33
|
+
stub_request(:get, iam_info_url)
|
34
|
+
.to_return(status: [200, 'OK'], body: "hostname")
|
35
|
+
stub_request(:get, "#{iam_info_url}hostname")
|
36
|
+
.to_return(status: [200, 'OK'],
|
37
|
+
body: {
|
38
|
+
"AccessKeyId" => "dummy",
|
39
|
+
"SecretAccessKey" => "secret",
|
40
|
+
"Token" => "token"
|
41
|
+
}.to_json)
|
42
|
+
end
|
43
|
+
|
44
|
+
def iam_info_timeout
|
45
|
+
stub_request(:get, iam_info_url).to_timeout
|
33
46
|
end
|
34
47
|
|
35
48
|
def not_use_iam_role
|
36
|
-
|
49
|
+
stub_request(:get, iam_info_url)
|
50
|
+
.to_return(status: [404, 'Not Found'])
|
37
51
|
end
|
38
52
|
|
39
53
|
def test_confiture_default
|
40
54
|
use_iam_role
|
41
|
-
assert_nothing_raised {
|
55
|
+
assert_nothing_raised { create_driver }
|
42
56
|
|
43
57
|
exception = assert_raise(Fluent::ConfigError) {
|
44
58
|
conf = DEFAULT_CONFIG.clone
|
45
59
|
conf.delete(:s3_bucketname)
|
46
|
-
|
60
|
+
create_driver(conf)
|
47
61
|
}
|
48
62
|
assert_equal('s3_bucketname is required', exception.message)
|
49
63
|
|
50
64
|
exception = assert_raise(Fluent::ConfigError) {
|
51
65
|
conf = DEFAULT_CONFIG.clone
|
52
66
|
conf.delete(:timestamp_file)
|
53
|
-
|
67
|
+
create_driver(conf)
|
54
68
|
}
|
55
69
|
assert_equal('timestamp_file is required', exception.message)
|
56
70
|
end
|
@@ -60,7 +74,7 @@ class Elb_LogInputTest < Test::Unit::TestCase
|
|
60
74
|
conf = DEFAULT_CONFIG.clone
|
61
75
|
conf.delete(:access_key_id)
|
62
76
|
conf.delete(:secret_access_key)
|
63
|
-
assert_nothing_raised {
|
77
|
+
assert_nothing_raised { create_driver(conf) }
|
64
78
|
end
|
65
79
|
|
66
80
|
def test_configure_in_EC2_without_IAM_role
|
@@ -68,33 +82,33 @@ class Elb_LogInputTest < Test::Unit::TestCase
|
|
68
82
|
exception = assert_raise(Fluent::ConfigError) {
|
69
83
|
conf = DEFAULT_CONFIG.clone
|
70
84
|
conf.delete(:access_key_id)
|
71
|
-
|
85
|
+
create_driver(conf)
|
72
86
|
}
|
73
87
|
assert_equal('access_key_id is required', exception.message)
|
74
88
|
|
75
89
|
exception = assert_raise(Fluent::ConfigError) {
|
76
90
|
conf = DEFAULT_CONFIG.clone
|
77
91
|
conf.delete(:secret_access_key)
|
78
|
-
|
92
|
+
create_driver(conf)
|
79
93
|
}
|
80
94
|
assert_equal('secret_access_key is required', exception.message)
|
81
95
|
end
|
82
96
|
|
83
97
|
def test_configure_outside_EC2
|
84
|
-
|
98
|
+
iam_info_timeout
|
85
99
|
|
86
|
-
assert_nothing_raised {
|
100
|
+
assert_nothing_raised { create_driver }
|
87
101
|
exception = assert_raise(Fluent::ConfigError) {
|
88
102
|
conf = DEFAULT_CONFIG.clone
|
89
103
|
conf.delete(:access_key_id)
|
90
|
-
|
104
|
+
create_driver(conf)
|
91
105
|
}
|
92
106
|
assert_equal('access_key_id is required', exception.message)
|
93
107
|
|
94
108
|
exception = assert_raise(Fluent::ConfigError) {
|
95
109
|
conf = DEFAULT_CONFIG.clone
|
96
110
|
conf.delete(:secret_access_key)
|
97
|
-
|
111
|
+
create_driver(conf)
|
98
112
|
}
|
99
113
|
assert_equal('secret_access_key is required', exception.message)
|
100
114
|
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-elb-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- shinsaka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-29 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
|
-
version:
|
19
|
+
version: 0.14.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: 0.14.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: aws-sdk
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +58,48 @@ dependencies:
|
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
60
|
version: '1.7'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: test-unit
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 3.1.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.1.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: webmock
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
55
103
|
description: Amazon ELB log input plugin for fluentd
|
56
104
|
email:
|
57
105
|
- shinx1265@gmail.com
|