fluent-plugin-dedup 0.1.0 → 0.2.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
  SHA1:
3
- metadata.gz: 75f9ab2798dd39e111ecac0a0afd0c1ac964bc05
4
- data.tar.gz: aa7545d7df05055174952cf8edfcb87e3985658f
3
+ metadata.gz: 504ed27a9800ed32acf1e4c2872520394d935ee4
4
+ data.tar.gz: 3c48385579ce83f21be03e5d6052f3a1bdf59b55
5
5
  SHA512:
6
- metadata.gz: f688f6d8f185e583cf6327375b40fc4eff8ca665c5d5cfad31106fa7950240c24a57b0c4bc9836f84411cb2f5c7fd302dbbc692ca25c3a74097b1a8046afdf90
7
- data.tar.gz: 037a80be99a3156f450aada80bf75da9714ea8d19723cd46bef6207b453bf5ac9d4681a72a7a31857bc0f1847bc558254781c5c1d14b228b49cd88478e16aeba
6
+ metadata.gz: 35f86e880c21e1b40015d95c1684e2d9117e324fda2781a49fc233dd0dbed6b02894792e049226053a5cabf814a589207ef31a7353ccd5aca34d3bde4def4b9e
7
+ data.tar.gz: 95726e9ef89719c7cc382748b03842e0eee6872ea6e8693486de26f3202bd173ae35bcac879a8fcb0e89ecc2a940cbcc7df7d45284ea9850fb94a77cb18f17a5
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
  Gem::Specification.new do |spec|
3
3
  spec.name = "fluent-plugin-dedup"
4
- spec.version = "0.1.0"
4
+ spec.version = "0.2.0"
5
5
  spec.authors = ["edvakf"]
6
6
  spec.email = ["taka.atsushi@gmail.com"]
7
7
  spec.summary = %q{fluentd plugin for removing duplicate logs}
@@ -19,4 +19,5 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "test-unit", "~> 3.0"
20
20
 
21
21
  spec.add_runtime_dependency "fluentd"
22
+ spec.add_runtime_dependency "lru_redux"
22
23
  end
@@ -1,10 +1,12 @@
1
1
  require 'json'
2
+ require 'lru_redux'
2
3
 
3
4
  class Fluent::DedupOutput < Fluent::Output
4
5
  Fluent::Plugin.register_output('dedup', self)
5
6
 
6
7
  config_param :key, :string, :default => nil
7
8
  config_param :file, :string, :default => nil
9
+ config_param :cache_per_tag, :size, :default => 1
8
10
 
9
11
  # Define `log` method for v0.10.42 or earlier
10
12
  unless method_defined?(:log)
@@ -24,9 +26,7 @@ class Fluent::DedupOutput < Fluent::Output
24
26
  def start
25
27
  super
26
28
 
27
- if not @file.nil? and File.file?(@file)
28
- @states = JSON.parse(File.open(@file).read) rescue {}
29
- end
29
+ restore_states
30
30
  end
31
31
 
32
32
  def shutdown
@@ -38,7 +38,6 @@ class Fluent::DedupOutput < Fluent::Output
38
38
  def emit(tag, es, chain)
39
39
  es.each do |time, record|
40
40
  next if dup?(tag, record)
41
- update_states(tag, record)
42
41
  Fluent::Engine.emit("dedup.#{tag}", time, record)
43
42
  end
44
43
 
@@ -46,22 +45,45 @@ class Fluent::DedupOutput < Fluent::Output
46
45
  end
47
46
 
48
47
  private
48
+ def restore_states
49
+ if not @file.nil? and File.file?(@file)
50
+ dump = JSON.parse(File.open(@file).read) rescue {}
51
+ dump.each do |tag, ids|
52
+ lru = new_lru
53
+ ids.each {|id| lru[id] = true}
54
+ @states[tag] = lru
55
+ end
56
+ end
57
+ end
58
+
49
59
  def save_states
50
60
  unless @file.nil?
51
61
  File.open(@file, 'wb') do |f|
52
- f.print(@states.to_json)
62
+ dump = {}
63
+ @states.each do |tag, lru|
64
+ dump[tag] = lru.to_a.map(&:first)
65
+ end
66
+ f.print(dump.to_json)
53
67
  end
54
68
  end
55
69
  end
56
70
 
57
71
  def dup?(tag, record)
58
- unless record.include?(@key)
72
+ is_dup = false
73
+ if record.include?(@key)
74
+ @states[tag] = new_lru unless @states.include?(tag)
75
+ if @states[tag].fetch(record[@key])
76
+ is_dup = true
77
+ else
78
+ @states[tag][record[@key]] = true
79
+ end
80
+ else
59
81
  log.warn "record does not have key `#{@key}`, record: #{record.to_json}"
60
82
  end
61
- @states[tag] == record[@key]
83
+ is_dup
62
84
  end
63
85
 
64
- def update_states(tag, record)
65
- @states[tag] = record[@key]
86
+ def new_lru
87
+ LruRedux::ThreadSafeCache.new(@cache_per_tag)
66
88
  end
67
89
  end
@@ -89,4 +89,25 @@ class DedupOutputTest < Test::Unit::TestCase
89
89
  assert_equal 0, d2.emits.length
90
90
  end
91
91
  end
92
+
93
+ sub_test_case '`cache_per_tag` parameter is present' do
94
+ test "a record identical to most recent N records is suppressed" do
95
+ config = %[
96
+ key unique_id
97
+ cache_per_tag 2
98
+ ]
99
+
100
+ d = create_driver(config)
101
+ d.run do
102
+ d.emit({'unique_id' => '1'}, Time.now)
103
+ d.emit({'unique_id' => '1'}, Time.now) # dup
104
+ d.emit({'unique_id' => '2'}, Time.now)
105
+ d.emit({'unique_id' => '1'}, Time.now) # dup
106
+ end
107
+
108
+ assert_equal 2, d.emits.length
109
+ assert_equal '1', d.emits[0][2]['unique_id']
110
+ assert_equal '2', d.emits[1][2]['unique_id']
111
+ end
112
+ end
92
113
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-dedup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - edvakf
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: lru_redux
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: fluent-plugin-dedup is a fluentd plugin to suppress emission of subsequent
70
84
  logs identical to the first one.
71
85
  email: