fluent-plugin-viaq_data_model 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 +4 -4
- data/.travis.yml +12 -0
- data/Gemfile +7 -0
- data/README.md +118 -2
- data/filter-viaq_data_model.conf +1 -0
- data/fluent-plugin-viaq_data_model.gemspec +2 -2
- data/lib/fluent/plugin/filter_viaq_data_model.rb +26 -3
- data/test/test_filter_viaq_data_model.rb +27 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4ecf55fa6bf6e1001738e41876a8ba70f4fee67
|
4
|
+
data.tar.gz: 88d75546acb5b4db61dc09046a7873a2382c60d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f2fd967b4d57cb6afe9c8a46d723e8e30c53f71a056bdb436e6fceb5dad489c52a8eded2068d95c6ccb47f7deb728f6a5d2b568034cc29d7cb8e3e11a9e4503
|
7
|
+
data.tar.gz: af3c09cabf0b8ece8a659bb8c1116be62d53f90da62768ccdc2d6be2cc87ce257fb12e051f1cd9d52565e29344c40e5f6aa4cebaee34f5ac70d60dccda27badb
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -1,2 +1,118 @@
|
|
1
|
-
# fluent-plugin-viaq_data_model
|
2
|
-
|
1
|
+
# fluent-plugin-viaq_data_model - a ViaQ data model filter plugin for [Fluentd](http://fluentd.org)
|
2
|
+
[![Travis CI](https://secure.travis-ci.org/ViaQ/fluent-plugin-viaq_data_model.png)](http://travis-ci.org/#!/ViaQ/fluent-plugin-viaq_data_model)
|
3
|
+
|
4
|
+
## Introduction
|
5
|
+
|
6
|
+
This plugin formats Fluentd records in the proper [ViaQ data
|
7
|
+
model](https://github.com/ViaQ/elasticsearch-templates). It does the
|
8
|
+
following:
|
9
|
+
|
10
|
+
* Removes empty fields
|
11
|
+
* fields with a value of `nil`
|
12
|
+
* string fields with a value of `''` or the empty string
|
13
|
+
* hash valued fields with a value of `{}`
|
14
|
+
* hash valued fields which contain only empty fields as described above
|
15
|
+
* FixNum, Boolean and other field values are not removed - type must respond
|
16
|
+
to `:empty?` to be considered empty
|
17
|
+
|
18
|
+
* Moves "undefined" values to a top level field called `undefined`
|
19
|
+
|
20
|
+
The ViaQ data model wants all top level fields defined and described. These
|
21
|
+
can conflict with the fields defined by ViaQ. You can "move" these fields to
|
22
|
+
be under a hash valued top level field called `undefined` so as not to conflict
|
23
|
+
with the "well known" ViaQ top level fields. You can optionally keep some
|
24
|
+
fields as top level fields while moving others to the `undefined` container.
|
25
|
+
|
26
|
+
* Rename a time field to `@timestamp`
|
27
|
+
|
28
|
+
You cannot set the `@timestamp` field in a Fluentd `record_transformer` filter.
|
29
|
+
The plugin allows you to use some other field e.g. `time` and have that "moved"
|
30
|
+
to a top level field called `@timestamp`.
|
31
|
+
|
32
|
+
## Configuration
|
33
|
+
|
34
|
+
NOTE: All fields are Optional - no required fields.
|
35
|
+
|
36
|
+
See `filter-viaq_data_model.conf` for an example filter configuration.
|
37
|
+
|
38
|
+
* `default_keep_fields` - comma delimited string - default: `''`
|
39
|
+
* This is the default list of fields to keep as top level fields in the record
|
40
|
+
* `default_keep_fields message,@timestamp,ident` - do not move these fields into the `undefined` field
|
41
|
+
* `extra_keep_fields` - comma delimited string - default: `''`
|
42
|
+
* This is an extra list of fields to keep in addition to
|
43
|
+
`default_keep_fields` - mostly useful as a way to hard code the
|
44
|
+
`default_keep_fields` list for configuration management purposes, but at the
|
45
|
+
same time allow customization in certain cases
|
46
|
+
* `extra_keep_fields myspecialfield1,myspecialfield2`
|
47
|
+
* `keep_empty_fields` - comma delimited string - default `''`
|
48
|
+
* Always keep these top level fields, even if they are empty
|
49
|
+
* `keep_empty_fields message` - keep the `message` field, even if empty
|
50
|
+
* `use_undefined` - boolean - default `false`
|
51
|
+
* If `true`, move fields not specified in `default_keep_fields` and
|
52
|
+
`extra_keep_fields` to the `undefined` top level field. If you use
|
53
|
+
`use_undefined` you should specify the fields you want to keep out of
|
54
|
+
`undefined` by using `default_keep_fields` and/or `extra_keep_fields`
|
55
|
+
* `undefined_name` - string - default `"undefined"`
|
56
|
+
* Name of undefined top level field to use if `use_undefined true` is set
|
57
|
+
* `undefined_name myfields` - keep undefined fields under field `myfields`
|
58
|
+
* `rename_time` - boolean - default `true`
|
59
|
+
* Rename the time field e.g. when you need to set `@timestamp` in the record
|
60
|
+
* NOTE: This will overwrite the `dest_time_name` if already set
|
61
|
+
* `rename_time_if_missing` - boolean - default `false`
|
62
|
+
* Rename the time field only if it is not present. For example, if some
|
63
|
+
records already have the `@timestamp` field and you do not want to overwrite
|
64
|
+
them, use `rename_time_if_missing true`
|
65
|
+
* `src_time_name` - string - default `time`
|
66
|
+
* Use this field to get the value of the time field in the resulting record.
|
67
|
+
This field will be removed from the record.
|
68
|
+
* NOTE: This field must be present in the `default_keep_fields` or
|
69
|
+
`extra_keep_fields` if `use_undefined true`
|
70
|
+
* `dest_time_name` - string - default `@timestamp`
|
71
|
+
* This is the name of the top level field to hold the time value. The value
|
72
|
+
is taken from the value of the `src_time_name` field.
|
73
|
+
|
74
|
+
## Example
|
75
|
+
|
76
|
+
If the input record looks like this:
|
77
|
+
|
78
|
+
{
|
79
|
+
"a": "b",
|
80
|
+
"c": "d",
|
81
|
+
"e": '',
|
82
|
+
"f": {
|
83
|
+
"g": '',
|
84
|
+
"h": {}
|
85
|
+
},
|
86
|
+
"i": {
|
87
|
+
"j": 0,
|
88
|
+
"k": False,
|
89
|
+
"l": ''
|
90
|
+
},
|
91
|
+
"time": "2017-02-13 15:30:10.259106596-07:00"
|
92
|
+
}
|
93
|
+
|
94
|
+
The resulting record, using the defaults, would look like this:
|
95
|
+
|
96
|
+
{
|
97
|
+
"a": "b",
|
98
|
+
"c": "d",
|
99
|
+
"i": {
|
100
|
+
"j": 0,
|
101
|
+
"k": False,
|
102
|
+
},
|
103
|
+
"@timestamp": "2017-02-13 15:30:10.259106596-07:00"
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
## Installation
|
108
|
+
|
109
|
+
gem install fluent-plugin-viaq_data_model
|
110
|
+
|
111
|
+
## Contributing
|
112
|
+
|
113
|
+
1. Fork it
|
114
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
115
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
116
|
+
4. Test it (`GEM_HOME=vendor bundle install; GEM_HOME=vendor bundle exec rake test`)
|
117
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
118
|
+
6. Create new Pull Request
|
data/filter-viaq_data_model.conf
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
use_undefined "#{ENV['CDM_USE_UNDEFINED'] || false}"
|
7
7
|
undefined_name "#{ENV['CDM_UNDEFINED_NAME'] || 'undefined'}"
|
8
8
|
rename_time "#{ENV['CDM_RENAME_TIME'] || true}"
|
9
|
+
rename_time_if_missing "#{ENV['CDM_RENAME_TIME_IF_MISSING'] || false}"
|
9
10
|
src_time_name "#{ENV['CDM_SRC_TIME_NAME'] || 'time'}"
|
10
11
|
dest_time_name "#{ENV['CDM_DEST_TIME_NAME'] || '@timestamp'}"
|
11
12
|
</filter>
|
@@ -4,12 +4,12 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "fluent-plugin-viaq_data_model"
|
7
|
-
gem.version = "0.0.
|
7
|
+
gem.version = "0.0.2"
|
8
8
|
gem.authors = ["Rich Megginson"]
|
9
9
|
gem.email = ["rmeggins@redhat.com"]
|
10
10
|
gem.description = %q{Filter plugin to ensure data is in the ViaQ common data model}
|
11
11
|
gem.summary = %q{Filter plugin to ensure data is in the ViaQ common data model}
|
12
|
-
gem.homepage = "https://github.com/ViaQ/fluent-plugin-
|
12
|
+
gem.homepage = "https://github.com/ViaQ/fluent-plugin-viaq_data_model"
|
13
13
|
gem.license = "Apache-2.0"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
@@ -1,3 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd ViaQ data model Filter Plugin
|
3
|
+
#
|
4
|
+
# Copyright 2017 Red Hat, Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
1
18
|
require 'fluent/filter'
|
2
19
|
require 'fluent/log'
|
3
20
|
|
@@ -33,6 +50,9 @@ module Fluent
|
|
33
50
|
desc 'Rename timestamp field to Elasticsearch compatible name'
|
34
51
|
config_param :rename_time, :bool, default: true
|
35
52
|
|
53
|
+
desc 'Rename timestamp field to Elasticsearch compatible name only if the destination field does not already exist'
|
54
|
+
config_param :rename_time_if_missing, :bool, default: false
|
55
|
+
|
36
56
|
desc 'Name of source timestamp field'
|
37
57
|
config_param :src_time_name, :string, default: 'time'
|
38
58
|
|
@@ -53,7 +73,7 @@ module Fluent
|
|
53
73
|
if @use_undefined && @keep_fields.key?(@undefined_name)
|
54
74
|
raise Fluent::ConfigError, "Do not put [#{@undefined_name}] in default_keep_fields or extra_keep_fields"
|
55
75
|
end
|
56
|
-
if @rename_time && @use_undefined && !@keep_fields.key?(@src_time_name)
|
76
|
+
if (@rename_time || @rename_time_if_not_exist) && @use_undefined && !@keep_fields.key?(@src_time_name)
|
57
77
|
raise Fluent::ConfigError, "Field [#{@src_time_name}] must be listed in default_keep_fields or extra_keep_fields"
|
58
78
|
end
|
59
79
|
end
|
@@ -102,8 +122,11 @@ module Fluent
|
|
102
122
|
# probably shouldn't remove everything . . .
|
103
123
|
log.warn("Empty record! tag [#{tag}] time [#{time}]") if record.empty?
|
104
124
|
# rename the time field
|
105
|
-
if @rename_time && record.key?(@src_time_name)
|
106
|
-
|
125
|
+
if (@rename_time || @rename_time_if_missing) && record.key?(@src_time_name)
|
126
|
+
val = record.delete(@src_time_name)
|
127
|
+
unless @rename_time_if_missing && record.key?(@dest_time_name)
|
128
|
+
record[@dest_time_name] = val
|
129
|
+
end
|
107
130
|
end
|
108
131
|
if ENV['CDM_DEBUG']
|
109
132
|
unless tag == ENV['CDM_DEBUG_IGNORE_TAG']
|
@@ -164,6 +164,33 @@ class ViaqDataModelFilterTest < Test::Unit::TestCase
|
|
164
164
|
assert_equal('b', rec['c'])
|
165
165
|
assert_nil(rec['a'])
|
166
166
|
end
|
167
|
+
test 'see if time field is renamed when checking if missing' do
|
168
|
+
rec = emit_with_tag('tag', {'a'=>'b'}, '
|
169
|
+
rename_time_if_missing true
|
170
|
+
src_time_name a
|
171
|
+
dest_time_name c
|
172
|
+
')
|
173
|
+
assert_equal('b', rec['c'])
|
174
|
+
assert_nil(rec['a'])
|
175
|
+
end
|
176
|
+
test 'see if time field is renamed when already present' do
|
177
|
+
rec = emit_with_tag('tag', {'a'=>'b','c'=>'d'}, '
|
178
|
+
rename_time true
|
179
|
+
src_time_name a
|
180
|
+
dest_time_name c
|
181
|
+
')
|
182
|
+
assert_equal('b', rec['c'])
|
183
|
+
assert_nil(rec['a'])
|
184
|
+
end
|
185
|
+
test 'see if time field is preserved when already present' do
|
186
|
+
rec = emit_with_tag('tag', {'a'=>'b','c'=>'d'}, '
|
187
|
+
rename_time_if_missing true
|
188
|
+
src_time_name a
|
189
|
+
dest_time_name c
|
190
|
+
')
|
191
|
+
assert_equal('d', rec['c'])
|
192
|
+
assert_nil(rec['a'])
|
193
|
+
end
|
167
194
|
test 'see if deeply nested empty fields are removed or preserved' do
|
168
195
|
msg = {'a'=>{'b'=>{'c'=>{'d'=>{'e'=>'','f'=>{},'g'=>''}}}},'h'=>{'i'=>{'j'=>'','k'=>'l','m'=>99,'n'=>true}}}
|
169
196
|
rec = emit_with_tag('tag', msg)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-viaq_data_model
|
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
|
- Rich Megginson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -116,6 +116,8 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
|
+
- Gemfile
|
119
121
|
- LICENSE
|
120
122
|
- README.md
|
121
123
|
- Rakefile
|
@@ -124,7 +126,7 @@ files:
|
|
124
126
|
- fluent-plugin-viaq_data_model.gemspec
|
125
127
|
- lib/fluent/plugin/filter_viaq_data_model.rb
|
126
128
|
- test/test_filter_viaq_data_model.rb
|
127
|
-
homepage: https://github.com/ViaQ/fluent-plugin-
|
129
|
+
homepage: https://github.com/ViaQ/fluent-plugin-viaq_data_model
|
128
130
|
licenses:
|
129
131
|
- Apache-2.0
|
130
132
|
metadata: {}
|