fluent-plugin-norikra 0.0.3 → 0.0.4

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: 438de874a5cf49d1dfeb86c755b5bb7d69ab9715
4
- data.tar.gz: 9aff77e6751e8e4757954ce2ae262f263abc136d
3
+ metadata.gz: e15eebb32dfadbfe46e9c5d52c7c3eae438cb772
4
+ data.tar.gz: 25e60695315a63fd5e3e774a63e03500bb4b5bef
5
5
  SHA512:
6
- metadata.gz: 1b19b1cd4f3e2a1b49ff8e6723e5aea17b7e3cd64bd3e96225d0ad55c935cfd34870ff0ca6f7df646ac87fb982dccacd19beb2eea38f823da4cb1a280dfb2dd6
7
- data.tar.gz: 9774924e5b9aa84e692776ec249e3cac2363a8a21b5541b1cb9cdd88d7994a0a4e9987a1d1920618f796942ac5139bb4b507286c9c75e8421afc7fbdd6d69f46
6
+ metadata.gz: ab124b24f446d522b688ace53ea7f1a65ffc095c82e2fef64f44cf78327214908ed9e9fc4e0deecee30aade019973f2482be83bae33eba7b356c6741bb076dff
7
+ data.tar.gz: f03549e79600346c01af7806274c7d004bbcd374fdfeea589b0f955f2da1efccc6e348c46b0169aa1997291708a23bc000e4c538d6c3a75c314e6d62cb93f603
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "fluent-plugin-norikra"
5
- spec.version = "0.0.3"
5
+ spec.version = "0.0.4"
6
6
  spec.authors = ["TAGOMORI Satoshi"]
7
7
  spec.email = ["tagomoris@gmail.com"]
8
8
  spec.description = %q{process events on fluentd with SQL like query, with built-in Norikra server if needed.}
@@ -31,17 +31,17 @@ class Fluent::NorikraOutput
31
31
  end
32
32
  end
33
33
 
34
- def generate(target)
34
+ def generate(name, escaped)
35
35
  Fluent::NorikraOutput::Query.new(
36
- self.class.replace_target(target, @name_template),
37
- self.class.replace_target(target, @expression_template),
38
- self.class.replace_target(target, @tag_template),
36
+ self.class.replace_target(name, @name_template),
37
+ self.class.replace_target(escaped, @expression_template),
38
+ self.class.replace_target(name, @tag_template),
39
39
  @fetch_interval
40
40
  )
41
41
  end
42
42
 
43
- def self.replace_target(target, str)
44
- str.gsub('${target}', target)
43
+ def self.replace_target(t, str)
44
+ str.gsub('${target}', t)
45
45
  end
46
46
 
47
47
  def self.parse_time_period(string)
@@ -192,12 +192,32 @@ class Fluent::NorikraOutput
192
192
 
193
193
  class Target
194
194
  attr_accessor :name, :fields, :queries
195
+ attr_reader :escaped_name
196
+
197
+ def self.escape(src)
198
+ if src.nil? || src.empty?
199
+ return 'FluentdGenerated'
200
+ end
201
+
202
+ dst = src.gsub(/[^_a-zA-Z0-9]/, '_')
203
+ unless dst =~ /^[a-zA-Z]([_a-zA-Z0-9]*[a-zA-Z0-9])?$/
204
+ unless dst =~ /^[a-zA-Z]/
205
+ dst = 'Fluentd' + dst
206
+ end
207
+ unless dst =~ /[a-zA-Z0-9]$/
208
+ dst = dst + 'Generated'
209
+ end
210
+ end
211
+ dst
212
+ end
195
213
 
196
214
  def initialize(target, config)
197
215
  @name = target
216
+ @escaped_name = self.class.escape(@name)
217
+
198
218
  @filter = RecordFilter.new(*([:include, :include_regexp, :exclude, :exclude_regexp].map{|s| config.filter_params[s]}))
