fluent-plugin-elb-access-log 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/lib/fluent/plugin/in_elb_access_log.rb +43 -13
- data/lib/fluent_plugin_elb_access_log/version.rb +1 -1
- data/spec/in_elb_access_log_alb_spec.rb +117 -0
- data/spec/in_elb_access_log_clb_spec.rb +111 -0
- data/spec/in_elb_access_log_config_spec.rb +34 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88a3b513a550db32f667fedc8ba75eea2e2f6199
|
4
|
+
data.tar.gz: 0e5dd5364065a98f38f15c54fe400e0826941ae4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c3c094dff47e82717c9cf8b80d2528f35257a61dc7bcb6c64c6943433e684082638c1e13256b43ea448b1e2e40487fbfcaa73353f8fb74245b739fc8e897edb
|
7
|
+
data.tar.gz: 8493ec02a57fb20f8fbaf144fa8930292b9658a90438b31a56d429b04a7690e72b4273d7a37de68422f721089181e02ecc9810a43bb271b7fea1bc5f61e8e806
|
data/README.md
CHANGED
@@ -19,8 +19,8 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
19
19
|
'clb' => {
|
20
20
|
'timestamp' => nil,
|
21
21
|
'elb' => nil,
|
22
|
-
'client_port' =>
|
23
|
-
'backend_port' =>
|
22
|
+
'client_port' => :to_i,
|
23
|
+
'backend_port' => :to_i,
|
24
24
|
'request_processing_time' => :to_f,
|
25
25
|
'backend_processing_time' => :to_f,
|
26
26
|
'response_processing_time' => :to_f,
|
@@ -38,8 +38,8 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
38
38
|
'type' => nil,
|
39
39
|
'timestamp' => nil,
|
40
40
|
'elb' => nil,
|
41
|
-
'client_port' =>
|
42
|
-
'target_port' =>
|
41
|
+
'client_port' => :to_i,
|
42
|
+
'target_port' => :to_i,
|
43
43
|
'request_processing_time' => :to_f,
|
44
44
|
'target_processing_time' => :to_f,
|
45
45
|
'response_processing_time' => :to_f,
|
@@ -58,7 +58,7 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
58
58
|
},
|
59
59
|
}
|
60
60
|
|
61
|
-
ELB_TYPES =
|
61
|
+
ELB_TYPES = ACCESS_LOG_FIELDS.keys
|
62
62
|
|
63
63
|
config_param :elb_type, :string, default: 'clb'
|
64
64
|
config_param :aws_key_id, :string, default: nil, secret: true
|
@@ -79,12 +79,20 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
79
79
|
config_param :history_length, :integer, default: 100
|
80
80
|
config_param :sampling_interval, :integer, default: 1
|
81
81
|
config_param :debug, :bool, default: false
|
82
|
+
config_param :filter, :hash, default: nil
|
83
|
+
config_param :filter_operator, :string, default: 'and'
|
84
|
+
config_param :type_cast, :bool, default: true
|
85
|
+
config_param :parse_request, :bool, default: true
|
82
86
|
|
83
87
|
def configure(conf)
|
84
88
|
super
|
85
89
|
|
86
90
|
unless ELB_TYPES.include?(@elb_type)
|
87
|
-
raise
|
91
|
+
raise Fluent::ConfigError, "Invalid ELB type: #{@elb_type}"
|
92
|
+
end
|
93
|
+
|
94
|
+
unless %w(and or).include?(@filter_operator)
|
95
|
+
raise Fluent::ConfigError, "Invalid filter operator: #{@filter_operator}"
|
88
96
|
end
|
89
97
|
|
90
98
|
FileUtils.touch(@tsfile_path)
|
@@ -102,6 +110,10 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
102
110
|
end
|
103
111
|
|
104
112
|
@history = load_history
|
113
|
+
|
114
|
+
if @filter
|
115
|
+
@filter = Hash[@filter.map {|k, v| [k.to_s, Regexp.new(v.to_s)] }]
|
116
|
+
end
|
105
117
|
end
|
106
118
|
|
107
119
|
def start
|
@@ -239,10 +251,6 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
239
251
|
parsed_access_log.each do |row|
|
240
252
|
record = Hash[access_log_fields.keys.zip(row)]
|
241
253
|
|
242
|
-
access_log_fields.each do |name, conv|
|
243
|
-
record[name] = record[name].send(conv) if conv
|
244
|
-
end
|
245
|
-
|
246
254
|
split_address_port!(record, 'client')
|
247
255
|
|
248
256
|
case @elb_type
|
@@ -252,7 +260,23 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
252
260
|
split_address_port!(record, 'target')
|
253
261
|
end
|
254
262
|
|
255
|
-
|
263
|
+
if @filter
|
264
|
+
if @filter_operator == 'or'
|
265
|
+
next if @filter.all? {|k, r| record[k] !~ r }
|
266
|
+
else
|
267
|
+
next if @filter.any? {|k, r| record[k] !~ r }
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
if @type_cast
|
272
|
+
access_log_fields.each do |name, conv|
|
273
|
+
record[name] = record[name].send(conv) if conv
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
if @parse_request
|
278
|
+
parse_request!(record)
|
279
|
+
end
|
256
280
|
|
257
281
|
records << record
|
258
282
|
end
|
@@ -327,7 +351,7 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
327
351
|
return unless address_port
|
328
352
|
address, port = address_port.split(':', 2)
|
329
353
|
record[prefix] = address
|
330
|
-
record["#{prefix}_port"] = port
|
354
|
+
record["#{prefix}_port"] = port
|
331
355
|
end
|
332
356
|
|
333
357
|
def parse_request!(record)
|
@@ -344,7 +368,13 @@ class Fluent::Plugin::ElbAccessLogInput < Fluent::Input
|
|
344
368
|
|
345
369
|
if uri
|
346
370
|
[:scheme ,:user, :host, :port, :path, :query, :fragment].each do |key|
|
347
|
-
|
371
|
+
value = uri.send(key)
|
372
|
+
|
373
|
+
if not @type_cast and key == :port
|
374
|
+
value = value.to_s
|
375
|
+
end
|
376
|
+
|
377
|
+
record["request.uri.#{key}"] = value
|
348
378
|
end
|
349
379
|
end
|
350
380
|
rescue => e
|
@@ -275,6 +275,123 @@ https 2015-05-25T19:55:36.000000Z hoge 14.14.124.20:57673 10.0.199.184:80 0.0000
|
|
275
275
|
is_expected.to match_table expected_emits
|
276
276
|
end
|
277
277
|
end
|
278
|
+
|
279
|
+
context 'with filter' do
|
280
|
+
let(:fluentd_conf) do
|
281
|
+
{
|
282
|
+
interval: 0,
|
283
|
+
account_id: account_id,
|
284
|
+
s3_bucket: s3_bucket,
|
285
|
+
region: region,
|
286
|
+
start_datetime: (today - 1).to_s,
|
287
|
+
elb_type: 'alb',
|
288
|
+
filter: '{"timestamp": "2015-05-25"}',
|
289
|
+
}
|
290
|
+
end
|
291
|
+
|
292
|
+
it do
|
293
|
+
expected_emits.slice!(0, 2)
|
294
|
+
is_expected.to match_table expected_emits
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
context 'with filter (or)' do
|
299
|
+
let(:fluentd_conf) do
|
300
|
+
{
|
301
|
+
interval: 0,
|
302
|
+
account_id: account_id,
|
303
|
+
s3_bucket: s3_bucket,
|
304
|
+
region: region,
|
305
|
+
start_datetime: (today - 1).to_s,
|
306
|
+
elb_type: 'alb',
|
307
|
+
filter: '{"timestamp": "2015-05-25"}',
|
308
|
+
filter_operator: 'or'
|
309
|
+
}
|
310
|
+
end
|
311
|
+
|
312
|
+
it do
|
313
|
+
expected_emits.slice!(0, 2)
|
314
|
+
is_expected.to match_table expected_emits
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
context 'with filter (or/multi)' do
|
319
|
+
let(:fluentd_conf) do
|
320
|
+
{
|
321
|
+
interval: 0,
|
322
|
+
account_id: account_id,
|
323
|
+
s3_bucket: s3_bucket,
|
324
|
+
region: region,
|
325
|
+
start_datetime: (today - 1).to_s,
|
326
|
+
elb_type: 'alb',
|
327
|
+
filter: '{"timestamp": "2015-05-25", "elb_status_code": "^2"}',
|
328
|
+
filter_operator: 'or'
|
329
|
+
}
|
330
|
+
end
|
331
|
+
|
332
|
+
it do
|
333
|
+
is_expected.to match_table expected_emits
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
context 'without type cast' do
|
338
|
+
let(:fluentd_conf) do
|
339
|
+
{
|
340
|
+
interval: 0,
|
341
|
+
account_id: account_id,
|
342
|
+
s3_bucket: s3_bucket,
|
343
|
+
region: region,
|
344
|
+
start_datetime: (today - 1).to_s,
|
345
|
+
elb_type: 'alb',
|
346
|
+
type_cast: 'false',
|
347
|
+
}
|
348
|
+
end
|
349
|
+
|
350
|
+
it do
|
351
|
+
expected_emits_without_type_cast = expected_emits.map do |tag, ts, h|
|
352
|
+
h = Hash[h.map {|k, v|
|
353
|
+
v = case v
|
354
|
+
when nil
|
355
|
+
v
|
356
|
+
when Float
|
357
|
+
"%.6f" % v
|
358
|
+
else
|
359
|
+
v.to_s
|
360
|
+
end
|
361
|
+
|
362
|
+
[k, v]
|
363
|
+
}]
|
364
|
+
|
365
|
+
[tag, ts, h]
|
366
|
+
end
|
367
|
+
|
368
|
+
is_expected.to match_table expected_emits_without_type_cast
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
|
373
|
+
context 'without request parsing' do
|
374
|
+
let(:fluentd_conf) do
|
375
|
+
{
|
376
|
+
interval: 0,
|
377
|
+
account_id: account_id,
|
378
|
+
s3_bucket: s3_bucket,
|
379
|
+
region: region,
|
380
|
+
start_datetime: (today - 1).to_s,
|
381
|
+
elb_type: 'alb',
|
382
|
+
parse_request: 'false',
|
383
|
+
}
|
384
|
+
end
|
385
|
+
|
386
|
+
it do
|
387
|
+
expected_emits_without_request_parsing = expected_emits.map do |tag, ts, h|
|
388
|
+
h = Hash[h.select {|k, v| k !~ /\Arequest\./ }]
|
389
|
+
[tag, ts, h]
|
390
|
+
end
|
391
|
+
|
392
|
+
is_expected.to match_table expected_emits_without_request_parsing
|
393
|
+
end
|
394
|
+
end
|
278
395
|
end
|
279
396
|
|
280
397
|
context 'when include bad URI' do
|
@@ -247,6 +247,117 @@ describe Fluent::Plugin::ElbAccessLogInput do
|
|
247
247
|
is_expected.to match_table expected_emits
|
248
248
|
end
|
249
249
|
end
|
250
|
+
|
251
|
+
context 'with filter' do
|
252
|
+
let(:fluentd_conf) do
|
253
|
+
{
|
254
|
+
interval: 0,
|
255
|
+
account_id: account_id,
|
256
|
+
s3_bucket: s3_bucket,
|
257
|
+
region: region,
|
258
|
+
start_datetime: (today - 1).to_s,
|
259
|
+
filter: '{"timestamp": "2015-05-25"}',
|
260
|
+
}
|
261
|
+
end
|
262
|
+
|
263
|
+
it do
|
264
|
+
expected_emits.slice!(0, 2)
|
265
|
+
is_expected.to match_table expected_emits
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'with filter (or)' do
|
270
|
+
let(:fluentd_conf) do
|
271
|
+
{
|
272
|
+
interval: 0,
|
273
|
+
account_id: account_id,
|
274
|
+
s3_bucket: s3_bucket,
|
275
|
+
region: region,
|
276
|
+
start_datetime: (today - 1).to_s,
|
277
|
+
filter: '{"timestamp": "2015-05-25"}',
|
278
|
+
filter_operator: 'or',
|
279
|
+
}
|
280
|
+
end
|
281
|
+
|
282
|
+
it do
|
283
|
+
expected_emits.slice!(0, 2)
|
284
|
+
is_expected.to match_table expected_emits
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context 'with filter (or/multi)' do
|
289
|
+
let(:fluentd_conf) do
|
290
|
+
{
|
291
|
+
interval: 0,
|
292
|
+
account_id: account_id,
|
293
|
+
s3_bucket: s3_bucket,
|
294
|
+
region: region,
|
295
|
+
start_datetime: (today - 1).to_s,
|
296
|
+
filter: '{"timestamp": "2015-05-25", "elb_status_code": "^2"}',
|
297
|
+
filter_operator: 'or',
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
it do
|
302
|
+
is_expected.to match_table expected_emits
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
context 'without type cast' do
|
307
|
+
let(:fluentd_conf) do
|
308
|
+
{
|
309
|
+
interval: 0,
|
310
|
+
account_id: account_id,
|
311
|
+
s3_bucket: s3_bucket,
|
312
|
+
region: region,
|
313
|
+
start_datetime: (today - 1).to_s,
|
314
|
+
type_cast: 'false',
|
315
|
+
}
|
316
|
+
end
|
317
|
+
|
318
|
+
it do
|
319
|
+
expected_emits_without_type_cast = expected_emits.map do |tag, ts, h|
|
320
|
+
h = Hash[h.map {|k, v|
|
321
|
+
v = case v
|
322
|
+
when nil
|
323
|
+
v
|
324
|
+
when Float
|
325
|
+
"%.6f" % v
|
326
|
+
else
|
327
|
+
v.to_s
|
328
|
+
end
|
329
|
+
|
330
|
+
[k, v]
|
331
|
+
}]
|
332
|
+
|
333
|
+
[tag, ts, h]
|
334
|
+
end
|
335
|
+
|
336
|
+
is_expected.to match_table expected_emits_without_type_cast
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
context 'without request parsing' do
|
341
|
+
let(:fluentd_conf) do
|
342
|
+
{
|
343
|
+
interval: 0,
|
344
|
+
account_id: account_id,
|
345
|
+
s3_bucket: s3_bucket,
|
346
|
+
region: region,
|
347
|
+
start_datetime: (today - 1).to_s,
|
348
|
+
parse_request: 'false',
|
349
|
+
}
|
350
|
+
end
|
351
|
+
|
352
|
+
it do
|
353
|
+
expected_emits_without_request_parsing = expected_emits.map do |tag, ts, h|
|
354
|
+
h = Hash[h.select {|k, v| k !~ /\Arequest\./ }]
|
355
|
+
[tag, ts, h]
|
356
|
+
end
|
357
|
+
|
358
|
+
is_expected.to match_table expected_emits_without_request_parsing
|
359
|
+
end
|
360
|
+
end
|
250
361
|
end
|
251
362
|
|
252
363
|
context 'when include bad URI' do
|
@@ -44,6 +44,10 @@ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
|
|
44
44
|
expect(driver.instance.sampling_interval).to eq 1
|
45
45
|
expect(driver.instance.debug).to be_falsey
|
46
46
|
expect(driver.instance.elb_type).to eq 'clb'
|
47
|
+
expect(driver.instance.filter).to be_nil
|
48
|
+
expect(driver.instance.filter_operator).to eq 'and'
|
49
|
+
expect(driver.instance.type_cast).to be_truthy
|
50
|
+
expect(driver.instance.parse_request).to be_truthy
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
@@ -63,6 +67,8 @@ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
|
|
63
67
|
let(:history_length) { 200 }
|
64
68
|
let(:sampling_interval) { 100 }
|
65
69
|
let(:elb_type) { 'alb' }
|
70
|
+
let(:filter) { 'elb_status_code:^2' }
|
71
|
+
let(:filter_operator) { 'or' }
|
66
72
|
|
67
73
|
let(:fluentd_conf) do
|
68
74
|
{
|
@@ -85,6 +91,10 @@ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
|
|
85
91
|
sampling_interval: sampling_interval,
|
86
92
|
debug: true,
|
87
93
|
elb_type: elb_type,
|
94
|
+
filter: filter,
|
95
|
+
filter_operator: filter_operator,
|
96
|
+
type_cast: 'false',
|
97
|
+
parse_request: 'false',
|
88
98
|
}
|
89
99
|
end
|
90
100
|
|
@@ -107,6 +117,10 @@ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
|
|
107
117
|
expect(driver.instance.sampling_interval).to eq sampling_interval
|
108
118
|
expect(driver.instance.debug).to be_truthy
|
109
119
|
expect(driver.instance.elb_type).to eq elb_type
|
120
|
+
expect(driver.instance.filter).to eq('elb_status_code' => /^2/)
|
121
|
+
expect(driver.instance.filter_operator).to eq filter_operator
|
122
|
+
expect(driver.instance.type_cast).to be_falsey
|
123
|
+
expect(driver.instance.parse_request).to be_falsey
|
110
124
|
end
|
111
125
|
end
|
112
126
|
|
@@ -190,4 +204,24 @@ describe 'Fluent::Plugin::ElbAccessLogInput#configure' do
|
|
190
204
|
}.to raise_error 'Invalid ELB type: invalid'
|
191
205
|
end
|
192
206
|
end
|
207
|
+
|
208
|
+
context 'when an invalid filter operator' do
|
209
|
+
let(:start_datetime) { '2015-01-01 01:02:03 UTC' }
|
210
|
+
|
211
|
+
let(:fluentd_conf) do
|
212
|
+
{
|
213
|
+
account_id: account_id,
|
214
|
+
s3_bucket: s3_bucket,
|
215
|
+
region: region,
|
216
|
+
start_datetime: start_datetime,
|
217
|
+
filter_operator: 'invalid',
|
218
|
+
}
|
219
|
+
end
|
220
|
+
|
221
|
+
it do
|
222
|
+
expect {
|
223
|
+
subject
|
224
|
+
}.to raise_error 'Invalid filter operator: invalid'
|
225
|
+
end
|
226
|
+
end
|
193
227
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-elb-access-log
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genki Sugawara
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|