fluent-plugin-rewrite-tag-filter 1.3.1 → 1.4.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.
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # fluent-plugin-rewrite-tag-filter
1
+ # fluent-plugin-rewrite-tag-filter [![Build Status](https://travis-ci.org/fluent/fluent-plugin-rewrite-tag-filter.png?branch=master)](https://travis-ci.org/fluent/fluent-plugin-rewrite-tag-filter)
2
2
 
3
3
  ## Overview
4
4
 
@@ -11,12 +11,14 @@ user-agent, request-uri, regex-backreference and so on with regular expression.
11
11
 
12
12
  ## Installation
13
13
 
14
+ install with gem or fluent-gem command as:
15
+
14
16
  ```
15
- # native gem
16
- gem install fluent-plugin-rewrite-tag-filter
17
+ # for fluentd
18
+ $ gem install fluent-plugin-rewrite-tag-filter
17
19
 
18
- # td-agent gem
19
- /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite-tag-filter
20
+ # for td-agent
21
+ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-rewrite-tag-filter
20
22
  ```
21
23
 
22
24
  ## Configuration
@@ -26,7 +28,8 @@ gem install fluent-plugin-rewrite-tag-filter
26
28
  ```
27
29
  rewriterule<num> <attribute> <regex_pattern> <new_tag>
28
30
 
29
- # Optional: Capitalize every matched regex backreference. (ex: $1, $2)
31
+ # Optional: Capitalize letter for every matched regex backreference. (ex: maps -> Maps)
32
+ # for more details, see usage.
30
33
  capitalize_regex_backreference <yes/no> (default no)
31
34
 
32
35
  # Optional: remove tag prefix for tag placeholder. (see the section of "Tag placeholder")
@@ -50,6 +53,7 @@ It's a sample to exclude some static file log before split tag by domain.
50
53
  pos_file /var/log/td-agent/apache_access.pos
51
54
  </source>
52
55
 
56
+ # "capitalize_regex_backreference yes" affects converting every matched first letter of backreference to upper case. ex: maps -> Maps
53
57
  # At rewriterule2, redirect to tag named "clear" which unmatched for status code 200.
54
58
  # At rewriterule3, redirect to tag named "clear" which is not end with ".com"
55
59
  # At rewriterule6, "site.$2$1" to be "site.ExampleMail" by capitalize_regex_backreference option.
@@ -110,19 +114,30 @@ $ tailf /var/log/td-agent/td-agent.log
110
114
 
111
115
  ### Tag placeholder
112
116
 
113
- It is supporting there placeholder for new_tag(rewrited tag).
117
+ It is supported these placeholder for new_tag (rewrited tag).
114
118
 
115
119
  - `${tag}`
116
120
  - `__TAG__`
121
+ - `{$tag_parts[n]}`
122
+ - `__TAG_PARTS[n]__`
123
+ - `${hostname}`
124
+ - `__HOSTNAME__`
125
+
126
+ The placeholder of `{$tag_parts[n]}` and `__TAG_PARTS[n]__` acts accessing the index which split the tag with "." (dot).
127
+ For example with `td.apache.access` tag, it will get `td` by `${tag_parts[0]}` and `apache` by `${tag_parts[1]}`.
128
+
129
+ **Note** Currently, range expression ```${tag_parts[0..2]}``` is not supported.
130
+
131
+ #### Placeholder Option
132
+
133
+ * `remove_tag_prefix`
117
134
 
118
- It's available to use this placeholder with `remove_tag_prefix` option.
119
135
  This option adds removing tag prefix for `${tag}` or `__TAG__` in placeholder.
120
136
 
121
- - `${hostname}`
122
- - `__HOSTNAME__`
137
+ * `hostname_command`
123
138
 
124
139
  By default, execute command as `hostname` to get full hostname.
125
- Also, you can override hostname command using `hostname_command` option.
140
+ On your needs, it could override hostname command using `hostname_command` option.
126
141
  It comes short hostname with `hostname_command hostname -s` configuration specified.
127
142
 
128
143
  #### Placeholder Usage
@@ -149,6 +164,12 @@ It's a sample to rewrite a tag with placeholder.
149
164
  rewriterule1 domain ^(mail)\.(example)\.com$ rewrited.$2$1.${hostname}
150
165
  hostname_command hostname -s
151
166
  </match>
167
+
168
+ # It will get "rewrited.game.pool"
169
+ <match app.game.pool.activity>
170
+ type rewrite_tag_filter
171
+ rewriterule1 domain ^.+$ rewrited.${tag_parts[1]}.${tag_parts[2]}
172
+ </match>
152
173
  ```