199
219
  @fields = config.field_definitions
200
- @queries = config.query_generators.map{|g| g.generate(target)}
220
+ @queries = config.query_generators.map{|g| g.generate(@name, @escaped_name)}
201
221
  end
202
222
 
203
223
  def filter(record)
@@ -157,14 +157,17 @@ module Fluent
157
157
 
158
158
  @register_thread.join
159
159
  @fetch_thread.join
160
- begin
161
- counter = 0
162
- while !Process.waitpid(@norikra_pid, Process::WNOHANG)
163
- sleep 1
164
- break if counter > 3
160
+
161
+ if @execute_server
162
+ begin
163
+ counter = 0
164
+ while !Process.waitpid(@norikra_pid, Process::WNOHANG)
165
+ sleep 1
166
+ break if counter > 3
167
+ end
168
+ rescue Errno::ECHILD
169
+ # norikra server process exited.
165
170
  end
166
- rescue Errno::ECHILD
167
- # norikra server process exited.
168
171
  end
169
172
  end
170
173
 
@@ -268,14 +271,14 @@ module Fluent
268
271
 
269
272
  event = t.filter(record)
270
273
 
271
- out << [target,event].to_msgpack
274
+ out << [t.escaped_name,event].to_msgpack
272
275
  end
273
276
 
274
277
  out
275
278
  end
276
279
 
277
280
  def prepared?(target_names)
278
- @norikra_started && target_names.reduce(true){|r,t| r && @target_map[t]}
281
+ @norikra_started && target_names.reduce(true){|r,t| r && @target_map.values.any?{|target| target.escaped_name == t}}
279
282
  end
280
283
 
281
284
  def write(chunk)
@@ -300,15 +303,15 @@ module Fluent
300
303
  # target open and reserve fields
301
304
  $log.debug "Going to prepare about target"
302
305
  begin
303
- unless client.targets.include?(target.name)
304
- $log.debug "opening target #{target.name}"
305
- client.open(target.name, target.reserve_fields)
306
- $log.debug "opening target #{target.name}, done."
306
+ unless client.targets.include?(target.escaped_name)
307
+ $log.debug "opening target #{target.escaped_name}"
308
+ client.open(target.escaped_name, target.reserve_fields)
309
+ $log.debug "opening target #{target.escaped_name}, done."
307
310
  end
308
311
 
309
312
  reserving = target.reserve_fields
310
313
  reserved = []
311
- client.fields(target.name).each do |field|
314
+ client.fields(target.escaped_name).each do |field|
312
315
  if reserving[field['name']]
313
316
  reserved.push(field['name'])
314
317
  if reserving[field['name']] != field['type']
@@ -318,10 +321,10 @@ module Fluent
318
321
  end
319
322
 
320
323
  reserving.each do |fieldname,type|
321
- client.reserve(target, fieldname, type) unless reserved.include?(fieldname)
324
+ client.reserve(target.escaped_name, fieldname, type) unless reserved.include?(fieldname)
322
325
  end
323
326
  rescue => e
324
- $log.error "failed to prepare target:#{target.name}", :norikra => "#{@host}:#{@port}", :error => e.class, :message => e.message
327
+ $log.error "failed to prepare target:#{target.escaped_name}", :norikra => "#{@host}:#{@port}", :error => e.class, :message => e.message
325
328
  return false
326
329
  end
327
330
 
@@ -0,0 +1,11 @@
1
+ require 'helper'
2
+
3
+ class NorikraOutputTest < Test::Unit::TestCase
4
+ CONF = %[
5
+ target_map_tag yes
6
+ ]
7
+
8
+ def create_driver(conf=CONFIG, tag='test')
9
+ Fluent::Test::OutputTestDriver.new(Fluent::NorikraOutput, tag).configure(conf)
10
+ end
11
+ end
@@ -36,7 +36,7 @@ class QueryGeneratorTest < Test::Unit::TestCase
36
36
 
37
37
  def test_generate
