fluent-plugin-elb-log 0.2.8 → 0.3.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 +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
|