fluent-plugin-rewrite-tag-filter 0.0.7 → 0.0.8

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.
data/README.rdoc CHANGED
@@ -14,13 +14,17 @@ user-agent, and request-uri and so on with regular expression.
14
14
  gem install fluent-plugin-rewrite-tag-filter
15
15
 
16
16
  # td-agent user
17
- /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-rewrite-tag-filter
17
+ /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite-tag-filter
18
18
 
19
19
  == Configuration
20
20
 
21
- Format
21
+ Syntax
22
22
 
23
23
  rewruterule<num:1-200> <attribute> <regex_pattern> <new_tag>
24
+
25
+ # Option: Capitalize every matched regex backreference (ex: $1, $2).
26
+ # It has described on usage section below.
27
+ capitalize_regex_backreference <default:no>
24
28
 
25
29
  Usage
26
30
 
@@ -36,10 +40,12 @@ Usage
36
40
 
37
41
  <match td.apache.access>
38
42
  type rewrite_tag_filter
43
+ capitalize_regex_backreference yes
39
44
  rewriterule1 path \.(gif|jpe?g|png|pdf|zip)$ clear
40
- rewriterule2 domain ^maps\.google\.com$ site.GoogleMap
41
- rewriterule3 domain ^news\.google\.com$ site.GoogleNews
42
- rewriterule4 domain ^mail\.google\.com$ site.GoogleMail
45
+ rewriterule2 domain ^maps\.example\.com$ site.ExampleMaps
46
+ rewriterule3 domain ^news\.example\.com$ site.ExampleNews
47
+ # "site.$2$1" to be "site.ExampleMail" by capitalize_regex_backreference option.
48
+ rewriterule4 domain ^(mail)\.(example)\.com$ site.$2$1
43
49
  rewriterule5 domain .+ site.unmatched
44
50
  </match>
45
51
 
@@ -60,13 +66,13 @@ Usage
60
66
  Result
61
67
 
62
68
  $ mongo
63
- MongoDB shell version: 2.0.6
69
+ MongoDB shell version: 2.2.0
64
70
  > use apache_access
65
71
  switched to db apache_access
66
72
  > show collections
67
- GoogleMap
68
- GoogleNews
69
- GoogleMail
73
+ ExampleMaps
74
+ ExampleNews
75
+ ExampleMail
70
76
  unmatched
71
77
 
72
78
  == Example
data/example2.conf CHANGED
@@ -29,7 +29,7 @@
29
29
  rewriterule1 path ^/(img|css|js|static|assets)/ clear
30
30
  rewriterule2 status ^(?!200)$ clear
31
31
  rewriterule3 method ^(?!GET)$ clear
32
- rewriterule4 agent "Mac OS X" clear
32
+ rewriterule4 agent Mac\sOS\sX clear
33
33
  rewriterule5 agent (spider|bot|crawler|\+http\:) clear
34
34
  rewriterule6 path ^/(admin|api|backend) site.GoogleMap.backend
35
35
  rewriterule7 path .+ site.GoogleMap.front
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fluent-plugin-rewrite-tag-filter"
6
- s.version = "0.0.7"
6
+ s.version = "0.0.8"
7
7
  s.authors = ["Kentaro Yoshida"]
8
8
  s.email = ["y.ken.studio@gmail.com"]
9
9
  s.homepage = "https://github.com/y-ken/fluent-plugin-rewrite-tag-filter"
@@ -7,6 +7,7 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
7
7
  (2..PATTERN_MAX_NUM).each do |i|
8
8
  config_param ('rewriterule' + i.to_s).to_sym, :string, :default => nil # NAME REGEXP
9
9
  end
10
+ config_param :capitalize_regex_backreference, :bool, :default => false
10
11
 
11
12
  def configure(conf)
12
13
  super
@@ -16,23 +17,24 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
16
17
 
