fluent-plugin-forest 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 068cf7b8d91c92de946e8654ff085d8f2774976e
4
- data.tar.gz: eb6b060dcadae7ee75634e762bce1101242278a1
3
+ metadata.gz: ea721095d308823baadbc9e6296c076c75d1011f
4
+ data.tar.gz: d5d3ae86ae4638783e7f8286373c1b47906068b9
5
5
  SHA512:
6
- metadata.gz: 270e18f43d93d9c0ae18aa1ed852d2fdd85ad8b2b614a79f4ca43a75f240086aaa311f3fb5fbd1f1c60c869789cd896d1a477b937dc722505c7ee29653178ac5
7
- data.tar.gz: 0bfea56fe80e620a2e955fba8604a179cb34b2436b3cb1be23dd886bccfc71405e986bc0101d1dd90b5128c7dcf2cca6d94d584650a6ae1539cf841fe6c9f170
6
+ metadata.gz: a0ce28f5b60185e4758367ef918990cf18537e8a5b5bcaa308b7d554efd4ff810c0bda0825262fd11510abdbaced8c39ff85566b8cc51d21df88b849db759d65
7
+ data.tar.gz: 061c8287095c952c4fc94be45bc24e755f86dc067c1130fc34b1ab1a4830bb7d4cf9bdab1a6ee48522c6b18ca498495c53bad71f8df0227619a0e1f4a28181f5
data/README.md CHANGED
@@ -15,7 +15,8 @@ Other supported placeholders:
15
15
  * \_\_ESCAPED\_TAG\_\_ (or ${escaped\_tag})
16
16
  * replaced with escaped tag. Escaped tag is replaced '.' with a character specified by 'escape\_tag\_separator' (default: '\_')
17
17
  * \_\_TAG_PARTS[n]\_\_ (or ${tag_parts[n]})
18
- * it acts accessing the index which split the tag with '.' (dot). It will get 'td' by ${tag_parts[0]} and 'apache' by ${tag_parts[1]} when the tag was `td.apache.access`.
18
+ * it acts accessing the index which split the tag with '.' (dot). It will get 'td' by ${tag_parts[0]}, 'apache' by ${tag_parts[1]} and 'access' by ${tag_parts[-1]} when the tag was `td.apache.access`.
19
+ * you can also use range index like '1..4' or '1...3' (e.g. ${tag_parts[1..-1]} will return 'apache.access' on giving tag same as previous.)
19
20
 
20
21
  You SHOULD NOT use ForestOutput for tags increasing infinitly.
21
22
 
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = "fluent-plugin-forest"
4
- gem.version = "0.2.2"
4
+ gem.version = "0.2.3"
5
5
  gem.authors = ["TAGOMORI Satoshi"]
6
6
  gem.email = ["tagomoris@gmail.com"]
7
7
  gem.description = %q{create sub-plugin dynamically per tags, with template configuration and parameters}
@@ -32,12 +32,6 @@ class Fluent::ForestOutput < Fluent::MultiOutput
32
32
  # read and throw away to supress unread configuration warning
33
33
  touch_recursive(element)
34
34
 
35
- element.each do |k,v|
36
- unless v.match(/\$\{tag_parts\[\d\.\.\.?\d\]\}/).nil? or v.match(/__TAG_PARTS\[\d\.\.\.?\d\]__/).nil?
37
- raise Fluent::ConfigError, "${tag_parts[n]} and __TAG_PARTS[n]__ placeholder does not support range specify at #{k} #{v}"
38
- end
39
- end
40
-
41
35
  case element.name
42
36
  when 'template'
43
37
  @template = element
@@ -67,17 +61,30 @@ class Fluent::ForestOutput < Fluent::MultiOutput
67
61
  end
68
62
 
69
63
  def parameter(tag, e, name = 'instance', arg = '')
70
- tag_parts = {}
71
- tag.split('.').each_with_index do |t, idx|
72
- tag_parts["${tag_parts[#{idx}]}"] = t
73
- tag_parts["__TAG_PARTS[#{idx}]__"] = t
74
- end
64
+ tag_parts = tag.split('.')
75
65
  escaped_tag = tag.gsub('.', @escape_tag_separator)
76
66
  pairs = {}
77
67
  e.each do |k,v|
78
- v = v.gsub(/(__TAG_PARTS\[[0-9]+\]__|\${tag_parts\[[0-9]+\]})/) do
79
- $log.warn "out_forest: missing placeholder. tag:#{tag} placeholder:#{$1} conf:#{k} #{v}" unless tag_parts.include?($1)
80
- tag_parts[$1]
68
+ v = v.gsub(/__TAG_PARTS\[-?[0-9]+(?:\.\.\.?-?[0-9]+)?\]__|\$\{tag_parts\[-?[0-9]+(?:\.\.\.?-?[0-9]+)?\]\}/) do |tag_parts_matched|
69
+ matched = /\[(?<first>-?[0-9]+)(?<range_part>(?<range_type>\.\.\.?)(?<last>-?[0-9]+))?\]/.match(tag_parts_matched)
70
+ if matched && matched[:range_part]
71
+ exclude_end = (matched[:range_type] == '...')
72
+ range = Range.new(matched[:first].to_i, matched[:last].to_i, exclude_end)
73
+ if tag_parts[range]
74
+ tag_parts[range].join(".")
75
+ else
76
+ $log.warn "out_forest: missing placeholder. tag:#{tag} placeholder:#{tag_parts_matched} conf:#{k} #{v}"
77
+ nil
78
+ end
79
+ elsif matched # non range index (without range_part)
80
+ index = matched[:first].to_i
81
+ unless tag_parts[index]
82
+ $log.warn "out_forest: missing placeholder. tag:#{tag} placeholder:#{tag_parts_matched} conf:#{k} #{v}"
83
+ end
84
+ tag_parts[index]
85
+ else
86
+ raise "BUG: gsub regex matches but index regex does not match"
87
+ end
81
88
  end
