fluent-plugin-time_parser 0.0.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 +15 -0
- data/Gemfile +2 -0
- data/LICENSE +2 -0
- data/README.md +22 -0
- data/Rakefile +9 -0
- data/fluent-plugin-time_parser.gemspec +18 -0
- data/lib/fluent/.DS_Store +0 -0
- data/lib/fluent/plugin/out_time_parser.rb +62 -0
- data/test/plugin/test_out_time_parser.rb +141 -0
- data/test/test_helper.rb +21 -0
- metadata +96 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
Yjk2ZDdlYTEwNDRjM2EyNDY3MmU3N2RhYjc2YjI3MmI0NWE3Nzk3Mw==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
YzE2YzcxM2IxYTg2NjVhYjgzYmE2MjY2OGJlNDZmYzlkYTQ3NDA3Zg==
|
|
7
|
+
!binary "U0hBNTEy":
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
MDIwMjU5NzdiZjFjZDczZWU5ODU4ZTc4ZTkwNjdhNDI1MDlmNGQwNzA0YTky
|
|
10
|
+
MWM2ODIyZDZkMjE4NDE5ZjRlNDc0NDNkOWU0YTgwZmNlOGYyODA4ZWFmMzY1
|
|
11
|
+
MmU4OGI4OGE0ZmE4ODI3NGVkODgyNWM4YzI5OGM0Y2ZjMWU5OWQ=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
ZWE1NmFmYjFmMWE4MTU4MTE4YzE3YTlmMTQyMjYxZDc4OGYyMjEwM2YwMTY5
|
|
14
|
+
MmQ1ZDY2MjRkNGZiY2UwOTNjYmUzMzBjZGJkNWUyYTNjMjhjNTUxMjAwYzIz
|
|
15
|
+
ZmI5MTJmNDM4MzgyODgzZmE4NDFjMGEyMDRmZmZkNzdmZDI3NDg=
|
data/Gemfile
ADDED
data/LICENSE
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# fluent-plugin-time_parser
|
|
2
|
+
|
|
3
|
+
## Component
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Contributing
|
|
7
|
+
|
|
8
|
+
1. Fork it
|
|
9
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
10
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
|
11
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
12
|
+
5. Create new Pull Request
|
|
13
|
+
|
|
14
|
+
## Copyright
|
|
15
|
+
|
|
16
|
+
### Copyright
|
|
17
|
+
|
|
18
|
+
Copyright (c) 2013- Carlos Donderis (@CaDs)
|
|
19
|
+
|
|
20
|
+
### License
|
|
21
|
+
|
|
22
|
+
Apache License, Version 2.0
|
data/Rakefile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Gem::Specification.new do |gem|
|
|
2
|
+
gem.name = 'fluent-plugin-time_parser'
|
|
3
|
+
gem.version = '0.0.1'
|
|
4
|
+
gem.authors = ['Carlos Donderis']
|
|
5
|
+
gem.email = ['cdonderis@gmail.com']
|
|
6
|
+
gem.homepage = 'http://github.com/cads/fluent-plugin-time_parser'
|
|
7
|
+
gem.description = %q{Fluentd plugin to parse the time parameter.}
|
|
8
|
+
gem.summary = %q{Fluentd plugin to parse the time parameter.}
|
|
9
|
+
|
|
10
|
+
gem.files = `git ls-files`.split($\)
|
|
11
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
12
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
13
|
+
gem.require_paths = ['lib']
|
|
14
|
+
|
|
15
|
+
gem.add_development_dependency 'rake'
|
|
16
|
+
gem.add_development_dependency 'fluentd'
|
|
17
|
+
gem.add_runtime_dependency 'fluentd'
|
|
18
|
+
end
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'time'
|
|
2
|
+
require 'tzinfo'
|
|
3
|
+
|
|
4
|
+
module Fluent
|
|
5
|
+
class TimeParserOutput < Output
|
|
6
|
+
include Fluent::HandleTagNameMixin
|
|
7
|
+
Fluent::Plugin.register_output('time_parser', self)
|
|
8
|
+
|
|
9
|
+
config_param :key, :string, :default => 'time'
|
|
10
|
+
config_param :time_zone, :string
|
|
11
|
+
|
|
12
|
+
def configure(conf)
|
|
13
|
+
super
|
|
14
|
+
if (
|
|
15
|
+
!remove_tag_prefix &&
|
|
16
|
+
!remove_tag_suffix &&
|
|
17
|
+
!add_tag_prefix &&
|
|
18
|
+
!add_tag_suffix
|
|
19
|
+
)
|
|
20
|
+
raise ConfigError, "out_extract_query_params: At least one of remove_tag_prefix/remove_tag_suffix/add_tag_prefix/add_tag_suffix is required to be set."
|
|
21
|
+
raise ConfigError, "You must specify a time zone" unless time_zone
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def start
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def shutdown
|
|
30
|
+
super
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def emit(tag, es, chain)
|
|
34
|
+
es.each {|time,record|
|
|
35
|
+
t = tag.dup
|
|
36
|
+
filter_record(t, time, record)
|
|
37
|
+
Engine.emit(t, time, record)
|
|
38
|
+
}
|
|
39
|
+
chain.next
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def filter_record(tag, time, record)
|
|
43
|
+
begin
|
|
44
|
+
original_time = Time.parse(record[key])
|
|
45
|
+
tz = TZInfo::Timezone.get(time_zone.capitalize)
|
|
46
|
+
|
|
47
|
+
converted_time = tz.utc_to_local(original_time)
|
|
48
|
+
|
|
49
|
+
date = converted_time.to_date.to_s
|
|
50
|
+
hour = converted_time.hour.to_s
|
|
51
|
+
record['date'] = date
|
|
52
|
+
record['hour'] = hour
|
|
53
|
+
rescue ArgumentError => error
|
|
54
|
+
$log.warn("out_extract_query_params: #{error.message}")
|
|
55
|
+
rescue TZInfo::InvalidTimezoneIdentifier
|
|
56
|
+
$log.warn("Timezone Not Valid, please refer to http://tzinfo.rubyforge.org/doc/classes/TZInfo/Timezone.html for valid timezones")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
super(tag, time, record)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
require 'time'
|
|
4
|
+
require 'tzinfo'
|
|
5
|
+
require 'debugger'
|
|
6
|
+
|
|
7
|
+
class TimeParserOutputTest < Test::Unit::TestCase
|
|
8
|
+
|
|
9
|
+
TIME = "2013-04-14T06:14:36Z"
|
|
10
|
+
|
|
11
|
+
def setup
|
|
12
|
+
Fluent::Test.setup
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def create_driver(conf, tag = 'test')
|
|
16
|
+
Fluent::Test::OutputTestDriver.new(
|
|
17
|
+
Fluent::TimeParserOutput, tag
|
|
18
|
+
).configure(conf)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_configure
|
|
22
|
+
d = create_driver(%[
|
|
23
|
+
key test
|
|
24
|
+
add_tag_prefix extracted.
|
|
25
|
+
time_zone Tokyo
|
|
26
|
+
])
|
|
27
|
+
assert_equal 'test', d.instance.key
|
|
28
|
+
assert_equal 'extracted.', d.instance.add_tag_prefix
|
|
29
|
+
assert_equal 'Tokyo', d.instance.time_zone
|
|
30
|
+
|
|
31
|
+
#Default Key
|
|
32
|
+
d = create_driver(%[
|
|
33
|
+
add_tag_prefix extracted.
|
|
34
|
+
time_zone Tokyo
|
|
35
|
+
])
|
|
36
|
+
assert_equal 'time', d.instance.key
|
|
37
|
+
assert_equal 'extracted.', d.instance.add_tag_prefix
|
|
38
|
+
assert_equal 'Tokyo', d.instance.time_zone
|
|
39
|
+
|
|
40
|
+
#No Prefix
|
|
41
|
+
assert_raise(Fluent::ConfigError) do
|
|
42
|
+
create_driver(%[
|
|
43
|
+
time_zone Tokyo
|
|
44
|
+
])
|
|
45
|
+
end
|
|
46
|
+
#No TimeZone
|
|
47
|
+
assert_raise(Fluent::ConfigError) do
|
|
48
|
+
create_driver(%[
|
|
49
|
+
key test
|
|
50
|
+
add_tag_prefix extracted.
|
|
51
|
+
])
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_filter_record
|
|
56
|
+
d = create_driver(%[
|
|
57
|
+
key time
|
|
58
|
+
add_tag_prefix extracted.
|
|
59
|
+
time_zone Japan
|
|
60
|
+
])
|
|
61
|
+
tag = 'test'
|
|
62
|
+
record = {'time' => TIME}
|
|
63
|
+
d.instance.filter_record('test', Time.now, record)
|
|
64
|
+
tz = TZInfo::Timezone.get('Japan')
|
|
65
|
+
converted_time = tz.utc_to_local(Time.parse(TIME))
|
|
66
|
+
|
|
67
|
+
assert_equal record['date'], converted_time.to_date.to_s
|
|
68
|
+
assert_equal record['hour'], converted_time.hour.to_s
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_filter_record_bad_parameters
|
|
72
|
+
d = create_driver(%[
|
|
73
|
+
key time
|
|
74
|
+
add_tag_prefix extracted.
|
|
75
|
+
time_zone myPlace
|
|
76
|
+
])
|
|
77
|
+
tag = 'test'
|
|
78
|
+
record = {'time' => TIME}
|
|
79
|
+
|
|
80
|
+
d.instance.filter_record('test', Time.now, record)
|
|
81
|
+
assert_equal record['date'], nil
|
|
82
|
+
assert_equal record['hour'], nil
|
|
83
|
+
|
|
84
|
+
record = {'time' => "this is not a date"}
|
|
85
|
+
d.instance.filter_record('test', Time.now, record)
|
|
86
|
+
assert_equal record['date'], nil
|
|
87
|
+
assert_equal record['hour'], nil
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def test_emit
|
|
91
|
+
d = create_driver(%[
|
|
92
|
+
key time
|
|
93
|
+
add_tag_prefix extracted.
|
|
94
|
+
time_zone Japan
|
|
95
|
+
])
|
|
96
|
+
|
|
97
|
+
d.run { d.emit('time' => TIME) }
|
|
98
|
+
emits = d.emits
|
|
99
|
+
|
|
100
|
+
assert_equal 1, emits.count
|
|
101
|
+
assert_equal 'extracted.test', emits[0][0]
|
|
102
|
+
assert_equal TIME, emits[0][2]['time']
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_emit_multi
|
|
106
|
+
d = create_driver(%[
|
|
107
|
+
key time
|
|
108
|
+
add_tag_prefix extracted.
|
|
109
|
+
time_zone Japan
|
|
110
|
+
])
|
|
111
|
+
|
|
112
|
+
d.run do
|
|
113
|
+
d.emit('time' => TIME)
|
|
114
|
+
d.emit('time' => TIME)
|
|
115
|
+
d.emit('time' => TIME)
|
|
116
|
+
end
|
|
117
|
+
emits = d.emits
|
|
118
|
+
|
|
119
|
+
assert_equal 3, emits.count
|
|
120
|
+
0.upto(2) do |i|
|
|
121
|
+
assert_equal 'extracted.test', emits[i][0]
|
|
122
|
+
assert_equal TIME, emits[i][2]['time']
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_emit_with_invalid_time
|
|
127
|
+
d = create_driver(%[
|
|
128
|
+
key time
|
|
129
|
+
add_tag_prefix extracted.
|
|
130
|
+
time_zone Japan
|
|
131
|
+
])
|
|
132
|
+
wrong_time = 'wrong time'
|
|
133
|
+
d.run { d.emit('time' => wrong_time) }
|
|
134
|
+
emits = d.emits
|
|
135
|
+
|
|
136
|
+
assert_equal 1, emits.count
|
|
137
|
+
assert_equal 'extracted.test', emits[0][0]
|
|
138
|
+
assert_equal wrong_time, emits[0][2]['time']
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
|
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
5
|
+
|
|
6
|
+
require 'fluent/test'
|
|
7
|
+
|
|
8
|
+
unless ENV.has_key?('VERBOSE')
|
|
9
|
+
nulllogger = Object.new
|
|
10
|
+
nulllogger.instance_eval {|obj|
|
|
11
|
+
def method_missing(method, *args)
|
|
12
|
+
# pass
|
|
13
|
+
end
|
|
14
|
+
}
|
|
15
|
+
$log = nulllogger
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
require 'fluent/plugin/out_time_parser'
|
|
19
|
+
|
|
20
|
+
class Test::Unit::TestCase
|
|
21
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: fluent-plugin-time_parser
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Carlos Donderis
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2013-04-26 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rake
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ! '>='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ! '>='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: fluentd
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ! '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ! '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: fluentd
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ! '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ! '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
description: Fluentd plugin to parse the time parameter.
|
|
56
|
+
email:
|
|
57
|
+
- cdonderis@gmail.com
|
|
58
|
+
executables: []
|
|
59
|
+
extensions: []
|
|
60
|
+
extra_rdoc_files: []
|
|
61
|
+
files:
|
|
62
|
+
- Gemfile
|
|
63
|
+
- LICENSE
|
|
64
|
+
- README.md
|
|
65
|
+
- Rakefile
|
|
66
|
+
- fluent-plugin-time_parser.gemspec
|
|
67
|
+
- lib/fluent/.DS_Store
|
|
68
|
+
- lib/fluent/plugin/out_time_parser.rb
|
|
69
|
+
- test/plugin/test_out_time_parser.rb
|
|
70
|
+
- test/test_helper.rb
|
|
71
|
+
homepage: http://github.com/cads/fluent-plugin-time_parser
|
|
72
|
+
licenses: []
|
|
73
|
+
metadata: {}
|
|
74
|
+
post_install_message:
|
|
75
|
+
rdoc_options: []
|
|
76
|
+
require_paths:
|
|
77
|
+
- lib
|
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ! '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
|
+
requirements:
|
|
85
|
+
- - ! '>='
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: '0'
|
|
88
|
+
requirements: []
|
|
89
|
+
rubyforge_project:
|
|
90
|
+
rubygems_version: 2.0.3
|
|
91
|
+
signing_key:
|
|
92
|
+
specification_version: 4
|
|
93
|
+
summary: Fluentd plugin to parse the time parameter.
|
|
94
|
+
test_files:
|
|
95
|
+
- test/plugin/test_out_time_parser.rb
|
|
96
|
+
- test/test_helper.rb
|