38
38
  g = @this.new('query_${target}', 'SELECT * FROM ${target}.win:time_batch( 10 min ) WHERE x=1', 'tag.${target}')
39
- q = g.generate('test')
39
+ q = g.generate('test', 'test')
40
40
  assert_equal 'query_test', q.name
41
41
  assert_equal 'SELECT * FROM test.win:time_batch( 10 min ) WHERE x=1', q.expression
42
42
  assert_equal 'tag.test', q.tag
data/test/test_target.rb CHANGED
@@ -6,42 +6,54 @@ class TargetTest < Test::Unit::TestCase
6
6
  @this = Fluent::NorikraOutput::Target
7
7
  end
8
8
 
9
- def test_instanciate
10
- q1 = Fluent::Config::Element.new('query', nil, {
11
- 'name' => 'q1_${target}',
12
- 'expression' => 'SELECT * FROM ${target}.win:time_batch(10 min) WHERE q1',
13
- 'tag' => 'q1.${target}'
14
- }, [])
15
- q2 = Fluent::Config::Element.new('query', nil, {
16
- 'name' => 'q2_${target}',
17
- 'expression' => 'SELECT * FROM ${target}.win:time_batch(50 min) WHERE q2.length() > 0',
18
- 'tag' => 'q2.${target}'
19
- }, [])
20
- c1 = Fluent::Config::Element.new('default', nil, {
21
- 'include' => '*',
22
- 'exclude' => 'flag',
23
- 'exclude_regexp' => 'f_.*',
24
- 'field_string' => 's1,s2,s3',
25
- 'field_boolean' => 'bool1,bool2',
26
- 'field_int' => 'i1,i2,i3,i4',
27
- 'field_long' => 'num1,num2',
28
- 'field_float' => 'f1,f2',
29
- 'field_double' => 'd'
30
- }, [q1,q2])
31
- s1 = Fluent::NorikraOutput::ConfigSection.new(c1)
9
+ def test_target_name_escape
10
+ assert_equal 'target1', @this.escape('target1')
11
+ assert_equal 'target1_subtarget1', @this.escape('target1.subtarget1')
12
+ assert_equal 'test_tag_foo', @this.escape('test.tag.foo')
13
+
14
+ assert_equal 'FluentdGenerated', @this.escape('')
15
+ assert_equal 'Fluentd_Generated', @this.escape(':')
16
+ assert_equal 'a', @this.escape('a')
17
+ assert_equal 'Fluentd_a', @this.escape('_a')
18
+ assert_equal 'a_Generated', @this.escape('a_')
19
+ end
32
20
 
33
- q3 = Fluent::Config::Element.new('query', nil, {
34
- 'name' => 'q3_test',
35
- 'expression' => 'SELECT * FROM ${target}.win:time_batch(30 min) WHERE q3="/"',
36
- 'tag' => 'q3.test'
37
- }, [])
38
- c2 = Fluent::Config::Element.new('target', 'test', {
39
- 'exclude_regexp' => '(f|g)_.*',
40
- 'field_double' => 'd1,d2,d3,d4'
41
- }, [q3])
42
- s2 = Fluent::NorikraOutput::ConfigSection.new(c2)
21
+ Q1 = Fluent::Config::Element.new('query', nil, {
22
+ 'name' => 'q1_${target}',
23
+ 'expression' => 'SELECT * FROM ${target}.win:time_batch(10 min) WHERE q1',
24
+ 'tag' => 'q1.${target}'
25
+ }, [])
26
+ Q2 = Fluent::Config::Element.new('query', nil, {
27
+ 'name' => 'q2_${target}',
28
+ 'expression' => 'SELECT * FROM ${target}.win:time_batch(50 min) WHERE q2.length() > 0',
29
+ 'tag' => 'q2.${target}'
30
+ }, [])
31
+ C1 = Fluent::Config::Element.new('default', nil, {
32
+ 'include' => '*',
33
+ 'exclude' => 'flag',
34
+ 'exclude_regexp' => 'f_.*',
35
+ 'field_string' => 's1,s2,s3',
36
+ 'field_boolean' => 'bool1,bool2',
37
+ 'field_int' => 'i1,i2,i3,i4',
38
+ 'field_long' => 'num1,num2',
39
+ 'field_float' => 'f1,f2',
40
+ 'field_double' => 'd'
41
+ }, [Q1,Q2])
42
+ S1 = Fluent::NorikraOutput::ConfigSection.new(C1)
43
43
 
