fluent-plugin-filter-kv-parser 0.0.1 → 0.0.6
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 +4 -4
- data/README.md +5 -0
- data/fluent-plugin-filter-kv-parser.gemspec +1 -1
- data/lib/fluent/plugin/filter_key_value_parser.rb +46 -8
- data/test/test_filter_key_value_parser.rb +129 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8932148ec7a3bfaa0a6241823bda594b85d5a91b24dca0156fb2e7497e4f5eef
|
4
|
+
data.tar.gz: 810626b5c05a84a382719b9bb40393ee3f901b7d3d9b8366114e1b8633e08621
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89089861029085470ada61bb7d34bee99d33c46b3d089b56fc840c4f2881a479fab0a31a0f6ea663171d1c3bb5e7eface8cd5e92cd0c57b4769179e55c6ba610
|
7
|
+
data.tar.gz: 8bba97ee414b53f06222af5f6f8bad5ef89e4e2538896a8f9e0a3b5c239ef594f796a7da033843cac4e62f1207eb38591a42827147757c6adfc38f9fdb8cf3b4
|
data/README.md
CHANGED
@@ -20,9 +20,14 @@ gem install fluent-plugin-filter-kv-parser
|
|
20
20
|
<filter **>
|
21
21
|
type key_value_parser
|
22
22
|
key log
|
23
|
+
use_regex true
|
24
|
+
remove_key false
|
23
25
|
remove_prefix /^prefix/
|
24
26
|
keys_delimiter /\s+/
|
25
27
|
kv_delimiter_chart '='
|
28
|
+
filtered_keys akey,bkey,ckey
|
29
|
+
filtered_keys_regex /^sub_[a-zA-Z_0-9]+/
|
30
|
+
filter_out_lines_without_keys false
|
26
31
|
</filter>
|
27
32
|
|
28
33
|
<match **>
|
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "fluent-plugin-filter-kv-parser"
|
6
|
-
s.version = "0.0.
|
6
|
+
s.version = "0.0.6"
|
7
7
|
s.authors = ["Al-waleed Shihadeh"]
|
8
8
|
s.email = ["wshihadeh.dev@gmail.com"]
|
9
9
|
s.homepage = "https://github.com/wshihadeh/fluent-plugin-filter-kv-parser.git"
|
@@ -7,34 +7,72 @@ module Fluent
|
|
7
7
|
|
8
8
|
config_param :key, :string, default: 'log'
|
9
9
|
config_param :remove_key, :bool, default: false
|
10
|
+
config_param :filter_out_lines_without_keys, :bool, default: false
|
11
|
+
config_param :use_regex, :bool, default: false
|
10
12
|
config_param :remove_prefix, :string, default: ''
|
11
13
|
config_param :keys_delimiter, :string, default: '/\s+/'
|
12
14
|
config_param :kv_delimiter_chart, :string, default: '='
|
15
|
+
config_param :filtered_keys, :string, default: nil
|
16
|
+
config_param :filtered_keys_regex, :string, default: nil
|
17
|
+
config_param :filtered_keys_delimiter, :string, default: ','
|
13
18
|
|
14
19
|
|
15
20
|
def configure(conf)
|
16
21
|
super
|
17
|
-
|
22
|
+
|
23
|
+
regex = /^\/.+\/$/
|
24
|
+
|
25
|
+
if regex.match(@keys_delimiter.to_s)
|
18
26
|
@keys_delimiter = Regexp.new(@keys_delimiter[1..-2])
|
19
27
|
end
|
20
28
|
|
21
|
-
if @remove_prefix
|
29
|
+
if regex.match(@remove_prefix.to_s)
|
22
30
|
@remove_prefix = Regexp.new(@remove_prefix[1..-2])
|
23
31
|
end
|
32
|
+
|
33
|
+
if regex.match(@filtered_keys_regex.to_s)
|
34
|
+
@filtered_keys_regex = Regexp.new(@filtered_keys_regex[1..-2])
|
35
|
+
end
|
36
|
+
|
37
|
+
@filtered_keys_list = parse_filtered_keys_parameter
|
24
38
|
end
|
25
39
|
|
26
40
|
def filter(tag, time, record)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
record[key] = value
|
31
|
-
end
|
41
|
+
return if record[@key].nil?
|
42
|
+
|
43
|
+
keys = extracted_keys(extract_log_line(record[@key]))
|
32
44
|
|
33
|
-
|
45
|
+
return if @filter_out_lines_without_keys && keys.empty?
|
46
|
+
|
47
|
+
record.merge! keys
|
48
|
+
record.tap { |r| r.delete(@key) if @remove_key }.compact
|
34
49
|
end
|
35
50
|
|
36
51
|
private
|
37
52
|
|
53
|
+
def regex_filter(line)
|
54
|
+
"#{line} ".scan(/(?<key>[a-zA-Z_0-9]+)=(?<value>([^=]+|[^ ]+))\s/).to_h
|
55
|
+
end
|
56
|
+
|
57
|
+
def extracted_keys(line)
|
58
|
+
keys = @use_regex ? regex_filter(line) : delimiter_filter(line)
|
59
|
+
filtered_keys = @filtered_keys_list.empty? ? keys : keys.slice(*@filtered_keys_list)
|
60
|
+
@filtered_keys_regex.nil? ? filtered_keys : filtered_keys.merge(keys.select{ |k,v| @filtered_keys_regex.match(k.to_s)})
|
61
|
+
end
|
62
|
+
|
63
|
+
def delimiter_filter(line)
|
64
|
+
items = {}
|
65
|
+
line.split(@keys_delimiter).each do |kv|
|
66
|
+
key, value = kv.split(@kv_delimiter_chart, 2)
|
67
|
+
items[key] = value if value
|
68
|
+
end
|
69
|
+
items
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_filtered_keys_parameter
|
73
|
+
@filtered_keys.to_s.split(@filtered_keys_delimiter)
|
74
|
+
end
|
75
|
+
|
38
76
|
def extract_log_line(line)
|
39
77
|
line.gsub(@remove_prefix,'').strip
|
40
78
|
end
|
@@ -83,4 +83,133 @@ class KeyValueFilterTest < Test::Unit::TestCase
|
|
83
83
|
assert_equal 5, filtered.count
|
84
84
|
assert_equal false, filtered.key?("log")
|
85
85
|
end
|
86
|
+
|
87
|
+
test 'test_empty_line' do
|
88
|
+
d = create_driver(%[
|
89
|
+
key log
|
90
|
+
remove_key true
|
91
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
92
|
+
])
|
93
|
+
msg = {
|
94
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
95
|
+
'log' => 'Start Request',
|
96
|
+
}
|
97
|
+
filtered = filter(d, [msg]).first[2]
|
98
|
+
assert_equal 1, filtered.count
|
99
|
+
assert_equal false, filtered.key?("log")
|
100
|
+
end
|
101
|
+
|
102
|
+
test 'test_two_log_key' do
|
103
|
+
d = create_driver(%[
|
104
|
+
key log
|
105
|
+
remove_key true
|
106
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
107
|
+
])
|
108
|
+
msg = {
|
109
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
110
|
+
'log' => 'Start Request key=10 akey=20 zkey=30 dkey=40',
|
111
|
+
}
|
112
|
+
msg2 = {
|
113
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
114
|
+
'log' => 'Start Request key=10 akey=20 zkey=30 dkey=40',
|
115
|
+
}
|
116
|
+
filtered = filter(d, [msg, msg2])
|
117
|
+
assert_equal 2, filtered.count
|
118
|
+
end
|
119
|
+
|
120
|
+
test 'test_no_log_key' do
|
121
|
+
d = create_driver(%[
|
122
|
+
key log
|
123
|
+
remove_key true
|
124
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
125
|
+
])
|
126
|
+
msg = {
|
127
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
128
|
+
}
|
129
|
+
msg2 = {
|
130
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
131
|
+
'log' => 'Start Request key=10 akey=20 zkey=30 dkey=40',
|
132
|
+
}
|
133
|
+
filtered = filter(d, [msg, msg2])
|
134
|
+
assert_equal 1, filtered.count
|
135
|
+
end
|
136
|
+
|
137
|
+
test 'test_with_space_and_regex' do
|
138
|
+
d = create_driver(%[
|
139
|
+
key log
|
140
|
+
remove_key true
|
141
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
142
|
+
use_regex true
|
143
|
+
])
|
144
|
+
msg = {
|
145
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
146
|
+
'log' => "Start Request key=10 skey='this is a miltispace line' akey=20 zkey=30 dkey=4",
|
147
|
+
}
|
148
|
+
filtered = filter(d, [msg]).first[2]
|
149
|
+
assert_equal 6, filtered.count
|
150
|
+
assert_equal "'this is a miltispace line'", filtered['skey']
|
151
|
+
assert_equal false, filtered.key?("log")
|
152
|
+
end
|
153
|
+
|
154
|
+
test 'test_filter_keys' do
|
155
|
+
d = create_driver(%[
|
156
|
+
key log
|
157
|
+
remove_key true
|
158
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
159
|
+
use_regex true
|
160
|
+
filtered_keys key,gkeyn,nkey,skey,akey,zkey
|
161
|
+
])
|
162
|
+
msg = {
|
163
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
164
|
+
'log' => "Start Request key=10 gkey=100 nkey=108 skey='this is a miltispace line' akey=20 zkey=30 dkey=4",
|
165
|
+
}
|
166
|
+
filtered = filter(d, [msg]).first[2]
|
167
|
+
assert_equal 6, filtered.count
|
168
|
+
assert_equal "'this is a miltispace line'", filtered['skey']
|
169
|
+
assert_equal false, filtered.key?("log")
|
170
|
+
end
|
171
|
+
|
172
|
+
test 'test_filter_keys_with_regex' do
|
173
|
+
d = create_driver(%[
|
174
|
+
key log
|
175
|
+
remove_key true
|
176
|
+
remove_prefix /^[^ ]+\s[^ ]+/
|
177
|
+
use_regex true
|
178
|
+
filtered_keys key,gkeyn,nkey,skey,akey,zkey
|
179
|
+
filtered_keys_regex /^sub_[a-zA-Z_0-9]+/
|
180
|
+
])
|
181
|
+
msg = {
|
182
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
183
|
+
'log' => "Start Request sub_key=0 sub_akey=11 sub_zkey=12 key=10 gkey=100 nkey=108 skey='this is a miltispace line' akey=20 zkey=30 dkey=4",
|
184
|
+
}
|
185
|
+
filtered = filter(d, [msg]).first[2]
|
186
|
+
assert_equal 9, filtered.count
|
187
|
+
assert_equal "'this is a miltispace line'", filtered['skey']
|
188
|
+
assert_equal "0", filtered['sub_key']
|
189
|
+
assert_equal false, filtered.key?("log")
|
190
|
+
end
|
191
|
+
|
192
|
+
test 'test_filter_out_lines_without_keys' do
|
193
|
+
d = create_driver(%[
|
194
|
+
key log
|
195
|
+
remove_key true
|
196
|
+
use_regex true
|
197
|
+
filtered_keys_regex /^sub_[a-zA-Z_0-9]+/
|
198
|
+
filter_out_lines_without_keys true
|
199
|
+
])
|
200
|
+
msg = {
|
201
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
202
|
+
'log' => "akey=10 bkey=11 ckey=11",
|
203
|
+
}
|
204
|
+
|
205
|
+
msg2 = {
|
206
|
+
'time' => '2013-02-12 22:01:15 UTC',
|
207
|
+
'log' => "Start Request to test lines without any keys",
|
208
|
+
}
|
209
|
+
filtered = filter(d, [msg, msg2])
|
210
|
+
|
211
|
+
assert_equal 1, filtered.count
|
212
|
+
assert_equal 4, filtered.first[2].count
|
213
|
+
assert_equal "10", filtered.first[2]['akey']
|
214
|
+
end
|
86
215
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-filter-kv-parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Al-waleed Shihadeh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|