fluent-plugin-rewrite-tag-filter 2.3.0 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4e1ce31eba327c311153c8eb2e96b8aef667bca6b92f9695c7b5a3fb11e7d58
4
- data.tar.gz: fc5e7682a7476dffcfdef523f06401508dcb888d3b4cff39edab742950bf9506
3
+ metadata.gz: a12e8f6567cd07462a236f0cda38e98bac14b921a2c7b762e9851cb04e5bf119
4
+ data.tar.gz: b198b1e6b8a48d386f7cc62521f358cdff745754edc8dda753ac176ced1e3e67
5
5
  SHA512:
6
- metadata.gz: '018336a8cf161d92674c7845fc021f4b01a11ce0762ff555067707345671b7d7b40d63f84ce308493beb36ce90ed581c90788905bdb0c14dc62125349ebcdc31'
7
- data.tar.gz: ecbd7f9591d477aba1fa776a58648e04ac085f442ec685aefbd0dc7d48160c3ca2cd819fc79bc3a59910aa8c5663d595c0339f8e7ab14f32b2d7f542667add00
6
+ metadata.gz: cc556895e92c3f53ca3c41af6866072e48ac53b6b170cfe163f1563d04310c8b89cc802cabefd957dab95da29362ff76164621f0a83d806619d67df521e866b6
7
+ data.tar.gz: 1777b76d00afe128f20da230ca26d0c30d4f62e60f4800efec6b59450040e54de7b861ee7913ed82af8f91b9f3cf5e11344b5ec5b08e57af97d611a0060d0ddf
data/README.md CHANGED
@@ -52,6 +52,7 @@ For more details, see [Plugin Management](https://docs.fluentd.org/deployment/pl
52
52
  `/regexp/` is preferred because `/regexp/` style can support character classes such as `/[a-z]/`.
53
53
  The pattern without slashes will cause errors if you use patterns start with character classes.
54
54
  * **tag** (string) (required): New tag
55
+ * **label** (string) (optional): New label. If specified, label can be changed per-rule.
55
56
  * **invert** (bool) (optional): If true, rewrite tag when unmatch pattern
56
57
  * Default value: `false`
57
58
 
@@ -300,6 +301,35 @@ It's a sample to rewrite a tag with placeholder.
300
301
  </match>
301
302
  ```
302
303
 
304
+ ### Altering Labels
305
+
306
+ In addition to changing tags, you can also change event's route by setting
307
+ the label for the re-emitted event.
308
+
309
+ For example, given this configuration:
310
+
311
+ ```
312
+ <match apache.access>
313
+ @type rewrite_tag_filter
314
+ <rule>
315
+ key domain
316
+ pattern ^www\.example\.com$
317
+ tag web.${tag}
318
+ </rule>
319
+ <rule>
320
+ key domain
321
+ pattern ^(.*)\.example\.com$
322
+ tag other.$1
323
+ label other
324
+ </rule>
325
+ </match>
326
+ ```
327
+
328
+ message: `{"domain": "www.example.com"}` will get its tag changed to
329
+ `web.apache.access`, while message
330
+ `{"domain": "api.example.com"}` will get its tag changed to `other.api` and
331
+ be sent to label `other`
332
+
303
333
  ## Example
304
334
 
305
335
  - Example1: how to analyze response_time, response_code and user_agent for each virtual domain websites.
@@ -2,7 +2,7 @@ $:.push File.expand_path("../lib", __FILE__)
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "fluent-plugin-rewrite-tag-filter"
5
- s.version = "2.3.0"
5
+ s.version = "2.4.0"
6
6
  s.license = "Apache-2.0"
7
7
  s.authors = ["Kentaro Yoshida"]
8
8
  s.email = ["y.ken.studio@gmail.com"]
@@ -24,6 +24,8 @@ class Fluent::Plugin::RewriteTagFilterOutput < Fluent::Plugin::Output
24
24
  config_param :pattern, :regexp
25
25
  desc "New tag"
26
26
  config_param :tag, :string
27
+ desc "New label. If specified, label can be changed per-rule."
28
+ config_param :label, :string, default: nil
27
29
  desc "If true, rewrite tag when unmatch pattern"
28
30
  config_param :invert, :bool, default: false
29
31
  end
@@ -43,7 +45,7 @@ class Fluent::Plugin::RewriteTagFilterOutput < Fluent::Plugin::Output
43
45
  end
44
46
 
45
47
  invert = rule.invert ? MATCH_OPERATOR_EXCLUDE : ""
46
- @rewriterules.push([record_accessor_create(rule.key), rule.pattern, invert, rule.tag])
48
+ @rewriterules.push([record_accessor_create(rule.key), rule.pattern, invert, rule.tag, rule.label])
47
49
  rewriterule_names.push(rule.key + invert + rule.pattern.to_s)
48
50
  log.info "adding rewrite_tag_filter rule: #{rule.key} #{@rewriterules.last}"
49
51
  end
@@ -75,35 +77,45 @@ class Fluent::Plugin::RewriteTagFilterOutput < Fluent::Plugin::Output
75
77
  true
76
78
  end
77
79
 
80
+ def get_router(tgt_label)
81
+ label_router = if tgt_label.nil? || tgt_label.empty?
82
+ router
83
+ else
84
+ event_emitter_router(tgt_label)
85
+ end
86
+ #log.trace "Got router for #{tgt_label}: #{!label_router.nil?}"
87
+ return label_router
88
+ end
89
+
78
90
  def process(tag, es)
79
91
  placeholder = get_placeholder(tag)
80
- if @batch_mode
81
- new_event_streams = Hash.new {|h, k| h[k] = Fluent::MultiEventStream.new }
82
- es.each do |time, record|
83
- rewrited_tag = rewrite_tag(tag, record, placeholder)
84
- if rewrited_tag.nil? || tag == rewrited_tag
85
- log.trace("rewrite_tag_filter: tag has not been rewritten", record)
86
- next
87
- end
88
- new_event_streams[rewrited_tag].add(time, record)
92
+ new_event_streams = Hash.new {|hh, kk| hh[kk] = Hash.new {|h, k| h[k] = Fluent::MultiEventStream.new }}if @batch_mode
93
+
94
+ es.each do |time, record|
95
+ rewrited_tag, rewrited_label = rewrite_tag(tag, record, placeholder)
96
+ if (rewrited_tag.nil? || tag == rewrited_tag) && rewrited_label.nil?
97
+ log.trace("rewrite_tag_filter: tag has not been rewritten", record)
98
+ next
89
99
  end
90
- new_event_streams.each do |rewrited_tag, new_es|
91
- router.emit_stream(rewrited_tag, new_es)
100
+ rewrited_tag = tag if rewrited_tag.nil?
101
+ if new_event_streams.nil?
102
+ get_router(rewrited_label).emit(rewrited_tag, time, record)
103
+ else
104
+ new_event_streams[rewrited_label][rewrited_tag].add(time, record)
92
105
  end
93
- else
94
- es.each do |time, record|
95
- rewrited_tag = rewrite_tag(tag, record, placeholder)
96
- if rewrited_tag.nil? || tag == rewrited_tag
97
- log.trace("rewrite_tag_filter: tag has not been rewritten", record)
98
- next
106
+ end
107
+ if !new_event_streams.nil?
108
+ new_event_streams.each do |rewrited_label, label_event_streams |
109
+ labeled_router = get_router(rewrited_label)
110
+ label_event_streams.each do |rewrited_tag, new_es|
111
+ labeled_router.emit_stream(rewrited_tag, new_es)
99
112
  end
100
- router.emit(rewrited_tag, time, record)
101
113
  end
102
114
  end
103
115
  end
104
116
 
105
117
  def rewrite_tag(tag, record, placeholder)
106
- @rewriterules.each do |record_accessor, regexp, match_operator, rewritetag|
118
+ @rewriterules.each do |record_accessor, regexp, match_operator, rewritetag, rewritelabel|
107
119
  rewritevalue = record_accessor.call(record).to_s
108
120
  next if rewritevalue.empty? && match_operator != MATCH_OPERATOR_EXCLUDE
109
121
  last_match = regexp_last_match(regexp, rewritevalue)
@@ -119,9 +131,9 @@ class Fluent::Plugin::RewriteTagFilterOutput < Fluent::Plugin::Output
119
131
  log.warn "rewrite_tag_filter: unknown placeholder found. :placeholder=>#{$1} :tag=>#{tag} :rewritetag=>#{rewritetag}" unless placeholder.include?($1)
120
132
  placeholder[$1]
121
133
  end
122
- return rewritetag
134
+ return rewritetag, rewritelabel
123
135
  end
124
- return nil
136
+ return nil, nil
125
137
  end
126
138
 
127
139
  def regexp_last_match(regexp, rewritevalue)
@@ -346,6 +346,77 @@ class RewriteTagFilterOutputTest < Test::Unit::TestCase
346
346
  assert_equal "com.example", events[0][0]
347
347
  end
348
348
 
349
+ test "get_router" do
350
+ conf = %[
351
+ <rule>
352
+ key key
353
+ pattern /^(odd|even)$/
354
+ tag $1
355
+ label new_label
356
+ </rule>
357
+ <rule>
358
+ key key
359
+ pattern /^(.*)$/
360
+ tag $1
361
+ </rule>
362
+ ]
363
+ time = event_time
364
+ d = create_driver(conf)
365
+ assert_equal(d.instance.router, d.instance.get_router(nil))
366
+ assert_equal(d.instance.router, d.instance.get_router(""))
367
+ new_label_router = d.instance.get_router("new_label")
368
+ refute_equal(d.instance.router, new_label_router)
369
+ end
370
+
371
+ test "relabel" do
372
+ conf = %[
373
+ emit_mode record
374
+ <rule>
375
+ key key
376
+ pattern /^(odd)$/
377
+ tag $1
378
+ label odd_label
379
+ </rule>
380
+ <rule>
381
+ key key
382
+ pattern /^(even)$/
383
+ tag ${tag}
384
+ label even_label
385
+ </rule>
386
+ <rule>
387
+ key key
388
+ pattern /^(.*)$/
389
+ tag $1
390
+ </rule>
391
+ ]
392
+ time = event_time
393
+ d = create_driver(conf)
394
+ # Router only called for default label
395
+ mock.proxy(d.instance.router).emit(anything, anything, anything).times(2)
396
+ mock.proxy(d.instance).get_router("odd_label").times(2)
397
+ mock.proxy(d.instance).get_router("even_label").times(2)
398
+ mock.proxy(d.instance).get_router(nil).times(2)
399
+ mock.proxy(d.instance.router).emit_stream(anything, anything).times(0)
400
+ d.run(default_tag: "input") do
401
+ d.feed([[time, { "key" => "odd", "message" => "message-1" }],
402
+ [time, { "key" => "even", "message" => "message-2" }],
403
+ [time, { "key" => "zero", "message" => "message-3" }],
404
+ [time, { "key" => "odd", "message" => "message-4" }],
405
+ [time, { "key" => "even", "message" => "message-5" }],
406
+ [time, { "key" => "zero", "message" => "message-6" }]])
407
+ end
408
+ events = d.events
409
+ expected_events = [
410
+ ["odd", time, { "key" => "odd", "message" => "message-1" }],
411
+ ["input", time, { "key" => "even", "message" => "message-2" }],
412
+ ["zero", time, { "key" => "zero", "message" => "message-3" }],
413
+ ["odd", time, { "key" => "odd", "message" => "message-4" }],
414
+ ["input", time, { "key" => "even", "message" => "message-5" }],
415
+ ["zero", time, { "key" => "zero", "message" => "message-6" }],
416
+ ]
417
+ assert_equal(events, expected_events)
418
+ end
419
+
349
420
  sub_test_case "emit_mode" do
350
421
  test "record" do
351
422
  conf = %[
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-rewrite-tag-filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kentaro Yoshida
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-05 00:00:00.000000000 Z
11
+ date: 2020-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  requirements: []
127
- rubygems_version: 3.1.2
127
+ rubygems_version: 3.1.4
128
128
  signing_key:
129
129
  specification_version: 4
130
130
  summary: Fluentd Output filter plugin. It has designed to rewrite tag like mod_rewrite.