17
18
  invalids = conf.keys.select{|k| k =~ /^rewriterule(\d+)$/}.select{|arg| arg =~ /^rewriterule(\d+)/ and not (1..PATTERN_MAX_NUM).include?($1.to_i)}
18
19
  if invalids.size > 0
19
- $log.warn "invalid number rewriterules (valid rewriterule number:1-{PATTERN_MAX_NUM}):" + invalids.join(",")
20
+ $log.warn "invalid number rewriterules (valid rewriterule number:1-{PATTERN_MAX_NUM}): #{invalids.join(",")}"
20
21
  end
21
22
  (1..PATTERN_MAX_NUM).each do |i|
22
23
  next unless conf["rewriterule#{i}"]
23
- rewritekey,regexp,rewritetag = conf["rewriterule#{i}"].split(/^(\S+) "?([\S\s]+?)"? (\S+)$/).reject(&:empty?)
24
+ rewritekey,regexp,rewritetag = conf["rewriterule#{i}"].match(/([^ ]+)\s(.+)\s([^ ]+)/).captures
24
25
  unless regexp != nil && rewritetag != nil
25
- raise Fluent::ConfigError, "missing values at " + "rewriterule#{i} " + conf["rewriterule#{i}"].inspect
26
+ raise Fluent::ConfigError, "missing values at rewriterule#{i} " + conf["rewriterule#{i}"].inspect
26
27
  end
27
28
  @rewriterules.push([i, rewritekey, Regexp.new(regexp), rewritetag])
28
29
  rewriterule_names.push(rewritekey + regexp)
30
+ $log.info "register rewrite_tag_filter rule: #{@rewriterules.last}"
29
31
  end
30
32
  rewriterule_index_list = conf.keys.select{|s| s =~ /^rewriterule\d$/}.map{|v| (/^rewriterule(\d)$/.match(v))[1].to_i}
31
33
  unless rewriterule_index_list.reduce(true){|v,i| v and @rewriterules[i - 1]}
32
- raise Fluent::ConfigError, "jump of rewriterule index found" + @rewriterules.inspect
34
+ raise Fluent::ConfigError, "jump of rewriterule index found #{@rewriterules.inspect}"
33
35
  end
34
36
  unless @rewriterules.length == rewriterule_names.uniq.length
35
- raise Fluent::ConfigError, "duplicated rewriterules found" + @rewriterules.inspect
37
+ raise Fluent::ConfigError, "duplicated rewriterules found #{@rewriterules.inspect}"
36
38
  end
37
39
  end
38
40
 
@@ -45,6 +47,9 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
45
47
  if (regexp && regexp.match(rewritevalue))
46
48
  rewrite = true
47
49
  tag = rewritetag
50
+ if rewritetag.include?('$')
51
+ tag = rewritetag.gsub(/\$\d+/, map_regex_table($~.captures))
52
+ end
48
53
  break
49
54
  end
50
55
  end
@@ -53,5 +58,15 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
53
58
 
54
59
  chain.next
55
60
  end
61
+
62
+ def map_regex_table(elements)
63
+ hash_table = Hash.new
64
+ index = 1
65
+ elements.each do |value|
66
+ hash_table["$#{index}"] = @capitalize_regex_backreference ? value.capitalize : value
67
+ index += 1
68
+ end
69
+ return hash_table
70
+ end
56
71
  end
57
72
 
@@ -4,11 +4,20 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
4
4
  def setup
5
5
  Fluent::Test.setup
6
6
  end
7
-
7
+
8
8
  CONFIG = %[
9
9
  rewriterule1 domain ^www\.google\.com$ site.Google
10
10
  rewriterule2 domain ^news\.google\.com$ site.GoogleNews
11
- rewriterule3 agent "Mac OS X" agent.MacOSX
11
+ rewriterule3 agent Mac\sOS\sX agent.MacOSX
12
+ rewriterule4 agent (Googlebot|CustomBot)-([a-zA-Z]+) agent.$1-$2
13
+ ]
14
+
15
+ CONFIG2 = %[
16
+ capitalize_regex_backreference yes
17
+ rewriterule1 domain ^www\.google\.com$ site.Google
18
+ rewriterule2 domain ^(news)\.(google)\.com$ site.$2$1
19
+ rewriterule3 agent Mac\sOS\sX agent.MacOSX
20
+ rewriterule4 agent (Googlebot|CustomBot)-([a-zA-Z]+) agent.$1-$2
12
21
  ]