153
174
 
154
175
  ## Example
@@ -185,6 +206,17 @@ http://y-ken.hatenablog.com/entry/fluent-plugin-rewrite-tag-filter-v1.2.1
185
206
  - 待望の正規表現の否定パターンに対応した fluent-plugin-rewrite-tag-filter v1.3.0 をリリースしました #fluentd
186
207
  http://y-ken.hatenablog.com/entry/fluent-plugin-rewrite-tag-filter-v1.3.0
187
208
 
209
+ - 不具合修正版 fluent-plugin-rewrite-tag-filter v1.3.1 をリリースしました #fluentd
210
+ http://y-ken.hatenablog.com/entry/fluent-plugin-rewrite-tag-filter-v1.3.1
211
+
212
+ - PostgreSQLのログをfluentdで回収する設定 — still deeper
213
+ http://chopl.in/blog/2013/06/07/postgresql_csv_log_with_fluentd.html
214
+
215
+ - S3とFluentdを用いた効率的なログ管理 | SmartNews開発者ブログ
216
+ http://developer.smartnews.be/blog/2013/09/02/an-effective-log-management-technique-which-uses-fluentd-and-s3/
217
+
218
+ - fluentd(td-agent) の導入 : Raccoon Tech Blog [株式会社ラクーン 技術戦略部ブログ]
219
+ http://techblog.raccoon.ne.jp/archives/35031163.html
188
220
 
189
221
  ## TODO
190
222
 
@@ -3,7 +3,8 @@ $:.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 = "1.3.1"
6
+ s.version = "1.4.0"
7
+ s.license = "Apache 2.0"
7
8
  s.authors = ["Kentaro Yoshida"]
8
9
  s.email = ["y.ken.studio@gmail.com"]
9
10
  s.homepage = "https://github.com/y-ken/fluent-plugin-rewrite-tag-filter"
@@ -19,6 +19,11 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
19
19
  if regexp.nil? || rewritetag.nil?
20
20
  raise Fluent::ConfigError, "failed to parse rewriterules at #{key} #{conf[key]}"
21
21
  end