44
- t = @this.new('test', s1 + s2)
44
+ Q3 = Fluent::Config::Element.new('query', nil, {
45
+ 'name' => 'q3_test',
46
+ 'expression' => 'SELECT * FROM ${target}.win:time_batch(30 min) WHERE q3="/"',
47
+ 'tag' => 'q3.test'
48
+ }, [])
49
+ C2 = Fluent::Config::Element.new('target', 'test', {
50
+ 'exclude_regexp' => '(f|g)_.*',
51
+ 'field_double' => 'd1,d2,d3,d4'
52
+ }, [Q3])
53
+ S2 = Fluent::NorikraOutput::ConfigSection.new(C2)
54
+
55
+ def test_instanciate
56
+ t = @this.new('test', S1 + S2)
45
57
 
46
58
  assert_equal 'test', t.name
47
59
  assert_equal({
@@ -63,4 +75,22 @@ class TargetTest < Test::Unit::TestCase
63
75
  'd' => 'double', 'd1' => 'double', 'd2' => 'double', 'd3' => 'double', 'd4' => 'double'
64
76
  }, t.reserve_fields)
65
77
  end
78
+
79
+ def test_queries
80
+ t = @this.new('test.service', S1 + S2)
81
+
82
+ assert_equal 3, t.queries.size
83
+
84
+ assert_equal 'q1_test.service', t.queries[0].name
85
+ assert_equal 'SELECT * FROM test_service.win:time_batch(10 min) WHERE q1', t.queries[0].expression
86
+ assert_equal 'q1.test.service', t.queries[0].tag
87
+
88
+ assert_equal 'q2_test.service', t.queries[1].name
89
+ assert_equal 'SELECT * FROM test_service.win:time_batch(50 min) WHERE q2.length() > 0', t.queries[1].expression
90
+ assert_equal 'q2.test.service', t.queries[1].tag
91
+
92
+ assert_equal 'q3_test', t.queries[2].name
93
+ assert_equal 'SELECT * FROM test_service.win:time_batch(30 min) WHERE q3="/"', t.queries[2].expression
94
+ assert_equal 'q3.test', t.queries[2].tag
95
+ end
66
96
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-norikra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-01 00:00:00.000000000 Z
11
+ date: 2013-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: norikra-client
@@ -86,6 +86,7 @@ files:
86
86
  - lib/fluent/plugin/norikra_target.rb
87
87
  - lib/fluent/plugin/out_norikra.rb
88
88
  - test/helper.rb
89
+ - test/plugin/test_out_norikra.rb
89
90
  - test/test_config_section.rb
90
91
  - test/test_query.rb
91
92
  - test/test_query_generator.rb
@@ -111,14 +112,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
112
  version: '0'
112
113
  requirements: []
113
114
  rubyforge_project:
114
- rubygems_version: 2.0.2
115
+ rubygems_version: 2.0.3
115
116
  signing_key:
116
117
  specification_version: 4
117
118
  summary: Fluentd plugin to do CEP with norikra
118
119
  test_files:
119
120
  - test/helper.rb
121
+ - test/plugin/test_out_norikra.rb
120
122
  - test/test_config_section.rb
121
123
  - test/test_query.rb
122
124
  - test/test_query_generator.rb
123
125
  - test/test_record_filter.rb
124
126
  - test/test_target.rb
127
+ has_rdoc: