fluent-plugin-fields-parser 0.1.0 → 0.1.1

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.
data/README.md CHANGED
@@ -17,6 +17,8 @@ Use RubyGems:
17
17
 
18
18
  remove_tag_prefix raw
19
19
  add_tag_prefix parsed
20
+
21
+ strict_key_value false
20
22
  </match>
21
23
 
22
24
  If following record is passed:
@@ -25,7 +27,7 @@ If following record is passed:
25
27
  {"message": "Audit log user=Johny action='add-user' result=success" }
26
28
  ```
27
29
 
28
- then you got new record:
30
+ then you will get a new record:
29
31
 
30
32
  ```
31
33
  {
@@ -92,7 +94,7 @@ Configuration
92
94
 
93
95
  For input like:
94
96
  ```
95
- { "message": "data black:54 white=55 red=10"}
97
+ { "message": "data black:54 white:55 red:10"}
96
98
  ```
97
99
 
98
100
  it returns:
@@ -114,6 +116,41 @@ You cat add and/or remove tag prefix using Configuration parameters
114
116
  add_tag_prefix parsed
115
117
  </match>
116
118
 
117
- It it matched tag "raw.some.record", then it emits tag "parsed.some.record".
119
+ If it matched tag "raw.some.record", then it emits tag "parsed.some.record".
120
+
121
+ ### Parameter strict_key_value
122
+
123
+ ```
124
+ <match pattern>
125
+ type fields_parser
126
+ strict_key_value true
127
+ </match>
128
+ ```
129
+
130
+ If `strict_key_value` is set to `true`, the parser will use the [ruby logfmt
131
+ parser](https://github.com/cyberdelia/logfmt-ruby) which will parse the log
132
+ message based on the popular [logfmt](https://brandur.org/logfmt) key/value
133
+ format. Do note that this parser will create Fixnum and Float type values
134
+ when it parses integer and float values.
118
135
 
136
+ All information provided in the log message must be in a strict key=value
137
+ format. For example, if following record is passed:
119
138
 
139
+ ```
140
+ {"message": "msg=\"Audit log\" user=Johnny action=\"add-user\" result=success iVal=23 fVal=1.02 bVal=true" }
141
+ ```
142
+
143
+ then you will get a new record:
144
+
145
+ ```
146
+ {
147
+ "message": "msg=\"Audit log\" user=Johnny action=\"add-user\" result=success iVal=23 fVal=1.02 bVal=true",
148
+ "msg": "Audit log",
149
+ "user": "Johnny",
150
+ "action": "add-user",
151
+ "result": "success",
152
+ "iVal": 23,
153
+ "fVal": 1.02,
154
+ "bVal": "true"
155
+ }
156
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
@@ -18,5 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ['lib']
19
19
 
20
20
  gem.add_dependency "fluentd"
21
+ gem.add_dependency "logfmt"
21
22
  gem.add_development_dependency "rake"
22
23
  end
24
+
@@ -1,3 +1,5 @@
1
+ require "logfmt"
2
+
1
3
  module Fluent
2
4
  class OutputFieldsParser < Fluent::Output
3
5
  Fluent::Plugin.register_output('fields_parser', self)
@@ -8,6 +10,7 @@ module Fluent
8
10
  config_param :fields_key, :string, :default => nil
9
11
  config_param :pattern, :string,
10
12
  :default => %{([a-zA-Z_]\\w*)=((['"]).*?(\\3)|[\\w.@$%/+-]*)}
13
+ config_param :strict_key_value, :bool, :default => false
11
14
 
12
15
  def compiled_pattern
13
16
  @compiled_pattern ||= Regexp.new(pattern)
@@ -39,15 +42,22 @@ module Fluent
39
42
  source = record[parse_key].to_s
40
43
  target = fields_key ? (record[fields_key] ||= {}) : record
41
44
 
42
- source.scan(compiled_pattern) do |match|
43
- (key, value, begining_quote, ending_quote) = match
44
- next if key.nil?
45
- next if target.has_key?(key)
46
- value = value.to_s
47
- from_pos = begining_quote.to_s.length
48
- to_pos = value.length - ending_quote.to_s.length - 1
49
- target[key] = value[from_pos..to_pos]
45
+ if strict_key_value
46
+ # Use logfmt to parse it (key=value)
47
+ parsed = Logfmt.parse(source)
48
+ target.merge!(parsed)
49
+ else
50
+ source.scan(compiled_pattern) do |match|
51
+ (key, value, begining_quote, ending_quote) = match
52
+ next if key.nil?
53
+ next if target.has_key?(key)
54
+ value = value.to_s
55
+ from_pos = begining_quote.to_s.length
56
+ to_pos = value.length - ending_quote.to_s.length - 1
57
+ target[key] = value[from_pos..to_pos]
58
+ end
50
59
  end
60
+
51
61
  return record
52
62
  end
53
63
  end
@@ -231,4 +231,40 @@ class FieldsParserOutputTest < Test::Unit::TestCase
231
231
  emits[1][2]
232
232
  )
233
233
  end
234
+
235
+ def test_strict_key_value
236
+ d = create_driver("strict_key_value true")
237
+
238
+ orig_message = %{msg="Audit log" user=Johnny action="add-user" dontignore=don't-ignore-this result=success iVal=23 fVal=1.02 bVal=true}
239
+ d.run do
240
+ d.emit({'message' => orig_message})
241
+ d.emit({'message' => 'a'})
242
+ end
243
+
244
+ emits = d.emits
245
+ assert_equal 2, emits.size
246
+ assert_equal "orig.test.tag", emits[0][0]
247
+ assert_equal(
248
+ {
249
+ 'message' => orig_message,
250
+ "msg"=>"Audit log",
251
+ 'user' => "Johnny",
252
+ 'action' => 'add-user',
253
+ 'dontignore' => "don't-ignore-this",
254
+ 'result' => 'success',
255
+ 'iVal' => 23,
256
+ 'fVal' => 1.02,
257
+ 'bVal' => "true"
258
+ },
259
+ emits[0][2]
260
+ )
261
+ assert_equal(
262
+ {
263
+ 'message' => 'a',
264
+ },
265
+ emits[1][2]
266
+ )
267
+ end
268
+
269
+
234
270
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-fields-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-07 00:00:00.000000000 Z
12
+ date: 2014-08-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: logfmt
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rake
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -54,7 +70,7 @@ files:
54
70
  - README.md
55
71
  - Rakefile
56
72
  - VERSION
57
- - fluent-plugin-tokenizer.gemspec
73
+ - fluent-plugin-fields-parser.gemspec
58
74
  - lib/fluent/plugin/out_fields_parser.rb
59
75
  - test/out_fields_parser.rb
60
76
  homepage: https://github.com/tomas-zemres/fluent-plugin-fields-parser