82
89
  v = v.gsub('__ESCAPED_TAG__', escaped_tag).gsub('${escaped_tag}', escaped_tag)
83
90
  pairs[k] = v.gsub('__TAG__', tag).gsub('${tag}', tag).gsub('__HOSTNAME__', @hostname).gsub('${hostname}', @hostname)
@@ -285,43 +285,79 @@ escape_tag_separator +
285
285
  assert_equal 'zzzzzz.xx+1+2', conf['keyz']
286
286
  end
287
287
 
288
- def test_spec_split_tag_by_dot
289
- assert_raise(Fluent::ConfigError) {
290
- d = create_driver %[
291
- subtype hoge
292
- <template>
293
- keyx ${tag_parts[0..2]}.__TAG_PARTS[0..2]__
294
- </template>
295
- ]
296
- }
288
+ def test_spec_split_tag_by_dot_with_int_index
297
289
  d = create_driver %[
298
290
  subtype hoge
299
291
  <template>
300
- keyx xxxxxx
301
- keyy yyyyyy.${tag_parts[0]}
292
+ keya aaaaaa
293
+ keyb bbbbbb.${tag_parts[0]}
302
294
  unknown_tag_parts bar${tag_parts[999]}__TAG_PARTS[999]__
303
295
  </template>
304
296
  <case xx.*>
305
- keyz zzzzzz.${tag_parts[0]}.${tag_parts[1]}
297
+ keyc cccccc.${tag_parts[0]}.${tag_parts[1]}
298
+ keyd dddddd.${tag_parts[-2]}.${tag_parts[-1]}
306
299
  alt_key a
307
300
  </case>
308
301
  <case xx.**>
309
- keyz zzzzzz.__TAG_PARTS[0]__.__TAG_PARTS[2]__
302
+ keyc cccccc.__TAG_PARTS[0]__.__TAG_PARTS[2]__
303
+ keyd dddddd.__TAG_PARTS[-2]__.__TAG_PARTS[-1]__
310
304
  alt_key b
311
305
  </case>
312
306
  ]
313
307
 
314
308
  conf = d.instance.spec('xx.1')
315
- assert_equal 'xxxxxx', conf['keyx']
316
- assert_equal 'yyyyyy.xx', conf['keyy']
317
- assert_equal 'zzzzzz.xx.1', conf['keyz']
309
+ assert_equal 'aaaaaa', conf['keya']
310
+ assert_equal 'bbbbbb.xx', conf['keyb']
311
+ assert_equal 'cccccc.xx.1', conf['keyc']
312
+ assert_equal 'dddddd.xx.1', conf['keyd']
318
313
  assert_equal 'bar', conf['unknown_tag_parts']
319
314
  assert_equal 'a', conf['alt_key']
320
315
 
321
316
  conf = d.instance.spec('xx.1.2')
322
- assert_equal 'xxxxxx', conf['keyx']
323
- assert_equal 'yyyyyy.xx', conf['keyy']
324
- assert_equal 'zzzzzz.xx.2', conf['keyz']
317
+ assert_equal 'aaaaaa', conf['keya']
318
+ assert_equal 'bbbbbb.xx', conf['keyb']
319
+ assert_equal 'cccccc.xx.2', conf['keyc']
320
+ assert_equal 'dddddd.1.2', conf['keyd']
321
+ assert_equal 'b', conf['alt_key']
322
+ end
323
+
324
+ def test_spec_split_tag_by_dot_with_range_index
325
+ d = create_driver %[
326
+ subtype hoge
327
+ <template>
328
+ keya aaaaaa
329
+ keyb bbbbbb.${tag_parts[0]}
330
+ unknown_tag_parts bar${tag_parts[999..1000]}__TAG_PARTS[999...1001]__
331
+ </template>
332
+ <case xx.*>
333
+ keyc cccccc.${tag_parts[0..1]}
334
+ keyd dddddd.${tag_parts[-2..-1]}
335
+ keye eeeeee.${tag_parts[1..1000]}
336
+ alt_key a
337
+ </case>
338
+ <case xx.**>
339
+ keyc cccccc.__TAG_PARTS[1...3]__
340
+ keyd dddddd.__TAG_PARTS[-3...-1]__
341
+ keye eeeeee.__TAG_PARTS[1...1000]__
342
+ alt_key b
343
+ </case>
344
+ ]
345
+
346
+ conf = d.instance.spec('xx.1')
347
+ assert_equal 'aaaaaa', conf['keya']
348
+ assert_equal 'bbbbbb.xx', conf['keyb']
349
+ assert_equal 'cccccc.xx.1', conf['keyc']
350
+ assert_equal 'dddddd.xx.1', conf['keyd']
351
+ assert_equal 'eeeeee.1', conf['keye']
352
+ assert_equal 'bar', conf['unknown_tag_parts']
353
+ assert_equal 'a', conf['alt_key']
354
+
355
+ conf = d.instance.spec('xx.1.2')
356
+ assert_equal 'aaaaaa', conf['keya']
357
+ assert_equal 'bbbbbb.xx', conf['keyb']
358
+ assert_equal 'cccccc.1.2', conf['keyc']
359
+ assert_equal 'dddddd.xx.1', conf['keyd']
360
+ assert_equal 'eeeeee.1.2', conf['keye']
325
361
  assert_equal 'b', conf['alt_key']
326
362
  end
327
363
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-forest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-23 00:00:00.000000000 Z
11
+ date: 2013-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake