fluent-plugin-combiner 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +28 -3
- data/bench/README.md +30 -0
- data/bench/genload.rb +152 -0
- data/fluent-plugin-combiner.gemspec +1 -1
- data/lib/fluent/plugin/out_combiner.rb +13 -5
- data/test/plugin/test_out_combiner.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTQ1YTU4ODMzYTk2ZjQ4OTAyMjFhNWU4NTIwY2U2YmU2ODI5YzM0ZA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDc1M2M4ZDQ1M2M1M2I3OTZjMzBlMTg4MmIxY2ZiZjY2YzM5ODEyNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTVmYzZhMTkwZjgyZDYwYTliOGQwOGVjZTAwZjhkOGUyMGQ3YTU2MWMzMWU4
|
10
|
+
N2YwMDliYzhmNGU3NjZkMTc4NGUwODMyNjFhYmNkMzcxMDY2ZmExMDIzZTUy
|
11
|
+
NzVlNzA5ODllYjM5NzliNDkyYzQ0NjQyODcxYzM2OWQ2YWM5Nzg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZGYxYWNjOTE5N2U3ZWU1MjY0M2QwYmYyZTk0NjVmNWQwNDJmZTZmNmQ0MDg4
|
14
|
+
MTI0NzNlNzA1MTA0MmY5NDI1OTIwY2JlNGUzMTE4NGRhODBkODMyNTNiODI2
|
15
|
+
ZjhlMDIwMDI5NTdiOWI0NmFhMTAzMDYwYTI0MGRjNjQ4OTk3Mjk=
|
data/README.md
CHANGED
@@ -1,5 +1,33 @@
|
|
1
1
|
# fluent-plugin-combiner
|
2
2
|
|
3
|
+
Fluentd plugin to count message keys, and make histogram.
|
4
|
+
|
5
|
+
```
|
6
|
+
$ echo '{"keys":["A", "B", "C", "A"]}' | fluent-cat test.combine.input
|
7
|
+
$ echo '{"keys":["A", "B", "D"]}' | fluent-cat test.combine.input
|
8
|
+
```
|
9
|
+
|
10
|
+
output is
|
11
|
+
|
12
|
+
```
|
13
|
+
2013-12-17 01:06:46 +0900 combined.input: {"hist":{"A":3, "B":2, "C":1, "D":1}, "sum":7, "len":4}
|
14
|
+
```
|
15
|
+
|
16
|
+
## Configuration
|
17
|
+
|
18
|
+
```
|
19
|
+
<match test.combine.**>
|
20
|
+
type combiner
|
21
|
+
count_key keys # input message tag to count
|
22
|
+
count_interval 5 # count interval(second)
|
23
|
+
tag_prefix combined
|
24
|
+
input_tag_remove_prefix test.combine
|
25
|
+
</match>
|
26
|
+
```
|
27
|
+
|
28
|
+
!!`tag` parameter overwrite `tag_prefix` and `input_tag_remove_prefix`
|
29
|
+
|
30
|
+
|
3
31
|
## Installation
|
4
32
|
|
5
33
|
Add this line to your application's Gemfile:
|
@@ -14,9 +42,6 @@ Or install it yourself as:
|
|
14
42
|
|
15
43
|
$ gem install fluent-plugin-combiner
|
16
44
|
|
17
|
-
## Usage
|
18
|
-
|
19
|
-
TODO: Write usage instructions here
|
20
45
|
|
21
46
|
## Contributing
|
22
47
|
|
data/bench/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
Benchmark tool for Fluent event collector
|
2
|
+
=========================================
|
3
|
+
|
4
|
+
## Install
|
5
|
+
|
6
|
+
# genload.rb depends on fluent gem
|
7
|
+
$ gem install fluent
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
Usage: genload [options] <tag> <num>
|
12
|
+
-p, --port PORT fluent tcp port (default: 24224)
|
13
|
+
-h, --host HOST fluent host (default: 127.0.0.1)
|
14
|
+
-u, --unix use unix socket instead of tcp
|
15
|
+
-P, --path PATH unix socket path (default: /var/run/fluent/fluent.sock)
|
16
|
+
-r, --repeat NUM repeat number (default: 1)
|
17
|
+
-m, --multi NUM send multiple records at once (default: 1)
|
18
|
+
-c, --concurrent NUM number of threads (default: 1)
|
19
|
+
-s, --size SIZE size of a record (default: 100)
|
20
|
+
-G, --no-packed don't use lazy deserialization optimize
|
21
|
+
|
22
|
+
|
23
|
+
## Examples
|
24
|
+
|
25
|
+
# uses "benchmark.buffered" tag and sends 50,000 records
|
26
|
+
# -c: uses 10 threads/connections;
|
27
|
+
# -m: one message includes 20 record
|
28
|
+
# -r: repeats 100 times
|
29
|
+
ruby genload.rb benchamrk.buffered 50000 -c 10 -m 20 -r 100
|
30
|
+
|
data/bench/genload.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'fluent/env'
|
3
|
+
|
4
|
+
op = OptionParser.new
|
5
|
+
|
6
|
+
op.banner += " <tag> <num>"
|
7
|
+
|
8
|
+
port = Fluent::DEFAULT_LISTEN_PORT
|
9
|
+
host = '127.0.0.1'
|
10
|
+
unix = false
|
11
|
+
socket_path = Fluent::DEFAULT_SOCKET_PATH
|
12
|
+
send_timeout = 20.0
|
13
|
+
repeat = 1
|
14
|
+
para = 1
|
15
|
+
multi = 1
|
16
|
+
record_len = 5
|
17
|
+
packed = true
|
18
|
+
|
19
|
+
config_path = Fluent::DEFAULT_CONFIG_PATH
|
20
|
+
|
21
|
+
op.on('-p', '--port PORT', "fluent tcp port (default: #{port})", Integer) {|i|
|
22
|
+
port = s
|
23
|
+
}
|
24
|
+
|
25
|
+
op.on('-h', '--host HOST', "fluent host (default: #{host})") {|s|
|
26
|
+
host = s
|
27
|
+
}
|
28
|
+
|
29
|
+
op.on('-u', '--unix', "use unix socket instead of tcp", TrueClass) {|b|
|
30
|
+
unix = b
|
31
|
+
}
|
32
|
+
|
33
|
+
op.on('-P', '--path PATH', "unix socket path (default: #{socket_path})") {|s|
|
34
|
+
socket_path = s
|
35
|
+
}
|
36
|
+
|
37
|
+
op.on('-r', '--repeat NUM', "repeat number (default: 1)", Integer) {|i|
|
38
|
+
repeat = i
|
39
|
+
}
|
40
|
+
|
41
|
+
op.on('-m', '--multi NUM', "send multiple records at once (default: 1)", Integer) {|i|
|
42
|
+
multi = i
|
43
|
+
}
|
44
|
+
|
45
|
+
op.on('-l', '--record_len NUM', "a record to be send have NUM keys (default: 5)", Integer) {|i|
|
46
|
+
record_len = i
|
47
|
+
}
|
48
|
+
|
49
|
+
op.on('-c', '--concurrent NUM', "number of threads (default: 1)", Integer) {|i|
|
50
|
+
para = i
|
51
|
+
}
|
52
|
+
|
53
|
+
op.on('-G', '--no-packed', "don't use lazy deserialization optimize") {|i|
|
54
|
+
packed = false
|
55
|
+
}
|
56
|
+
|
57
|
+
(class<<self;self;end).module_eval do
|
58
|
+
define_method(:usage) do |msg|
|
59
|
+
puts op.to_s
|
60
|
+
puts "error: #{msg}" if msg
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
op.parse!(ARGV)
|
67
|
+
|
68
|
+
if ARGV.length != 2
|
69
|
+
usage nil
|
70
|
+
end
|
71
|
+
|
72
|
+
tag = ARGV.shift
|
73
|
+
num = ARGV.shift.to_i
|
74
|
+
|
75
|
+
rescue
|
76
|
+
usage $!.to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
require 'socket'
|
80
|
+
require 'msgpack'
|
81
|
+
require 'benchmark'
|
82
|
+
|
83
|
+
def gen_word(len=nil)
|
84
|
+
len = rand(5) + 1 unless len
|
85
|
+
rand(36**len).to_s(36)
|
86
|
+
end
|
87
|
+
|
88
|
+
def gen_record(num=5, w_len=nil)
|
89
|
+
(1..num).reduce([]) {|ret| ret << gen_word(w_len)}
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
connector = Proc.new {
|
94
|
+
if unix
|
95
|
+
sock = UNIXSocket.open(socket_path)
|
96
|
+
else
|
97
|
+
sock = TCPSocket.new(host, port)
|
98
|
+
end
|
99
|
+
|
100
|
+
opt = [1, send_timeout.to_i].pack('I!I!') # { int l_onoff; int l_linger; }
|
101
|
+
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, opt)
|
102
|
+
|
103
|
+
opt = [send_timeout.to_i, 0].pack('L!L!') # struct timeval
|
104
|
+
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, opt)
|
105
|
+
|
106
|
+
sock
|
107
|
+
}
|
108
|
+
|
109
|
+
def gen_data(tag, multi=1, r_len=5)
|
110
|
+
time = Time.now.to_i
|
111
|
+
data = ''
|
112
|
+
multi.times do
|
113
|
+
record = {"keys"=>gen_record(r_len)}
|
114
|
+
[time, record].to_msgpack(data)
|
115
|
+
end
|
116
|
+
data = [tag, data].to_msgpack
|
117
|
+
end
|
118
|
+
|
119
|
+
size = 0 # sum of data.bytesize
|
120
|
+
repeat.times do
|
121
|
+
puts "--- #{Time.now}"
|
122
|
+
Benchmark.bm do |x|
|
123
|
+
start = Time.now
|
124
|
+
|
125
|
+
lo = num / para / multi
|
126
|
+
lo = 1 if lo == 0
|
127
|
+
|
128
|
+
x.report do
|
129
|
+
(1..para).map {
|
130
|
+
Thread.new do
|
131
|
+
sock = connector.call
|
132
|
+
lo.times do
|
133
|
+
data = gen_data(tag, multi, record_len)
|
134
|
+
size += data.bytesize
|
135
|
+
sock.write data
|
136
|
+
end
|
137
|
+
sock.close
|
138
|
+
end
|
139
|
+
}.each {|t|
|
140
|
+
t.join
|
141
|
+
}
|
142
|
+
end
|
143
|
+
|
144
|
+
finish = Time.now
|
145
|
+
elapsed = finish - start
|
146
|
+
|
147
|
+
puts "% 10.3f Mbps" % [size*lo*para/elapsed/1000/1000]
|
148
|
+
puts "% 10.3f records/sec" % [lo*para*multi/elapsed]
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "fluent-plugin-combiner"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.2"
|
8
8
|
spec.authors = ["karahiyo"]
|
9
9
|
spec.email = ["a.ryuklnm@gmail.com"]
|
10
10
|
spec.summary = "Combine buffer output data to cut-down net-i/o load"
|
@@ -3,8 +3,8 @@ module Fluent
|
|
3
3
|
Fluent::Plugin.register_output('combiner', self)
|
4
4
|
|
5
5
|
# config_param :hoge, :string, :default => 'hoge'
|
6
|
-
config_param :tag, :string, :default =>
|
7
|
-
config_param :tag_prefix, :string, :default =>
|
6
|
+
config_param :tag, :string, :default => nil
|
7
|
+
config_param :tag_prefix, :string, :default => 'combined'
|
8
8
|
config_param :input_tag_remove_prefix, :string, :default => nil
|
9
9
|
config_param :count_interval, :time, :default => 60
|
10
10
|
config_param :count_key, :string, :default => 'keys'
|
@@ -21,7 +21,8 @@ module Fluent
|
|
21
21
|
super
|
22
22
|
|
23
23
|
@tick = @count_interval.to_i if @count_interval
|
24
|
-
@
|
24
|
+
@tag_str = @tag + '.' if @tag
|
25
|
+
@tag_prefix_string = @tag_prefix + '.' if @tag_prefix
|
25
26
|
if @input_tag_remove_prefix
|
26
27
|
@remove_prefix_string = @input_tag_remove_prefix + '.'
|
27
28
|
@remove_prefix_length = @remove_prefix_string.length
|
@@ -49,13 +50,20 @@ module Fluent
|
|
49
50
|
|
50
51
|
def flush_emit
|
51
52
|
flushed = flush
|
52
|
-
Fluent::Engine.
|
53
|
+
now = Fluent::Engine.now
|
54
|
+
flushed.each do |tag, message|
|
55
|
+
Fluent::Engine.emit(tag, now, message)
|
56
|
+
end
|
53
57
|
end
|
54
58
|
|
55
59
|
def generate_output(data)
|
56
60
|
output = {}
|
57
61
|
data.each do |tag, hist|
|
58
|
-
|
62
|
+
if @tag
|
63
|
+
output[@tag] = hist
|
64
|
+
else
|
65
|
+
output[add_prefix(stripped_tag(tag))] = hist
|
66
|
+
end
|
59
67
|
end
|
60
68
|
output
|
61
69
|
end
|
@@ -19,7 +19,7 @@ class CombinerOutputTest < Test::Unit::TestCase
|
|
19
19
|
def test_configure
|
20
20
|
d = create_driver
|
21
21
|
assert_equal 5, d.instance.tick
|
22
|
-
assert_equal
|
22
|
+
assert_equal nil, d.instance.tag
|
23
23
|
assert_equal 'keys', d.instance.count_key
|
24
24
|
assert_equal 'combined', d.instance.tag_prefix
|
25
25
|
assert_equal 'test.input', d.instance.input_tag_remove_prefix
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-combiner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- karahiyo
|
@@ -64,6 +64,8 @@ files:
|
|
64
64
|
- LICENSE.txt
|
65
65
|
- README.md
|
66
66
|
- Rakefile
|
67
|
+
- bench/README.md
|
68
|
+
- bench/genload.rb
|
67
69
|
- fluent-plugin-combiner.gemspec
|
68
70
|
- lib/fluent/plugin/out_combiner.rb
|
69
71
|
- test/helper.rb
|