13
22
 
14
23
  def create_driver(conf=CONFIG,tag='test')
@@ -35,13 +44,41 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
35
44
  d1.emit({'domain' => 'www.google.com', 'path' => '/foo/bar?key=value', 'agent' => 'Googlebot', 'response_time' => 1000000})
36
45
  d1.emit({'domain' => 'news.google.com', 'path' => '/', 'agent' => 'Googlebot-Mobile', 'response_time' => 900000})
37
46
  d1.emit({'domain' => 'map.google.com', 'path' => '/', 'agent' => 'Macintosh; Intel Mac OS X 10_7_4', 'response_time' => 900000})
47
+ d1.emit({'domain' => 'labs.google.com', 'path' => '/', 'agent' => 'Mozilla/5.0 Googlebot-FooBar/2.1', 'response_time' => 900000})
48
+ end
49
+ emits = d1.emits
50
+ assert_equal 4, emits.length
51
+ p emits[0]
52
+ assert_equal 'site.Google', emits[0][0] # tag
53
+ p emits[1]
54
+ assert_equal 'site.GoogleNews', emits[1][0] # tag
55
+ assert_equal 'news.google.com', emits[1][2]['domain']
56
+ p emits[2]
57
+ assert_equal 'agent.MacOSX', emits[2][0] #tag
58
+ p emits[3]
59
+ assert_equal 'agent.Googlebot-FooBar', emits[3][0] #tag
60
+ end
61
+
62
+ def test_emit2
63
+ d1 = create_driver(CONFIG2, 'input.access')
64
+ time = Time.parse("2012-01-02 13:14:15").to_i
65
+ d1.run do
66
+ d1.emit({'domain' => 'www.google.com', 'path' => '/foo/bar?key=value', 'agent' => 'Googlebot', 'response_time' => 1000000})
67
+ d1.emit({'domain' => 'news.google.com', 'path' => '/', 'agent' => 'Googlebot-Mobile', 'response_time' => 900000})
68
+ d1.emit({'domain' => 'map.google.com', 'path' => '/', 'agent' => 'Macintosh; Intel Mac OS X 10_7_4', 'response_time' => 900000})
69
+ d1.emit({'domain' => 'labs.google.com', 'path' => '/', 'agent' => 'Mozilla/5.0 Googlebot-FooBar/2.1', 'response_time' => 900000})
38
70
  end
39
71
  emits = d1.emits
40
- assert_equal 3, emits.length
72
+ assert_equal 4, emits.length
73
+ p emits[0]
41
74
  assert_equal 'site.Google', emits[0][0] # tag
75
+ p emits[1]
42
76
  assert_equal 'site.GoogleNews', emits[1][0] # tag
43
77
  assert_equal 'news.google.com', emits[1][2]['domain']
78
+ p emits[2]
44
79
  assert_equal 'agent.MacOSX', emits[2][0] #tag
80
+ p emits[3]
81
+ assert_equal 'agent.Googlebot-Foobar', emits[3][0] #tag
45
82
  end
46
83
  end
47
84
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-rewrite-tag-filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-28 00:00:00.000000000 Z
12
+ date: 2012-09-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
16
- requirement: &20535320 !ruby/object:Gem::Requirement
16
+ requirement: &20127680 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *20535320
24
+ version_requirements: *20127680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fluentd
27
- requirement: &20534460 !ruby/object:Gem::Requirement
27
+ requirement: &20126860 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *20534460
35
+ version_requirements: *20126860
36
36
  description:
37
37
  email:
38
38
  - y.ken.studio@gmail.com