22
+
23
+ unless rewritetag.match(/\$\{tag_parts\[\d\.\.\.?\d\]\}/).nil? or rewritetag.match(/__TAG_PARTS\[\d\.\.\.?\d\]__/).nil?
24
+ raise Fluent::ConfigError, "${tag_parts[n]} and __TAG_PARTS[n]__ placeholder does not support range specify at #{key} #{conf[key]}"
25
+ end
26
+
22
27
  @rewriterules.push([rewritekey, /#{trim_regex_quote(regexp)}/, get_match_operator(regexp), rewritetag])
23
28
  rewriterule_names.push(rewritekey + regexp)
24
29
  $log.info "adding rewrite_tag_filter rule: #{key} #{@rewriterules.last}"
@@ -61,7 +66,10 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
61
66
  backreference_table = get_backreference_table($~.captures)
62
67
  rewritetag = rewritetag.gsub(/\$\d+/, backreference_table)
63
68
  end
64
- rewritetag = rewritetag.gsub(/(\${[a-z]+}|__[A-Z]+__)/, placeholder)
69
+ rewritetag = rewritetag.gsub(/(\${[a-z_]+(\[[0-9]+\])?}|__[A-Z_]+__)/) do
70
+ $log.warn "rewrite_tag_filter: unknown placeholder found. :placeholder=>#{$1} :tag=>#{tag} :rewritetag=>#{rewritetag}" unless placeholder.include?($1)
71
+ placeholder[$1]
72
+ end
65
73
  return rewritetag
66
74
  end
67
75
  return nil
@@ -99,12 +107,20 @@ class Fluent::RewriteTagFilterOutput < Fluent::Output
99
107
 
100
108
  def get_placeholder(tag)
101
109
  tag = tag.sub(@remove_tag_prefix, '') if @remove_tag_prefix
102
- return {
110
+
111
+ result = {
103
112
  '__HOSTNAME__' => @hostname,
104
113
  '${hostname}' => @hostname,
105
114
  '__TAG__' => tag,
106
115
  '${tag}' => tag,
107
116
  }
117
+
118
+ tag.split('.').each_with_index do |t, idx|
119
+ result.store("${tag_parts[#{idx}]}", t)
120
+ result.store("__TAG_PARTS[#{idx}]__", t)
121
+ end
122
+
123
+ return result
108
124
  end
109
125
  end
110
126
 
@@ -55,6 +55,14 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
55
55
  rewriterule20 domain ^news\.google\.com$ site.GoogleNews
56
56
  ]
57
57
 
58
+ # split by tag
59
+ CONFIG_SPLIT_BY_TAG = %[
60
+ rewriterule1 user_name ^Lynn Minmay$ vip.${tag_parts[1]}.remember_love
61
+ rewriterule2 user_name ^Harlock$ ${tag_parts[2]}.${tag_parts[0]}.${tag_parts[1]}
62
+ rewriterule3 world ^(alice|chaos)$ application.${tag_parts[0]}.$1_server
63
+ rewriterule4 world ^[a-z]+$ application.${tag_parts[1]}.future_server
64
+ ]
65
+
58
66
  def create_driver(conf=CONFIG,tag='test')
59
67
  Fluent::Test::OutputTestDriver.new(Fluent::RewriteTagFilterOutput, tag).configure(conf)
60
68
  end
@@ -69,6 +77,12 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
69
77
  assert_raise(Fluent::ConfigError) {
70
78
  d = create_driver('rewriterule1 foo foo')
71
79
  }
80
+ assert_raise(Fluent::ConfigError) {
81
+ d = create_driver('rewriterule1 hoge hoge.${tag_parts[0..2]}.__TAG_PARTS[0..2]__')
82
+ }
83
+ assert_raise(Fluent::ConfigError) {
84
+ d = create_driver('rewriterule1 fuga fuga.${tag_parts[1...2]}.__TAG_PARTS[1...2]__')
85
+ }
72
86
  d = create_driver %[
73
87
  rewriterule1 domain ^www.google.com$ site.Google
74
88
  rewriterule2 domain ^news.google.com$ site.GoogleNews
@@ -188,5 +202,30 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
188
202
  assert_equal 'site.GoogleNews', emits[1][0] # tag
189
203
  end
190
204
 
205
+ def test_emit8_split_by_tag
206
+ d1 = create_driver(CONFIG_SPLIT_BY_TAG, 'game.production.api')
207
+ d1.run do
208
+ d1.emit({'user_id' => '10000', 'world' => 'chaos', 'user_name' => 'gamagoori'})
209
+ d1.emit({'user_id' => '10001', 'world' => 'chaos', 'user_name' => 'sanageyama'})
210
+ d1.emit({'user_id' => '10002', 'world' => 'nehan', 'user_name' => 'inumuta'})
211
+ d1.emit({'user_id' => '77777', 'world' => 'space', 'user_name' => 'Lynn Minmay'})
212
+ d1.emit({'user_id' => '99999', 'world' => 'space', 'user_name' => 'Harlock'})
213
+ end
214
+ emits = d1.emits
215
+ p emits
216
+ assert_equal 5, emits.length
217
+ p emits[0]
218
+ assert_equal 'application.game.chaos_server', emits[0][0]
219
+ p emits[1]
220
+ assert_equal 'application.game.chaos_server', emits[1][0]
221
+ p emits[2]
222
+ assert_equal 'application.production.future_server', emits[2][0]
223
+ p emits[3]
224
+ assert_equal 'vip.production.remember_love', emits[3][0]
225
+ p emits[4]
226
+ assert_equal 'api.game.production', emits[4][0]
227
+ end
228
+
229
+
191
230
  end
192
231
 
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: 1.3.1
4
+ version: 1.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-21 00:00:00.000000000 Z
12
+ date: 2013-12-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -51,6 +51,7 @@ extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
53
  - .gitignore
54
+ - .travis.yml
54
55
  - Gemfile
55
56
  - LICENSE.txt
56
57
  - README.md
@@ -62,7 +63,8 @@ files:
62
63
  - test/helper.rb
63
64
  - test/plugin/test_out_rewrite_tag_filter.rb
64
65
  homepage: https://github.com/y-ken/fluent-plugin-rewrite-tag-filter
65
- licenses: []
66
+ licenses:
67
+ - Apache 2.0
66
68
  post_install_message:
67
69
  rdoc_options: []
68
70
  require_paths: