fluent-plugin-elapsed-time 0.0.2 → 0.0.3

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: e6720e8ded7541bd64fcf697c652f26dc8698d06
4
- data.tar.gz: b9fc406ba89a260a898d2f0eebbae70f0494f553
3
+ metadata.gz: d14cf6319e26776194fbb0919e67088cd7ea95b4
4
+ data.tar.gz: 3ddedf3e28e320fafcff40ceab676373afcbaa57
5
5
  SHA512:
6
- metadata.gz: 6b0eb1286b7aa683a562f9b9fb61b78176453543dc1306fe40823cde5dcea4bcdff52239059782dd5e4ad3d9a375640660a0f81254bdd842a789a565c37fddb0
7
- data.tar.gz: df7c63be74f4ea39658f73eb2cab8035ce3b26851b2dea9adf357fd0b7575d2a3a17ed3fc2bb33647af5b381bed749a19e780c14079ca2382cc8f8f9b226ed4e
6
+ metadata.gz: a2cdc21c833167dfdbcb966eb94985dc368f55887bda1b19a28711b400fdfe3a840b06bf654688f1337b8baa9f74fb8bff5c960797c7365232a5e30a3afead4d
7
+ data.tar.gz: 851810c1aa907d6be79c9f54fb7cd1b41747006553979f363659b51cbf8b17162b039e700cc0f2af574a186ec71c1a49b202a2e4f4a99772e3e409d76dcc5d3c
@@ -1,3 +1,11 @@
1
+ ## 0.0.3 (2014/01/30)
2
+
3
+ Enhancement:
4
+
5
+ * Add `aggregate` option
6
+ * Add `add_tag_prefix` and `remove_tag_prefix` options
7
+ * Add `remove_tag_slice` option
8
+
1
9
  ## 0.0.2 (2014/01/23)
2
10
 
3
11
  Changes:
data/README.md CHANGED
@@ -21,6 +21,7 @@ Following example measures the max and average time taken to process [fluent-plu
21
21
  type elapsed_time
22
22
  tag elapsed
23
23
  interval 60
24
+ each message
24
25
  <store>
25
26
  type grep
26
27
  exclude foobar
@@ -45,11 +46,15 @@ Following example measures the max and average time taken to process [fluent-plu
45
46
  </match>
46
47
  ```
47
48
 
48
- ## Option Parameters
49
+ Output will be like
49
50
 
50
- * tag
51
+ ```
52
+ elapsed: {"max":1.011,"avg":0.002","num":10}
53
+ ```
51
54
 
52
- The output tag name. Default is `elapsed`
55
+ where `max` and `avg` are the maximum and average elapsed times, and `num` is the number of messages.
56
+
57
+ ## Option Parameters
53
58
 
54
59
  * interval
55
60
 
@@ -59,6 +64,35 @@ Following example measures the max and average time taken to process [fluent-plu
59
64
 
60
65
  Measure time for each `message` or `es` (event stream). Please notice that the event stream (would be a msgpack) will be unpacked if `message` is specified, which would cause performance degradation. Default is `es`.
61
66
 
67
+ * tag
68
+
69
+ The output tag name. Default is `elapsed`
70
+
71
+ * add_tag_prefix
72
+
73
+ Add tag prefix for output message
74
+
75
+ * remove_tag_prefix
76
+
77
+ Remove tag prefix for output message
78
+
79
+ * remove_tag_slice *min..max*
80
+
81
+ Remove tag parts by slice function. FYI: This option behaves like `tag.split('.').slice(min..max)`.
82
+
83
+ For example,
84
+
85
+ remove_tag_slice 0..-2
86
+
87
+ changes an input tag `foo.bar.host1` to `foo.bar`.
88
+
89
+ * aggregate
90
+
91
+ Measure and emit outputs for each `tag` or `all`. Default is `all`.
92
+
93
+ `all` measures `max` and `avg` for all input messages.
94
+ `tag` measures `max` and `avg` for each tag *modified* by `add_tag_prefix`, `remove_tag_prefix`, or `remove_tag_slice`.
95
+
62
96
  ## ChangeLog
63
97
 
64
98
  See [CHANGELOG.md](CHANGELOG.md) for details.
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = "fluent-plugin-elapsed-time"
6
- gem.version = "0.0.2"
6
+ gem.version = "0.0.3"
7
7
  gem.authors = ["Naotoshi Seo"]
8
8
  gem.email = "sonots@gmail.com"
9
9
  gem.homepage = "https://github.com/sonots/fluent-plugin-elapsed-time"
@@ -3,6 +3,10 @@ module Fluent
3
3
  Plugin.register_output('elapsed_time', self)
4
4
 
5
5
  config_param :tag, :string, :default => 'elapsed'
6
+ config_param :add_tag_prefix, :string, :default => nil
7
+ config_param :remove_tag_prefix, :string, :default => nil
8
+ config_param :remove_tag_slice, :string, :default => nil
9
+ config_param :aggregate, :string, :default => 'all'
6
10
  config_param :interval, :time, :default => 60
7
11
  config_param :each, :default => :es do |val|
8
12
  case val.downcase
@@ -18,10 +22,15 @@ module Fluent
18
22
  def initialize
19
23
  super
20
24
  @outputs = []
21
- @elapsed = []
25
+ @elapsed = {}
22
26
  end
23
27
 
24
- attr_reader :outputs, :elapsed
28
+ # for test
29
+ attr_reader :outputs
30
+
31
+ def elapsed(tag = :all)
32
+ @elapsed[tag] ||= []
33
+ end
25
34
 
26
35
  def configure(conf)
27
36
  super
@@ -39,6 +48,50 @@ module Fluent
39
48
  @outputs << output
40
49
  }
41
50
 
51
+ case @aggregate
52
+ when 'all'
53
+ raise ConfigError, "out_elapsed_time: `tag` must be specified with aggregate all" if @tag.nil?
54
+ when 'tag'
55
+ raise ConfigError, "out_elapsed_time: `add_tag_prefix` or `remove_tag_prefix` must be specified with aggregate tag" if @add_tag_prefix.nil? and @remove_tag_prefix.nil?
56
+ else
57
+ raise ConfigError, "out_elapsed_time: aggregate allows `tag` or `all`"
58
+ end
59
+
60
+ @tag_slice_proc =
61
+ if @remove_tag_slice
62
+ lindex, rindex = @remove_tag_slice.split('..', 2)
63
+ if lindex.nil? or rindex.nil? or lindex !~ /^-?\d+$/ or rindex !~ /^-?\d+$/
64
+ raise Fluent::ConfigError, "out_elapsed_time: remove_tag_slice must be formatted like [num]..[num]"
65
+ end
66
+ l, r = lindex.to_i, rindex.to_i
67
+ Proc.new {|tag| (tags = tag.split('.')[l..r]).nil? ? "" : tags.join('.') }
68
+ else
69
+ Proc.new {|tag| tag }
70
+ end
71
+
72
+ @tag_prefix = "#{@add_tag_prefix}." if @add_tag_prefix
73
+ @tag_prefix_match = "#{@remove_tag_prefix}." if @remove_tag_prefix
74
+ @tag_proc =
75
+ if @tag_prefix and @tag_prefix_match
76
+ Proc.new {|tag| "#{@tag_prefix}#{lstrip(@tag_slice_proc.call(tag), @tag_prefix_match)}" }
77
+ elsif @tag_prefix_match
78
+ Proc.new {|tag| lstrip(@tag_slice_proc.call(tag), @tag_prefix_match) }
79
+ elsif @tag_prefix
80
+ Proc.new {|tag| "#{@tag_prefix}#{@tag_slice_proc.call(tag)}" }
81
+ elsif @tag
82
+ Proc.new {|tag| @tag }
83
+ else
84
+ Proc.new {|tag| @tag_slice_proc.call(tag) }
85
+ end
86
+
87
+ @push_elapsed_proc =
88
+ case @aggregate
89
+ when 'all'
90
+ Proc.new {|tag, elapsed_time| elapsed(:all) << elapsed_time }
91
+ when 'tag'
92
+ Proc.new {|tag, elapsed_time| elapsed(tag) << elapsed_time }
93
+ end
94
+
42
95
  @emit_proc =
43
96
  if @each == :message
44
97
  chain = NullOutputChain.instance
@@ -47,7 +100,8 @@ module Fluent
47
100
  es.each do |time, record|
48
101
  @outputs.each {|output| output.emit(tag, OneEventStream.new(time, record), chain) }
49
102
  finish = Time.now
50
- @elapsed << (finish - start).to_f
103
+ elapsed = (finish - start).to_f
104
+ @push_elapsed_proc.call(@tag_proc.call(tag), elapsed)
51
105
  start = finish
52
106
  end
53
107
  }
@@ -56,7 +110,8 @@ module Fluent
56
110
  Proc.new {|tag, es|
57
111
  t = Time.now
58
112
  @outputs.each {|output| output.emit(tag, es, chain) }
59
- @elapsed << (Time.now - t).to_f
113
+ elapsed = (Time.now - t).to_f
114
+ @push_elapsed_proc.call(@tag_proc.call(tag), elapsed)
60
115
  }
61
116
  end
62
117
  end
@@ -88,12 +143,14 @@ module Fluent
88
143
  end
89
144
 
90
145
  def flush_emit
91
- elapsed, @elapsed = @elapsed, []
92
- unless elapsed.empty?
93
- max = elapsed.max
94
- num = elapsed.size
95
- avg = elapsed.map(&:to_f).inject(:+) / num.to_f
96
- Engine.emit(@tag, Engine.now, {"max" => max, "avg" => avg, "num" => num})
146
+ elapseds, @elapsed = @elapsed, {}
147
+ elapseds.each do |tag, elapsed|
148
+ unless elapsed.empty?
149
+ max = elapsed.max
150
+ num = elapsed.size
151
+ avg = elapsed.map(&:to_f).inject(:+) / num.to_f
152
+ Engine.emit(tag, Engine.now, {"max" => max, "avg" => avg, "num" => num})
153
+ end
97
154
  end
98
155
  end
99
156
 
@@ -101,5 +158,9 @@ module Fluent
101
158
  @emit_proc.call(tag, es)
102
159
  chain.next
103
160
  end
161
+
162
+ def lstrip(string, substring)
163
+ string.index(substring) == 0 ? string[substring.size..-1] : string
164
+ end
104
165
  end
105
166
  end
@@ -86,5 +86,40 @@ describe Fluent::ElapsedTimeOutput do
86
86
  driver.instance.elapsed.size.should == 4
87
87
  }
88
88
  end
89
+
90
+ context 'each message with aggregate tag' do
91
+ let(:config) { CONFIG + %[each message\naggregate tag\nadd_tag_prefix elapsed]}
92
+ before do
93
+ Fluent::Engine.stub(:now).and_return(time)
94
+ end
95
+ it {
96
+ driver.run { messages.each {|message| driver.emit({'message' => message}, time) } }
97
+ driver.instance.elapsed("elapsed.#{tag}").size.should == 4
98
+ }
99
+ end
100
+
101
+ context 'each es with aggregate tag' do
102
+ let(:config) { CONFIG + %[each es\naggregate tag\nadd_tag_prefix elapsed]}
103
+ before do
104
+ Fluent::Engine.stub(:now).and_return(time)
105
+ end
106
+ it {
107
+ driver.run { messages.each {|message| driver.emit({'message' => message}, time) } }
108
+ driver.instance.elapsed("elapsed.#{tag}").size.should == 4
109
+ driver.instance.flush_emit
110
+ }
111
+ end
112
+
113
+ context 'remove_tag_slice' do
114
+ let(:config) { CONFIG + %[remove_tag_slice 0..-2\naggregate tag\nadd_tag_prefix elapsed]}
115
+ before do
116
+ Fluent::Engine.stub(:now).and_return(time)
117
+ end
118
+ let(:expected_tag) { tag.split('.')[0..-2].join('.') }
119
+ it {
120
+ driver.run { messages.each {|message| driver.emit({'message' => message}, time) } }
121
+ driver.instance.elapsed("elapsed.#{expected_tag}").size.should == 4
122
+ }
123
+ end
89
124
  end
90
125
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-elapsed-time
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi Seo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-23 00:00:00.000000000 Z
11
+ date: 2014-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd