logstash-filter-dateparts 2.0.1 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8b480afd89318ea8bb3176bdec0b1cd9fbf3cd3
4
- data.tar.gz: cd5302e4a35e5f4bd1b33b25759605bf4f288d77
3
+ metadata.gz: 5e19d793f2e58398b43d3a02e3cb752627117530
4
+ data.tar.gz: 010f207477326df140e9805693d13cd81f3a3b84
5
5
  SHA512:
6
- metadata.gz: 5c3296b74768a007fc973faa9a428e213ecb627958e82342105e6a7a6fdd107c2edc5099b0e3f0c70133ed4819f14585496fb50fadec8234c9432105e5a5e650
7
- data.tar.gz: a20d130798618bb3c5c0758e93615e1d60c4545edfdf54ce23a9c303625f127d019d1f5ad5d02f07cbf74628a319b360d7ae9a8c95c3b91a1f2d6fd9133ceac6
6
+ metadata.gz: 02946b25be55a6dafcc09037a747376b663360c77fb660473d0f08749285a5571b8e3a46852c0df106375e9562defc1acd75f146c7552a90582bd2b59fcb929d
7
+ data.tar.gz: 4595e1fac4bf60184c1abe2b6971df9d83b4c9358f91f84e8b8b76a3c43fb048864172887301e52a3713c9de08b495767c1c11dfacc71c769629f762a963fd5e
@@ -1,5 +1,14 @@
1
- # 2.0.0
2
- - Breaking: Updated plugin to use new Java Event APIs
3
-
4
- # 1.0.1
5
- - Updated dependencies to avoid being tied to Logstash major release.
1
+ # 2.1.1
2
+ - Added support for caluclating a duration - https://github.com/mikebski/logstash-filter-datepart/issues/4
3
+ - Added support for DateTime and other objects with a to_date method
4
+ - Added TravisCI build hook
5
+
6
+ # 2.0.1
7
+ - Removed extraneous output statement from
8
+ https://github.com/mikebski/logstash-filter-datepart/issues/3
9
+
10
+ # 2.0.0
11
+ - Breaking: Updated plugin to use new Java Event APIs
12
+
13
+ # 1.0.1
14
+ - Updated dependencies to avoid being tied to Logstash major release.
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source 'https://rubygems.org'
2
- gemspec
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE CHANGED
@@ -1,13 +1,13 @@
1
- Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
2
-
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software
10
- distributed under the License is distributed on an "AS IS" BASIS,
11
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- See the License for the specific language governing permissions and
13
- limitations under the License.
1
+ Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md CHANGED
@@ -1,119 +1,137 @@
1
- # Logstash Plugin
2
-
3
- This is a plugin for [Logstash](https://github.com/elastic/logstash).
4
-
5
- The source for this plugin can be [found here on github](https://github.com/mikebski/logstash-datepart-plugin.git)
6
-
7
- Author: Mike Baranski (mike.baranski@gmail.com). Contributions are welcome.
8
-
9
- [![Gem Version](https://badge.fury.io/rb/logstash-filter-dateparts.svg)](https://badge.fury.io/rb/logstash-filter-dateparts)
10
-
11
- ## License ##
12
-
13
- Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
14
-
15
- Licensed under the Apache License, Version 2.0 (the "License");
16
- you may not use this file except in compliance with the License.
17
- You may obtain a copy of the License at
18
-
19
- http://www.apache.org/licenses/LICENSE-2.0
20
-
21
- Unless required by applicable law or agreed to in writing, software
22
- distributed under the License is distributed on an "AS IS" BASIS,
23
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
- See the License for the specific language governing permissions and
25
- limitations under the License.
26
-
27
- ## About
28
-
29
- This plugin is useful if you want to easily query Logstash data on *day of week*, *hour of day*, or other parts of a date. See the usage below for details on the output of the plugin. The date parts that can be generated are:
30
-
31
- * day
32
- * wday
33
- * yday
34
- * month
35
- * year
36
- * hour
37
- * min
38
- * sec
39
-
40
- ## Documentation
41
-
42
- ### Installation
43
-
44
- To manually install the plugin, download the gem and run:
45
-
46
- `bin/plugin install --no-verify logstash-filter-dateparts-1.0.0.gem`
47
-
48
- ### Usage
49
-
50
- To see the most basic usage, you can run the following (on Linux):
51
-
52
- `echo "HI" | bin/logstash -e 'input { stdin {} } filter {dateparts { }} output { stdout { codec=> rubydebug}}'`
53
-
54
- You could also use the logstash generator:
55
-
56
- `bin/logstash -e 'input { generator { lines => ["HI"] count => 1 } } filter {dateparts { }} output { stdout { codec=> rubydebug}}'`
57
-
58
- Here is the sample output:
59
-
60
- {
61
- "message" => "HI",
62
- "@version" => "1",
63
- "@timestamp" => "2015-11-20T12:24:40.217Z",
64
- "host" => "mike-VirtualBox",
65
- "day" => 20,
66
- "wday" => 5,
67
- "yday" => 324,
68
- "month" => 11,
69
- "year" => 2015,
70
- "hour" => 12,
71
- "min" => 24,
72
- "sec" => 40
73
- }
74
-
75
-
76
- This uses the default configuration, which generates the following fields from the `@timestamp` field of the event:
77
-
78
- * day
79
- * wday
80
- * yday
81
- * month
82
- * year
83
- * hour
84
- * min
85
- * sec
86
-
87
- ### Configuration
88
-
89
- #### Fields
90
-
91
- The generated fields are based on the date functions available in the [Ruby time class](http://ruby-doc.org/core-2.2.0/Time.html). You can specify any valid function and it will be added to the event.
92
-
93
- For example, this will add 2 fields, *sec* corresponding to `time.sec()` and *hour* corresponding to `time.hour()`:
94
-
95
- filter {
96
- dateparts {
97
- "fields" => ["sec", "hour"]
98
- }
99
- }
100
-
101
- #### Time Field
102
-
103
- By default, the plugin will use the *@timestamp* field, but you can specify a different one:
104
-
105
- filter {
106
- dateparts {
107
- "time_field" => "some_other_field"
108
- }
109
- }
110
-
111
- #### Error Tags
112
-
113
- By default, the tag *_dateparts_error* is added on exception. You can specify different tag(s) like so:
114
-
115
- filter {
116
- dateparts {
117
- "error_tags" => ["bad_dates", "xyz"]
118
- }
119
- }
1
+ # Logstash Plugin
2
+
3
+ This is a plugin for [Logstash](https://github.com/elastic/logstash).
4
+
5
+ The source for this plugin can be [found here on github](https://github.com/mikebski/logstash-datepart-plugin.git)
6
+
7
+ Author: Mike Baranski (mike.baranski@gmail.com). Contributions are welcome.
8
+
9
+ [![Gem Version](https://badge.fury.io/rb/logstash-filter-dateparts.svg)](https://badge.fury.io/rb/logstash-filter-dateparts)
10
+ [![Build Status](https://travis-ci.org/mikebski/logstash-filter-datepart.svg?branch=master)](https://travis-ci.org/mikebski/logstash-filter-datepart)
11
+
12
+ ## License ##
13
+
14
+ Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
15
+
16
+ Licensed under the Apache License, Version 2.0 (the "License");
17
+ you may not use this file except in compliance with the License.
18
+ You may obtain a copy of the License at
19
+
20
+ http://www.apache.org/licenses/LICENSE-2.0
21
+
22
+ Unless required by applicable law or agreed to in writing, software
23
+ distributed under the License is distributed on an "AS IS" BASIS,
24
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25
+ See the License for the specific language governing permissions and
26
+ limitations under the License.
27
+
28
+ ## About
29
+
30
+ This plugin is useful if you want to easily query Logstash data on *day of week*, *hour of day*, or other parts of a date. See the usage below for details on the output of the plugin. The date parts that can be generated are:
31
+
32
+ * day
33
+ * wday
34
+ * mday
35
+ * yday
36
+ * month
37
+ * year
38
+ * hour
39
+ * min
40
+ * sec
41
+
42
+ ## Documentation
43
+
44
+ ### Installation
45
+
46
+ To manually install the plugin, download the gem and run:
47
+
48
+ `bin/plugin install --no-verify logstash-filter-dateparts-1.0.0.gem`
49
+
50
+ ### Usage
51
+
52
+ To see the most basic usage, you can run the following (on Linux):
53
+
54
+ `echo "HI" | bin/logstash -e 'input { stdin {} } filter {dateparts { }} output { stdout { codec=> rubydebug}}'`
55
+
56
+ You could also use the logstash generator:
57
+
58
+ `bin/logstash -e 'input { generator { lines => ["HI"] count => 1 } } filter {dateparts { }} output { stdout { codec=> rubydebug}}'`
59
+
60
+ Here is the sample output:
61
+
62
+ {
63
+ "message" => "HI",
64
+ "@version" => "1",
65
+ "@timestamp" => "2015-11-20T12:24:40.217Z",
66
+ "host" => "mike-VirtualBox",
67
+ "day" => 20,
68
+ "wday" => 5,
69
+ "yday" => 324,
70
+ "month" => 11,
71
+ "year" => 2015,
72
+ "hour" => 12,
73
+ "min" => 24,
74
+ "sec" => 40
75
+ }
76
+
77
+
78
+ This uses the default configuration, which generates the following fields from the `@timestamp` field of the event:
79
+
80
+ * day
81
+ * wday
82
+ * yday
83
+ * month
84
+ * year
85
+ * hour
86
+ * min
87
+ * sec
88
+
89
+ ### Configuration
90
+
91
+ #### Fields
92
+
93
+ The generated fields are based on the date functions available in the [Ruby time class](http://ruby-doc.org/core-2.2.0/Time.html). You can specify any valid function and it will be added to the event.
94
+
95
+ For example, this will add 2 fields, *sec* corresponding to `time.sec()` and *hour* corresponding to `time.hour()`:
96
+
97
+ filter {
98
+ dateparts {
99
+ "fields" => ["sec", "hour"]
100
+ }
101
+ }
102
+
103
+ #### Time Field
104
+
105
+ By default, the plugin will use the *@timestamp* field, but you can specify a different one:
106
+
107
+ filter {
108
+ dateparts {
109
+ "time_field" => "some_other_field"
110
+ }
111
+ }
112
+
113
+ #### Duration Field (new in 2.1)
114
+
115
+ 2.1 provides the ability to calculate a duration (in seconds.milliseconds) based on 2 field.s
116
+ The value of the duration is a float with millisecond precision.
117
+
118
+ The input values must both be time values, and you specify an output field for the result
119
+
120
+ filter {
121
+ 'fields' => %w(mday),
122
+ 'duration' => {
123
+ 'start_field' => 'tstart',
124
+ 'end_field' => 'tend',
125
+ 'result_field' => 'duration'
126
+ }
127
+ }
128
+
129
+ #### Error Tags
130
+
131
+ By default, the tag *_dateparts_error* is added on exception. You can specify different tag(s) like so:
132
+
133
+ filter {
134
+ dateparts {
135
+ "error_tags" => ["bad_dates", "xyz"]
136
+ }
137
+ }
@@ -1,82 +1,118 @@
1
- # coding: utf-8
2
- # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
-
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
-
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- # encoding: utf-8
17
- require "logstash/filters/base"
18
- require "logstash/namespace"
19
-
20
- # This filter will add date parts to your record based on
21
- # the timestamp field.
22
- #
23
- class LogStash::Filters::DateParts < LogStash::Filters::Base
24
- # Setting the config_name here is required. This is how you
25
- # configure this filter from your Logstash config.
26
- #
27
- # filter {
28
- # dateparts {
29
- #
30
- # }
31
- # }
32
- #
33
- config_name "dateparts"
34
- config :fields, :validate => :array, :default => ["day", "wday", "yday", "month", "year", "hour", "min", "sec"], :required => true
35
- config :time_field, :validate => :string, :default => "@timestamp", :required => true
36
- config :error_tags, :validate => :array, :default => ["_dateparts_error"], :required => true
37
-
38
- public
39
- def register
40
- logger.debug? and logger.debug("DateParts filter registered")
41
- end
42
-
43
- def plugin_error(message, event)
44
- logger.error("DatePart filter error: " + message)
45
- LogStash::Util::Decorators.add_tags(@error_tags, event, "filters/#{self.class.name}")
46
- end
47
-
48
- def get_time_from_field(f)
49
- if f.class == Time
50
- return f
51
- elsif f.respond_to?("time")
52
- return f.time()
53
- else
54
- return nil
55
- end
56
- end
57
-
58
- public
59
- def filter(event)
60
- if @fields.respond_to?("each") and @fields.respond_to?("join")
61
- logger.debug? and logger.debug("DateParts plugin filtering #{@time_field} time_field and adding fields: " + @fields.join(", "))
62
- t = get_time_from_field(event.get(@time_field))
63
- if t == nil
64
- plugin_error("Invalid time field #{@time_field}; Time field must be an instance of Time or provide a time method that returns one", event)
65
- return
66
- end
67
- @fields.each do |field|
68
- begin
69
- event.set(field, t.send(field))
70
- rescue
71
- plugin_error("No such method: #{field}\n", event)
72
- end
73
- end
74
- else
75
- plugin_error("DateParts plugin fields invalid, should be an array of function names")
76
- return
77
- end
78
-
79
- filter_matched(event)
80
- end # def filter
81
-
82
- end # class LogStash::Filters::DateParts
1
+ # encoding: utf-8
2
+ # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
+
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ # encoding: utf-8
17
+ require 'logstash/filters/base'
18
+ require 'logstash/namespace'
19
+
20
+ # This filter will add date parts to your record based on
21
+ # the timestamp field.
22
+ #
23
+ class LogStash::Filters::DateParts < LogStash::Filters::Base
24
+ # Setting the config_name here is required. This is how you
25
+ # configure this filter from your Logstash config.
26
+ #
27
+ # filter {
28
+ # dateparts {
29
+ #
30
+ # }
31
+ # }
32
+ #
33
+ config_name 'dateparts'
34
+ config :fields, :validate => :array, :default => %w(day wday yday mday month year hour min sec), :required => true
35
+ config :time_field, :validate => :string, :default => '@timestamp', :required => true
36
+ config :error_tags, :validate => :array, :default => ['_dateparts_error'], :required => true
37
+ config :duration, :validate => :hash, :required => false
38
+ public
39
+
40
+ def register
41
+ logger.debug? and logger.debug('DateParts filter registered')
42
+ end
43
+
44
+ def plugin_error(message, event)
45
+ logger.error("DatePart filter error: #{message}")
46
+ LogStash::Util::Decorators.add_tags(@error_tags, event, "filters/#{self.class.name}")
47
+ end
48
+
49
+ def get_time_from_field(f)
50
+ if f.class == Time
51
+ f
52
+ elsif f.respond_to?('time')
53
+ f.time
54
+ elsif f.respond_to?('to_time')
55
+ f.to_time
56
+ else
57
+ nil
58
+ end
59
+ end
60
+
61
+ public
62
+ def filter(event)
63
+ invalid = true
64
+ event_time = get_time_from_field(event.get(@time_field))
65
+ if event_time == nil
66
+ plugin_error("Invalid time field #{@time_field}; Time field must be an instance of Time or provide a time method that returns one", event)
67
+ return
68
+ end
69
+ if @fields.respond_to?('each') and @fields.respond_to?('join')
70
+ invalid = false
71
+ logger.debug? and logger.debug("DateParts plugin filtering #{@time_field} time_field and adding fields: " + @fields.join(', '))
72
+ @fields.each do |field|
73
+ begin
74
+ event.set(field, event_time.send(field))
75
+ rescue
76
+ plugin_error("No such method: #{field}\n", event)
77
+ end
78
+ end
79
+ end
80
+ if @duration != nil
81
+ start_field = @duration['start_field']
82
+ if(start_field == nil)
83
+ start_field = '@timestamp'
84
+ end
85
+ start_time = get_time_from_field(event.get(start_field))
86
+
87
+ end_field = @duration['end_field']
88
+ if(end_field == nil)
89
+ end_field = '@timestamp'
90
+ end
91
+ end_time = get_time_from_field(event.get(end_field))
92
+
93
+ if start_time == nil or end_time == nil
94
+ plugin_error("Invalid start [#{@duration['start_field']}] or end [#{@duration['end_field']}]. Time fields must be an instance of Time or provide a time method that returns one", event)
95
+ return
96
+ end
97
+ if(start_field.eql?(end_field))
98
+ logger.warn("Start and End fields are the same for dateparts filter [#{start_field}]")
99
+ end
100
+
101
+ result_field = @duration['result_field']
102
+ if result_field == nil
103
+ result_field = 'duration_result'
104
+ end
105
+
106
+ duration = end_time - start_time
107
+ event.set(result_field, duration)
108
+ invalid = false
109
+ end
110
+ if invalid
111
+ plugin_error('DateParts plugin error', event)
112
+ return
113
+ end
114
+
115
+ filter_matched(event)
116
+ end # def filter
117
+
118
+ end # class LogStash::Filters::DateParts
@@ -1,39 +1,39 @@
1
- # encoding: utf-8
2
-
3
- # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
4
-
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
-
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
-
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- Gem::Specification.new do |s|
18
- s.name = 'logstash-filter-dateparts'
19
- s.version = '2.0.1'
20
- s.licenses = ['Apache License (2.0)']
21
- s.summary = 'This dateparts fileter adds date information to your event based on your timestamp'
22
- s.description = 'This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program'
23
- s.authors = ['Mike Baranski']
24
- s.email = 'mike.baranski@gmail.com'
25
- s.homepage = 'http://mikeski.net'
26
- s.require_paths = ['lib']
27
-
28
- # Files
29
- s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','Gemfile','LICENSE']
30
- # Tests
31
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
32
-
33
- # Special flag to let us know this is actually a logstash plugin
34
- s.metadata = { 'logstash_plugin' => 'true', 'logstash_group' => 'filter' }
35
-
36
- # Gem dependencies
37
- s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
38
- s.add_development_dependency 'logstash-devutils'
39
- end
1
+ # encoding: utf-8
2
+
3
+ # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
4
+
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ Gem::Specification.new do |s|
18
+ s.name = 'logstash-filter-dateparts'
19
+ s.version = '2.1.1'
20
+ s.licenses = ['Apache License (2.0)']
21
+ s.summary = 'This dateparts fileter adds date information to your event based on your timestamp'
22
+ s.description = 'This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program'
23
+ s.authors = ['Mike Baranski']
24
+ s.email = 'mike.baranski@gmail.com'
25
+ s.homepage = 'http://mikeski.net'
26
+ s.require_paths = ['lib']
27
+
28
+ # Files
29
+ s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','Gemfile','LICENSE']
30
+ # Tests
31
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
32
+
33
+ # Special flag to let us know this is actually a logstash plugin
34
+ s.metadata = { 'logstash_plugin' => 'true', 'logstash_group' => 'filter' }
35
+
36
+ # Gem dependencies
37
+ s.add_runtime_dependency 'logstash-core-plugin-api', '>= 1.60', '<= 2.99'
38
+ s.add_development_dependency 'logstash-devutils', '1.1.0'
39
+ end
@@ -1,97 +1,206 @@
1
- # coding: utf-8
2
- # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
-
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
-
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- require 'spec_helper'
17
- require "logstash/filters/dateparts"
18
- require "logstash/timestamp"
19
- require "logstash/event"
20
-
21
- def get_event(contents = {})
22
- contents["@timestamp"] = LogStash::Timestamp.new
23
- event = LogStash::Event.new(contents)
24
- return event
25
- end
26
-
27
- describe LogStash::Filters::DateParts do
28
- default_ts = "@timestamp"
29
- alt_ts_field = "zxlk"
30
-
31
- it "Default config should result in filter with 8 functions, one error tag and @timestamp as the time field" do
32
- f = LogStash::Filters::DateParts.new({})
33
-
34
- expect(f.class).to eq(LogStash::Filters::DateParts)
35
- expect(f.fields.length).to eq(8)
36
- expect(f.time_field).to eq(default_ts)
37
- expect(f.error_tags.length).to eq(1)
38
- end
39
-
40
- it "Config should result in filter with 2 functions and the alt timestamp field" do
41
- f = LogStash::Filters::DateParts.new({
42
- "fields" => ["sec", "hour"],
43
- "time_field" => alt_ts_field
44
- })
45
-
46
- expect(f.class).to eq(LogStash::Filters::DateParts)
47
- expect(f.fields.length).to eq(2)
48
- expect(f.fields[0]).to eq("sec")
49
- expect(f.time_field).to eq(alt_ts_field)
50
- end
51
-
52
- it "Should generate the default fields (8 of them)" do
53
- event = get_event()
54
- count = event.to_hash().count
55
- f = LogStash::Filters::DateParts.new({})
56
- f.filter(event)
57
-
58
- expect(event.to_hash().count).to eq(count + 8)
59
- expect(event.get('sec')).to be_truthy
60
- expect(event.get('hour')).to be_truthy
61
- expect(event.get('min')).to be_truthy
62
- expect(event.get('month')).to be_truthy
63
- expect(event.get('year')).to be_truthy
64
- expect(event.get('day')).to be_truthy
65
- expect(event.get('wday')).to be_truthy
66
- expect(event.get('yday')).to be_truthy
67
- expect(event.get('tags')).to be_nil
68
- end
69
-
70
- it "Should generate only the specified fields" do
71
- event = get_event()
72
- count = event.to_hash.count
73
- f = LogStash::Filters::DateParts.new({
74
- "fields" => ["sec", "hour"]
75
- })
76
- f.filter(event)
77
- expect(event.to_hash().count).to eq(count + 2)
78
- expect(event.get('sec')).to be_truthy
79
- expect(event.get('hour')).to be_truthy
80
- expect(event.get('min')).to be_nil
81
- expect(event.get('month')).to be_nil
82
- expect(event.get('year')).to be_nil
83
- expect(event.get('day')).to be_nil
84
- expect(event.get('wday')).to be_nil
85
- expect(event.get('yday')).to be_nil
86
- expect(event.get('tags')).to be_nil
87
- end
88
-
89
- it "Should set the error tag on an invalid time field" do
90
- event = get_event()
91
- count = event.to_hash().count
92
- f = LogStash::Filters::DateParts.new({ "time_field" => alt_ts_field })
93
-
94
- f.filter(event)
95
- expect(event.get('tags').include? '_dateparts_error').to eq(true)
96
- end
97
- end
1
+ # coding: utf-8
2
+ # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
+
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'spec_helper'
17
+ require 'logstash/filters/dateparts'
18
+ require 'logstash/timestamp'
19
+ require 'logstash/event'
20
+
21
+ def get_event(contents = {})
22
+ contents['@timestamp'] = LogStash::Timestamp.new
23
+ LogStash::Event.new(contents)
24
+ end
25
+
26
+ describe LogStash::Filters::DateParts do
27
+ default_ts = '@timestamp'
28
+ alt_ts_field = 'zxlk'
29
+
30
+ it 'Get time from field should work with Time' do
31
+ f = LogStash::Filters::DateParts.new({})
32
+ field_to_test = Time.new
33
+ val = f.get_time_from_field(field_to_test);
34
+ expect(val.class).to be(Time)
35
+ end
36
+
37
+ it 'Get time from field should work with DateTime' do
38
+ f = LogStash::Filters::DateParts.new({})
39
+ field_to_test = DateTime.new
40
+ val = f.get_time_from_field(field_to_test);
41
+ expect(val.class).to be(Time)
42
+ end
43
+
44
+ it 'Default config should result in filter with 8 functions, one error tag and @timestamp as the time field' do
45
+ f = LogStash::Filters::DateParts.new({})
46
+
47
+ expect(f.class).to eq(LogStash::Filters::DateParts)
48
+ expect(f.fields.length).to eq(9)
49
+ expect(f.time_field).to eq(default_ts)
50
+ expect(f.error_tags.length).to eq(1)
51
+ end
52
+
53
+ it 'Config should result in filter with 2 functions and the alt timestamp field' do
54
+ f = LogStash::Filters::DateParts.new({
55
+ 'fields' => %w(sec hour),
56
+ 'time_field' => alt_ts_field
57
+ })
58
+
59
+ expect(f.class).to eq(LogStash::Filters::DateParts)
60
+ expect(f.fields.length).to eq(2)
61
+ expect(f.fields[0]).to eq('sec')
62
+ expect(f.time_field).to eq(alt_ts_field)
63
+ end
64
+
65
+ it 'Should generate the default fields (8 of them)' do
66
+ event = get_event
67
+ count = event.to_hash.count
68
+ f = LogStash::Filters::DateParts.new({})
69
+ f.filter(event)
70
+
71
+ expect(event.to_hash.count).to eq(count + 9)
72
+ expect(event.get('sec')).to be_truthy
73
+ expect(event.get('hour')).to be_truthy
74
+ expect(event.get('min')).to be_truthy
75
+ expect(event.get('month')).to be_truthy
76
+ expect(event.get('year')).to be_truthy
77
+ expect(event.get('day')).to be_truthy
78
+ expect(event.get('wday')).to be_truthy
79
+ expect(event.get('mday')).to be_truthy
80
+ expect(event.get('yday')).to be_truthy
81
+ expect(event.get('tags')).to be_nil
82
+ end
83
+
84
+ it 'Should generate only the specified fields' do
85
+ event = get_event
86
+ count = event.to_hash.count
87
+ f = LogStash::Filters::DateParts.new({
88
+ 'fields' => %w(sec hour)
89
+ })
90
+ f.filter(event)
91
+ expect(event.to_hash.count).to eq(count + 2)
92
+ expect(event.get('sec')).to be_truthy
93
+ expect(event.get('hour')).to be_truthy
94
+ expect(event.get('min')).to be_nil
95
+ expect(event.get('month')).to be_nil
96
+ expect(event.get('year')).to be_nil
97
+ expect(event.get('day')).to be_nil
98
+ expect(event.get('wday')).to be_nil
99
+ expect(event.get('mday')).to be_nil
100
+ expect(event.get('yday')).to be_nil
101
+ expect(event.get('tags')).to be_nil
102
+ end
103
+
104
+ it 'Should set the error tag on an invalid time field' do
105
+ event = get_event
106
+ f = LogStash::Filters::DateParts.new({ 'time_field' => alt_ts_field })
107
+
108
+ f.filter(event)
109
+ expect(event.get('tags').include? '_dateparts_error').to eq(true)
110
+ end
111
+
112
+ it 'Should bail on an invalid date part' do
113
+ event = get_event
114
+ f = LogStash::Filters::DateParts.new({
115
+ 'fields' => %w(seczzz zzhour)
116
+ })
117
+ f.filter(event)
118
+ expect(event.get('tags').include? '_dateparts_error').to eq(true)
119
+ end
120
+
121
+ it 'Should calculate a duration' do
122
+ event = get_event
123
+ f = LogStash::Filters::DateParts.new({
124
+ 'duration' => {
125
+ 'start_field' => '@timestamp',
126
+ 'end_field' => 'sometime',
127
+ 'result_field' => 'duration'
128
+ }
129
+ })
130
+ event.set('sometime', Time.new)
131
+ f.filter(event)
132
+ expect(event.get('tags')).to be_nil
133
+ expect(event.get('duration')).to be > 0
134
+ end
135
+
136
+ it 'Should calculate a duration using 2 fields' do
137
+ event = get_event
138
+ f = LogStash::Filters::DateParts.new({
139
+ 'duration' => {
140
+ 'start_field' => 'tstart',
141
+ 'end_field' => 'tend',
142
+ 'result_field' => 'duration'
143
+ }
144
+ })
145
+
146
+ event.set('tstart', DateTime.new(2016, 1, 1, 12, 0, 0).to_time)
147
+ event.set('tend', DateTime.new(2016, 1, 1, 12, 0, 0).to_time)
148
+ f.filter(event)
149
+ expect(event.get('tags')).to be_nil
150
+ expect(event.get('duration')).to eq(0.0)
151
+ end
152
+
153
+ it 'Should calculate a duration of 1 second using 2 fields' do
154
+ event = get_event
155
+ f = LogStash::Filters::DateParts.new({
156
+ 'duration' => {
157
+ 'start_field' => 'tstart',
158
+ 'end_field' => 'tend',
159
+ 'result_field' => 'duration'
160
+ }
161
+ })
162
+
163
+ event.set('tstart', DateTime.new(2016, 1, 1, 23, 0, 0).to_time)
164
+ event.set('tend', DateTime.new(2016, 1, 1, 23, 0, 1).to_time)
165
+ f.filter(event)
166
+ expect(event.get('tags')).to be_nil
167
+ expect(event.get('duration')).to eq(1.0)
168
+ end
169
+
170
+ it 'Should calculate a duration of 3600 seconds using 2 fields and calculate datepart' do
171
+ event = get_event
172
+ f = LogStash::Filters::DateParts.new({
173
+ #'fields' => %w(mday),
174
+ 'duration' => {
175
+ 'start_field' => 'tstart',
176
+ 'end_field' => 'tend',
177
+ 'result_field' => 'duration'
178
+ }
179
+ })
180
+
181
+ event.set('tstart', DateTime.new(2016, 1, 1, 20, 0, 0).to_time)
182
+ event.set('tend', DateTime.new(2016, 1, 1, 21, 0, 0).to_time)
183
+ f.filter(event)
184
+ expect(event.get('tags')).to be_nil
185
+ expect(event.get('duration')).to eq(3600.0)
186
+ expect(event.get('mday')).to be > -1
187
+
188
+ end
189
+
190
+ it 'Should warn and return 0.0 if start and end are the same field' do
191
+ event = get_event
192
+ f = LogStash::Filters::DateParts.new({
193
+ 'duration' => {
194
+ 'start_field' => 'tstart',
195
+ 'end_field' => 'tstart',
196
+ 'result_field' => 'duration'
197
+ }
198
+ })
199
+
200
+ event.set('tstart', DateTime.new(2016, 1, 1, 20, 0, 0).to_time)
201
+ f.filter(event)
202
+ expect(event.get('tags')).to be_nil
203
+ expect(event.get('duration')).to eq(0.0)
204
+ expect(event.get('mday')).to be > -1
205
+ end
206
+ end
@@ -1,16 +1,16 @@
1
- # coding: utf-8
2
- # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
-
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
-
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- require "logstash/devutils/rspec/spec_helper"
1
+ # coding: utf-8
2
+ # Copyright (c) 2014–2015 Mike Baranski <http://www.mikeski.net>
3
+
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require "logstash/devutils/rspec/spec_helper"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-dateparts
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Baranski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-30 00:00:00.000000000 Z
11
+ date: 2016-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash-core-plugin-api
@@ -34,16 +34,16 @@ dependencies:
34
34
  name: logstash-devutils
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - '>='
37
+ - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: '0'
39
+ version: 1.1.0
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - '>='
44
+ - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: '0'
46
+ version: 1.1.0
47
47
  description: This gem is a logstash plugin required to be installed on top of the
48
48
  Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not
49
49
  a stand-alone program
@@ -82,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  version: '0'
83
83
  requirements: []
84
84
  rubyforge_project:
85
- rubygems_version: 2.0.14
85
+ rubygems_version: 2.0.14.1
86
86
  signing_key:
87
87
  specification_version: 4
88
88
  summary: This dateparts fileter adds date information to your event based on your