fluent-plugin-condition-checker 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/Makefile +5 -0
- data/fluent-plugin-condition-checker.gemspec +1 -1
- data/lib/fluent/plugin/out_condition_checker.rb +88 -62
- data/pkg/fluent-plugin-condition-checker-0.1.0.gem +0 -0
- data/pkg/fluent-plugin-condition-checker-1.0.0.gem +0 -0
- data/test/plugin/test_out_condition_checker.rb +3 -1
- metadata +4 -3
- data/example/fluent.conf +0 -31
- data/example/scenario.json +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b410013cd3ab83a4d90088d6391d9fdd6534120326fa35380e58801ab5d76dc
|
4
|
+
data.tar.gz: f0f6bc64a9133418e5da83404927d9eb1ba966d4ce9a5d1750cd30939cccc3af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 736f29dc6aea324e2834c97b101b0ebd9bc239f7b80e6f82d8133bceedf69da0a31e213886e052133031f049e4bf49ede2190855e9fe278641b05ebdd0b6e772
|
7
|
+
data.tar.gz: 8e2b6542d02431f4e37fd75bd3aa524aff0c05b3f4781285d97e48244249721fe7cdc3e53a9d1974ae8f91b4365b24d9149bc4894af57d06030e1a36293c929a
|
data/.gitignore
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
.DS_Store
|
data/Makefile
ADDED
@@ -20,7 +20,7 @@ require 'pp'
|
|
20
20
|
module Fluent
|
21
21
|
module Plugin
|
22
22
|
class ConditionCheckerOutput < Fluent::Plugin::Output
|
23
|
-
Fluent::Plugin.register_output(
|
23
|
+
Fluent::Plugin.register_output('condition_checker', self)
|
24
24
|
|
25
25
|
helpers :event_emitter
|
26
26
|
PATTERN_MAX_NUM = 20
|
@@ -39,47 +39,79 @@ module Fluent
|
|
39
39
|
# it should always be true
|
40
40
|
config_param :auto_typecast, :bool, :default => true, # false for lower version compatibility
|
41
41
|
:desc => 'Automatically cast the field types.'
|
42
|
-
config_param :tag, :string, :default => 'checked_tag', :desc => "new record tag."
|
43
|
-
|
44
|
-
config_param(
|
45
|
-
"condition".to_sym,
|
46
|
-
:hash,
|
47
|
-
default: nil,
|
48
|
-
desc: 'It is Conditions.'
|
49
|
-
)
|
50
42
|
|
51
|
-
|
43
|
+
# 調整中のconfig_param
|
44
|
+
# これで、何個もconditionを設定して、そして処理を決めることができる。
|
45
|
+
config_param :tag1, :string,
|
46
|
+
:desc => 'Specify the output tag name when the condition1 is true.'
|
47
|
+
config_param :condition1, :string,
|
48
|
+
:desc => 'Specify the condition1 to evaluate'
|
49
|
+
(2..PATTERN_MAX_NUM).each do |i|
|
50
|
+
config_param ('tag' + i.to_s).to_sym, :string, default: nil,
|
51
|
+
desc: 'Specify tag'+i.to_s+' (not necessary)'
|
52
|
+
config_param ('condition' + i.to_s).to_sym, :string, default: nil, # NAME REGEXP
|
53
|
+
desc: 'Specify the condition'+i.to_s+' to evaluate (not necessary)'
|
54
|
+
end
|
55
|
+
|
56
|
+
config_param :tag_else, :string,
|
57
|
+
:desc => 'Specify the output tag name when the no conditions are true.'
|
58
|
+
|
59
|
+
|
60
|
+
BUILTIN_CONFIGURATIONS = %W(@id @type @label type output_tag remove_keys renew_record keep_keys enable_ruby renew_time_key auto_typecast tag_else record_else)
|
52
61
|
|
53
62
|
def configure(conf)
|
54
63
|
super
|
55
64
|
# ここで、BUILTIN_CONFIGURATIONS に入っていないものがあった場合はerrorをraise
|
56
65
|
conf.each_pair { |k, v|
|
66
|
+
# print k.match('^/tag/\d\d?$')
|
57
67
|
next if BUILTIN_CONFIGURATIONS.include?(k) || k.match(/^condition\d\d?$/) || k.match(/^tag\d\d?$/)
|
58
68
|
|
59
69
|
raise Fluent::ConfigError, 'out_condition_checker: some weird config is set {'+k.to_s+':'+v.to_s+'}'
|
60
70
|
}
|
61
71
|
|
62
|
-
#
|
72
|
+
#tagを読み込み
|
73
|
+
tags = []
|
74
|
+
(1..PATTERN_MAX_NUM).each do |i|
|
75
|
+
next unless conf["tag#{i}"]
|
76
|
+
tags.push(conf["tag#{i}"]) # tags[i+1] で、欲しいtagにアクセスできる
|
77
|
+
end
|
78
|
+
|
79
|
+
#conditionを読み込み
|
63
80
|
@conditions = []
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
data_record.merge!(key => convert_value(value))
|
72
|
-
end
|
73
|
-
end
|
81
|
+
(1..PATTERN_MAX_NUM).each do |i|
|
82
|
+
next unless conf["condition#{i}"]
|
83
|
+
@conditions.push(conf["condition#{i}"])
|
84
|
+
end
|
85
|
+
if tags.size != @conditions.size
|
86
|
+
raise Fluent::ConfigError, 'match the numbers of tags and conditions; number of tags: '+tags.size.to_s+', number of conditions: '+@conditions.size.to_s
|
87
|
+
end
|
74
88
|
|
75
|
-
param.each_pair do |key, value|
|
76
|
-
condition.merge!(key => convert_value(value))
|
77
|
-
end
|
78
89
|
|
79
|
-
|
80
|
-
|
90
|
+
# maps[i] で、欲しいconditionに対応するrecordにアクセスすることができる。
|
91
|
+
# FIXME: conf.elements.forEachでいい感じに回せそう
|
92
|
+
maps = []
|
93
|
+
(1..PATTERN_MAX_NUM).each do |i|
|
94
|
+
next unless conf["condition#{i}"] # 対応するcondition{i}が定義されているものだけ読み込む
|
95
|
+
conf.elements.select { |element| element.name == 'record'+i.to_s }.each { |element|
|
96
|
+
recordTmp = {}
|
97
|
+
element.each_pair { |k, v|
|
98
|
+
element.has_key?(k) # to suppress unread configuration warning
|
99
|
+
recordTmp.merge!({k => parse_value(v)})
|
100
|
+
# map_if_false[k] = parse_value(v)
|
101
|
+
}
|
102
|
+
maps[i] = recordTmp
|
103
|
+
}
|
81
104
|
end
|
82
105
|
|
106
|
+
map_else ={}
|
107
|
+
conf.elements.select { |element| element.name == 'record_else' }.each { |element|
|
108
|
+
recordTmp = {}
|
109
|
+
element.each_pair { |k, v|
|
110
|
+
element.has_key?(k) # to suppress unread configuration warning
|
111
|
+
recordTmp.merge!({k => parse_value(v)})
|
112
|
+
}
|
113
|
+
map_else = recordTmp
|
114
|
+
}
|
83
115
|
|
84
116
|
if @remove_keys
|
85
117
|
@remove_keys = @remove_keys.split(',')
|
@@ -107,6 +139,11 @@ module Fluent
|
|
107
139
|
end
|
108
140
|
|
109
141
|
|
142
|
+
@maps = @placeholder_expander.preprocess_map(maps)
|
143
|
+
@tags = @placeholder_expander.preprocess_map(tags)
|
144
|
+
@tag_else = @placeholder_expander.preprocess_map(conf['tag_else'])
|
145
|
+
@map_else = @placeholder_expander.preprocess_map(map_else)
|
146
|
+
|
110
147
|
@hostname = Socket.gethostname
|
111
148
|
end
|
112
149
|
|
@@ -129,15 +166,23 @@ module Fluent
|
|
129
166
|
})
|
130
167
|
|
131
168
|
# TODO: ここの処理よくないって evaluate
|
132
|
-
|
169
|
+
result, idx = evaluate_condition(@conditions, placeholder_values)
|
170
|
+
placeholder_values.merge!({ 'result' => result })
|
133
171
|
|
134
|
-
if
|
135
|
-
new_record = reform(
|
172
|
+
if idx
|
173
|
+
new_tag, new_record = reform(@tags[idx], @maps[idx+1], record, placeholder_values)
|
174
|
+
else
|
175
|
+
# TODO: tag_elseは使えなくするoption作る"
|
176
|
+
new_tag, new_record = reform(@tag_else, @map_else, record, placeholder_values)
|
177
|
+
# return
|
178
|
+
end
|
179
|
+
|
180
|
+
if new_tag
|
136
181
|
if @renew_time_key && new_record.has_key?(@renew_time_key)
|
137
182
|
time = new_record[@renew_time_key].to_i
|
138
183
|
end
|
139
184
|
@remove_keys.each {|k| new_record.delete(k) } if @remove_keys
|
140
|
-
router.emit(
|
185
|
+
router.emit(new_tag, time, new_record)
|
141
186
|
end
|
142
187
|
}
|
143
188
|
rescue => e
|
@@ -147,16 +192,11 @@ module Fluent
|
|
147
192
|
private
|
148
193
|
|
149
194
|
def evaluate_condition(conditions, placeholders)
|
150
|
-
matched_conditions = []
|
151
|
-
aditional_data = {}
|
152
195
|
conditions.each_with_index{ |condition, idx|
|
153
|
-
result = expand_placeholders(condition
|
154
|
-
if result
|
155
|
-
matched_conditions.push(condition["condition"])
|
156
|
-
aditional_data.merge!(condition["data"])
|
157
|
-
end
|
196
|
+
result = expand_placeholders(condition, placeholders)
|
197
|
+
if result then return [result, idx] end
|
158
198
|
}
|
159
|
-
|
199
|
+
[@map_else, nil]
|
160
200
|
end
|
161
201
|
|
162
202
|
def parse_value(value_str)
|
@@ -170,24 +210,23 @@ module Fluent
|
|
170
210
|
value_str # emit as string
|
171
211
|
end
|
172
212
|
|
173
|
-
def reform(
|
213
|
+
def reform(tag, map, record, placeholder_values)
|
214
|
+
placeholders = @placeholder_expander.prepare_placeholders(placeholder_values)
|
215
|
+
new_tag = expand_placeholders(tag, placeholders)
|
174
216
|
new_record = @renew_record ? {} : record.dup
|
175
|
-
new_record.merge!(create_record(aditional_data, placeholder_values))
|
176
217
|
@keep_keys.each {|k| new_record[k] = record[k]} if @keep_keys and @renew_record
|
177
|
-
|
218
|
+
new_record.merge!(create_record(map, placeholders)) unless map.nil?
|
219
|
+
[new_tag, new_record]
|
178
220
|
end
|
179
221
|
|
180
222
|
def create_record(map, placeholders)
|
181
223
|
new_record = {}
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
new_record.merge!({ k => convert_num(value) })
|
188
|
-
end
|
224
|
+
|
225
|
+
map.each_pair do |k, v|
|
226
|
+
new_key = @placeholder_expander.expand(k, placeholders, true)
|
227
|
+
|
228
|
+
new_record.merge!({ new_key => convert_num(@placeholder_expander.expand(v, placeholders, true)) })
|
189
229
|
end
|
190
|
-
pp new_record
|
191
230
|
|
192
231
|
new_record
|
193
232
|
end
|
@@ -207,19 +246,6 @@ module Fluent
|
|
207
246
|
end
|
208
247
|
end
|
209
248
|
|
210
|
-
def convert_value(value)
|
211
|
-
# Booleanがチェック
|
212
|
-
return true if value == 'true'
|
213
|
-
|
214
|
-
return false if value == 'false'
|
215
|
-
|
216
|
-
# 数値データなら数値で返す
|
217
|
-
return value.to_i if value.to_i.to_s == value.to_s
|
218
|
-
return value.to_f if value.to_f.to_s == value.to_s
|
219
|
-
|
220
|
-
value
|
221
|
-
end
|
222
|
-
|
223
249
|
def expand_placeholders(value, placeholders)
|
224
250
|
if value.is_a?(String)
|
225
251
|
new_value = @placeholder_expander.expand(value, placeholders)
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-condition-checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wally
|
@@ -84,12 +84,13 @@ files:
|
|
84
84
|
- Gemfile
|
85
85
|
- Gemfile.lock
|
86
86
|
- LICENSE
|
87
|
+
- Makefile
|
87
88
|
- README.md
|
88
89
|
- Rakefile
|
89
|
-
- example/fluent.conf
|
90
|
-
- example/scenario.json
|
91
90
|
- fluent-plugin-condition-checker.gemspec
|
92
91
|
- lib/fluent/plugin/out_condition_checker.rb
|
92
|
+
- pkg/fluent-plugin-condition-checker-0.1.0.gem
|
93
|
+
- pkg/fluent-plugin-condition-checker-1.0.0.gem
|
93
94
|
- test/helper.rb
|
94
95
|
- test/plugin/test_out_condition_checker.rb
|
95
96
|
homepage: https://github.com/NumaoLab/condition-checker-plugin
|
data/example/fluent.conf
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
<source>
|
2
|
-
@type forward
|
3
|
-
port 24224
|
4
|
-
</source>
|
5
|
-
|
6
|
-
<match **>
|
7
|
-
@type copy
|
8
|
-
<store>
|
9
|
-
@type stdout
|
10
|
-
</store>
|
11
|
-
<store>
|
12
|
-
@type condition-checker
|
13
|
-
tag "speak_condition"
|
14
|
-
<condition>
|
15
|
-
rule record["action"] == "speak"
|
16
|
-
condition "speak_action"
|
17
|
-
<data>
|
18
|
-
word record["word"] + "こんにちは"
|
19
|
-
aditiona_data 1
|
20
|
-
</data>
|
21
|
-
</condition>
|
22
|
-
<condition>
|
23
|
-
rule record["action"] == "alert"
|
24
|
-
condition "alert_action"
|
25
|
-
<data>
|
26
|
-
word record["word"] + "はじめまして"
|
27
|
-
</data>
|
28
|
-
</condition>
|
29
|
-
</store>
|
30
|
-
</match>
|
31
|
-
|
data/example/scenario.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"label":"greeting","priority":2,"limit":30,"action":"greet"}
|