fluentd 0.14.1 → 0.14.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ChangeLog +110 -1
- data/Rakefile +5 -1
- data/appveyor.yml +7 -1
- data/example/in_forward.conf +4 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +21 -3
- data/lib/fluent/compat/formatter.rb +4 -2
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +60 -0
- data/lib/fluent/compat/input.rb +1 -3
- data/lib/fluent/compat/output.rb +95 -39
- data/lib/fluent/compat/parser.rb +17 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/{test/driver/owner.rb → compat/structured_format_mixin.rb} +5 -11
- data/lib/fluent/config/element.rb +2 -2
- data/lib/fluent/configurable.rb +2 -1
- data/lib/fluent/event.rb +61 -7
- data/lib/fluent/event_router.rb +1 -1
- data/lib/fluent/plugin.rb +7 -7
- data/lib/fluent/plugin/buf_file.rb +5 -2
- data/lib/fluent/plugin/buffer.rb +194 -64
- data/lib/fluent/plugin/buffer/chunk.rb +28 -3
- data/lib/fluent/plugin/buffer/file_chunk.rb +5 -21
- data/lib/fluent/plugin/buffer/memory_chunk.rb +1 -11
- data/lib/fluent/plugin/exec_util.rb +2 -112
- data/lib/fluent/plugin/file_util.rb +3 -38
- data/lib/fluent/plugin/file_wrapper.rb +1 -1
- data/lib/fluent/plugin/filter_grep.rb +3 -7
- data/lib/fluent/plugin/filter_record_transformer.rb +5 -5
- data/lib/fluent/plugin/filter_stdout.rb +18 -11
- data/lib/fluent/plugin/formatter.rb +0 -48
- data/lib/fluent/plugin/formatter_csv.rb +7 -8
- data/lib/fluent/plugin/formatter_hash.rb +1 -4
- data/lib/fluent/plugin/formatter_json.rb +1 -4
- data/lib/fluent/plugin/formatter_ltsv.rb +5 -6
- data/lib/fluent/plugin/formatter_msgpack.rb +1 -4
- data/lib/fluent/plugin/formatter_out_file.rb +36 -3
- data/lib/fluent/plugin/formatter_stdout.rb +36 -1
- data/lib/fluent/plugin/in_dummy.rb +9 -2
- data/lib/fluent/plugin/in_exec.rb +20 -57
- data/lib/fluent/plugin/in_forward.rb +4 -3
- data/lib/fluent/plugin/in_object_space.rb +8 -44
- data/lib/fluent/plugin/in_syslog.rb +13 -24
- data/lib/fluent/plugin/in_tail.rb +3 -0
- data/lib/fluent/plugin/out_buffered_stdout.rb +14 -4
- data/lib/fluent/plugin/out_exec.rb +7 -5
- data/lib/fluent/plugin/out_exec_filter.rb +10 -10
- data/lib/fluent/plugin/out_file.rb +1 -3
- data/lib/fluent/plugin/out_forward.rb +38 -57
- data/lib/fluent/plugin/out_stdout.rb +14 -5
- data/lib/fluent/plugin/out_stream.rb +3 -0
- data/lib/fluent/plugin/output.rb +31 -14
- data/lib/fluent/plugin/parser.rb +0 -69
- data/lib/fluent/plugin/parser_apache.rb +10 -6
- data/lib/fluent/plugin/parser_apache_error.rb +8 -3
- data/lib/fluent/plugin/parser_csv.rb +3 -1
- data/lib/fluent/plugin/parser_json.rb +1 -1
- data/lib/fluent/plugin/parser_multiline.rb +5 -3
- data/lib/fluent/plugin/parser_nginx.rb +10 -6
- data/lib/fluent/plugin/parser_regexp.rb +73 -0
- data/lib/fluent/plugin/socket_util.rb +2 -148
- data/lib/fluent/plugin/storage_local.rb +1 -1
- data/lib/fluent/plugin/string_util.rb +3 -18
- data/lib/fluent/plugin_helper.rb +1 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +166 -41
- data/lib/fluent/plugin_helper/formatter.rb +30 -19
- data/lib/fluent/plugin_helper/inject.rb +25 -12
- data/lib/fluent/plugin_helper/parser.rb +22 -13
- data/lib/fluent/plugin_helper/storage.rb +22 -13
- data/lib/fluent/registry.rb +19 -6
- data/lib/fluent/supervisor.rb +27 -1
- data/lib/fluent/test/driver/base.rb +16 -92
- data/lib/fluent/test/driver/base_owned.rb +17 -53
- data/lib/fluent/test/driver/base_owner.rb +125 -0
- data/lib/fluent/test/driver/filter.rb +24 -2
- data/lib/fluent/test/driver/input.rb +2 -2
- data/lib/fluent/test/driver/multi_output.rb +2 -2
- data/lib/fluent/test/driver/output.rb +3 -5
- data/lib/fluent/test/helpers.rb +25 -0
- data/lib/fluent/test/input_test.rb +4 -4
- data/lib/fluent/test/output_test.rb +3 -3
- data/lib/fluent/version.rb +1 -1
- data/test/config/test_element.rb +135 -6
- data/test/plugin/test_buf_file.rb +71 -3
- data/test/plugin/test_buffer.rb +305 -86
- data/test/plugin/test_buffer_chunk.rb +60 -2
- data/test/plugin/test_buffer_file_chunk.rb +4 -3
- data/test/plugin/test_filter_grep.rb +25 -21
- data/test/plugin/test_filter_record_transformer.rb +75 -67
- data/test/plugin/test_filter_stdout.rb +171 -74
- data/test/plugin/test_formatter_csv.rb +94 -0
- data/test/plugin/test_formatter_json.rb +30 -0
- data/test/plugin/test_formatter_ltsv.rb +52 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_in_dummy.rb +95 -0
- data/test/plugin/test_in_exec.rb +27 -31
- data/test/plugin/test_in_forward.rb +24 -0
- data/test/plugin/test_in_gc_stat.rb +5 -5
- data/test/plugin/test_in_object_space.rb +4 -4
- data/test/plugin/test_in_syslog.rb +60 -35
- data/test/plugin/test_out_buffered_stdout.rb +17 -3
- data/test/plugin/test_out_forward.rb +93 -5
- data/test/plugin/test_out_stdout.rb +14 -3
- data/test/plugin/test_output_as_buffered_retries.rb +20 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +16 -0
- data/test/plugin/test_output_as_standard.rb +22 -22
- data/test/plugin/test_parser_apache.rb +13 -9
- data/test/plugin/test_parser_apache_error.rb +11 -6
- data/test/plugin/test_parser_csv.rb +35 -25
- data/test/plugin/test_parser_nginx.rb +11 -5
- data/test/plugin/test_parser_regexp.rb +235 -68
- data/test/plugin/test_parser_tsv.rb +54 -58
- data/test/plugin_helper/test_compat_parameters.rb +111 -46
- data/test/plugin_helper/test_formatter.rb +40 -0
- data/test/plugin_helper/test_inject.rb +101 -2
- data/test/plugin_helper/test_parser.rb +40 -0
- data/test/plugin_helper/test_storage.rb +43 -0
- data/test/test_event.rb +93 -0
- data/test/test_event_router.rb +13 -4
- data/test/test_event_time.rb +0 -3
- data/test/test_formatter.rb +7 -164
- data/test/test_plugin_classes.rb +28 -1
- metadata +24 -3
@@ -73,6 +73,14 @@ class StorageHelperTest < Test::Unit::TestCase
|
|
73
73
|
helpers :storage
|
74
74
|
end
|
75
75
|
|
76
|
+
class Dummy2 < Fluent::Plugin::TestBase
|
77
|
+
helpers :storage
|
78
|
+
config_section :storage do
|
79
|
+
config_set_default :@type, 'ex2'
|
80
|
+
config_set_default :dummy_path, '/tmp/yay'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
76
84
|
setup do
|
77
85
|
@d = nil
|
78
86
|
end
|
@@ -91,6 +99,41 @@ class StorageHelperTest < Test::Unit::TestCase
|
|
91
99
|
assert_equal 0, d._storages.size
|
92
100
|
end
|
93
101
|
|
102
|
+
test 'can override default configuration parameters, but not overwrite whole definition' do
|
103
|
+
d = Dummy.new
|
104
|
+
d.configure(config_element())
|
105
|
+
assert_equal [], d.storage_configs
|
106
|
+
|
107
|
+
d = Dummy2.new
|
108
|
+
d.configure(config_element('ROOT', '', {}, [config_element('storage', '', {}, [])]))
|
109
|
+
assert_raise NoMethodError do
|
110
|
+
d.storage
|
111
|
+
end
|
112
|
+
assert_equal 1, d.storage_configs.size
|
113
|
+
assert_equal 'ex2', d.storage_configs.first[:@type]
|
114
|
+
assert_equal '/tmp/yay', d.storage_configs.first.dummy_path
|
115
|
+
end
|
116
|
+
|
117
|
+
test 'creates instance of type specified by conf, or default_type if @type is missing in conf' do
|
118
|
+
d = Dummy2.new
|
119
|
+
d.configure(config_element())
|
120
|
+
i = d.storage_create(conf: config_element('format', '', {'@type' => 'example'}), default_type: 'ex2')
|
121
|
+
assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(ExampleStorage) }
|
122
|
+
|
123
|
+
d = Dummy2.new
|
124
|
+
d.configure(config_element())
|
125
|
+
i = d.storage_create(conf: nil, default_type: 'ex2')
|
126
|
+
assert{ i.is_a?(Fluent::PluginHelper::Storage::SynchronizeWrapper) && i.instance_eval{ @storage }.is_a?(Example2Storage) }
|
127
|
+
end
|
128
|
+
|
129
|
+
test 'raises config error if config section is specified, but @type is not specified' do
|
130
|
+
d = Dummy2.new
|
131
|
+
d.configure(config_element())
|
132
|
+
assert_raise Fluent::ConfigError.new("@type is required in <storage>") do
|
133
|
+
d.storage_create(conf: config_element('storage', '', {}), default_type: 'ex2')
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
94
137
|
test 'can be configured without storage sections' do
|
95
138
|
d = Dummy.new
|
96
139
|
assert_nothing_raised do
|
data/test/test_event.rb
CHANGED
@@ -114,6 +114,35 @@ module EventTest
|
|
114
114
|
assert_true ArrayEventStream.new([]).empty?
|
115
115
|
end
|
116
116
|
|
117
|
+
test 'size' do
|
118
|
+
assert_equal 2, @es.size
|
119
|
+
assert_equal 0, ArrayEventStream.new([]).size
|
120
|
+
end
|
121
|
+
|
122
|
+
test 'slice' do
|
123
|
+
sliced = @es.slice(1,1)
|
124
|
+
assert_kind_of EventStream, sliced
|
125
|
+
assert_equal 1, sliced.size
|
126
|
+
|
127
|
+
sliced.each do |time, record|
|
128
|
+
assert_equal @times[1], time
|
129
|
+
assert_equal 'v2', record['k']
|
130
|
+
assert_equal 2, record['n']
|
131
|
+
end
|
132
|
+
|
133
|
+
sliced = @es.slice(0,2)
|
134
|
+
assert_kind_of EventStream, sliced
|
135
|
+
assert_equal 2, sliced.size
|
136
|
+
|
137
|
+
counter = 0
|
138
|
+
sliced.each do |time, record|
|
139
|
+
assert_equal @times[counter], time
|
140
|
+
assert_equal @records[counter]['k'], record['k']
|
141
|
+
assert_equal @records[counter]['n'], record['n']
|
142
|
+
counter += 1
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
117
146
|
test 'each' do
|
118
147
|
i = 0
|
119
148
|
@es.each { |time, record|
|
@@ -164,6 +193,35 @@ module EventTest
|
|
164
193
|
assert_true MultiEventStream.new.empty?
|
165
194
|
end
|
166
195
|
|
196
|
+
test 'size' do
|
197
|
+
assert_equal 2, @es.size
|
198
|
+
assert_equal 0, MultiEventStream.new.size
|
199
|
+
end
|
200
|
+
|
201
|
+
test 'slice' do
|
202
|
+
sliced = @es.slice(1,1)
|
203
|
+
assert_kind_of EventStream, sliced
|
204
|
+
assert_equal 1, sliced.size
|
205
|
+
|
206
|
+
sliced.each do |time, record|
|
207
|
+
assert_equal @times[1], time
|
208
|
+
assert_equal 'v2', record['k']
|
209
|
+
assert_equal 2, record['n']
|
210
|
+
end
|
211
|
+
|
212
|
+
sliced = @es.slice(0,2)
|
213
|
+
assert_kind_of EventStream, sliced
|
214
|
+
assert_equal 2, sliced.size
|
215
|
+
|
216
|
+
counter = 0
|
217
|
+
sliced.each do |time, record|
|
218
|
+
assert_equal @times[counter], time
|
219
|
+
assert_equal @records[counter]['k'], record['k']
|
220
|
+
assert_equal @records[counter]['n'], record['n']
|
221
|
+
counter += 1
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
167
225
|
test 'each' do
|
168
226
|
i = 0
|
169
227
|
@es.each { |time, record|
|
@@ -204,16 +262,51 @@ module EventTest
|
|
204
262
|
assert_kind_of MessagePackEventStream, dupped
|
205
263
|
assert_not_equal @es.object_id, dupped.object_id
|
206
264
|
assert_duplicated_records @es, dupped
|
265
|
+
|
266
|
+
# After iteration of events (done in assert_duplicated_records),
|
267
|
+
# duplicated event stream still has unpacked objects and correct size
|
268
|
+
dupped = @es.dup
|
269
|
+
assert_equal 2, dupped.instance_eval{ @size }
|
207
270
|
end
|
208
271
|
|
209
272
|
test 'empty?' do
|
210
273
|
assert_false @es.empty?
|
274
|
+
assert_true MessagePackEventStream.new('', 0).empty?
|
275
|
+
end
|
276
|
+
|
277
|
+
test 'size' do
|
278
|
+
assert_equal 2, @es.size
|
279
|
+
assert_equal 0, MessagePackEventStream.new('').size
|
211
280
|
end
|
212
281
|
|
213
282
|
test 'repeatable?' do
|
214
283
|
assert_true @es.repeatable?
|
215
284
|
end
|
216
285
|
|
286
|
+
test 'slice' do
|
287
|
+
sliced = @es.slice(1,1)
|
288
|
+
assert_kind_of EventStream, sliced
|
289
|
+
assert_equal 1, sliced.size
|
290
|
+
|
291
|
+
sliced.each do |time, record|
|
292
|
+
assert_equal @times[1], time
|
293
|
+
assert_equal 'v2', record['k']
|
294
|
+
assert_equal 2, record['n']
|
295
|
+
end
|
296
|
+
|
297
|
+
sliced = @es.slice(0,2)
|
298
|
+
assert_kind_of EventStream, sliced
|
299
|
+
assert_equal 2, sliced.size
|
300
|
+
|
301
|
+
counter = 0
|
302
|
+
sliced.each do |time, record|
|
303
|
+
assert_equal @times[counter], time
|
304
|
+
assert_equal @records[counter]['k'], record['k']
|
305
|
+
assert_equal @records[counter]['n'], record['n']
|
306
|
+
counter += 1
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
217
310
|
test 'each' do
|
218
311
|
i = 0
|
219
312
|
@es.each { |time, record|
|
data/test/test_event_router.rb
CHANGED
@@ -9,6 +9,7 @@ class EventRouterTest < ::Test::Unit::TestCase
|
|
9
9
|
teardown do
|
10
10
|
@output = nil
|
11
11
|
@filter = nil
|
12
|
+
@compat_filter = nil
|
12
13
|
@error_output = nil
|
13
14
|
@emit_handler = nil
|
14
15
|
@default_collector = nil
|
@@ -22,6 +23,10 @@ class EventRouterTest < ::Test::Unit::TestCase
|
|
22
23
|
@filter ||= FluentTestFilter.new
|
23
24
|
end
|
24
25
|
|
26
|
+
def compat_filter
|
27
|
+
@compat_filter ||= FluentCompatTestFilter.new
|
28
|
+
end
|
29
|
+
|
25
30
|
def error_output
|
26
31
|
@error_output ||= FluentTestErrorOutput.new
|
27
32
|
end
|
@@ -107,16 +112,20 @@ class EventRouterTest < ::Test::Unit::TestCase
|
|
107
112
|
@pipeline.set_output(output)
|
108
113
|
end
|
109
114
|
|
110
|
-
|
111
|
-
|
115
|
+
data('Filter plugin' => 'filter',
|
116
|
+
'Compat::Filter plugin' => 'compat_filter')
|
117
|
+
test 'set one filer' do |filter_type|
|
118
|
+
@pipeline.add_filter(filter_type == 'filter' ? filter : compat_filter)
|
112
119
|
@pipeline.emit_events('test', @es)
|
113
120
|
assert_equal 1, output.events.size
|
114
121
|
assert_equal 'value', output.events['test'].first['key']
|
115
122
|
assert_equal 0, output.events['test'].first['__test__']
|
116
123
|
end
|
117
124
|
|
118
|
-
|
119
|
-
|
125
|
+
data('Filter plugin' => 'filter',
|
126
|
+
'Compat::Filter plugin' => 'compat_filter')
|
127
|
+
test 'set one filer with multi events' do |filter_type|
|
128
|
+
@pipeline.add_filter(filter_type == 'filter' ? filter : compat_filter)
|
120
129
|
@pipeline.emit_events('test', events)
|
121
130
|
assert_equal 1, output.events.size
|
122
131
|
assert_equal 5, output.events['test'].size
|
data/test/test_event_time.rb
CHANGED
@@ -45,21 +45,18 @@ class EventTimeTest < Test::Unit::TestCase
|
|
45
45
|
|
46
46
|
test 'JSON.dump' do
|
47
47
|
time = Fluent::EventTime.new(100)
|
48
|
-
assert_equal('100', JSON.dump(time))
|
49
48
|
assert_equal('{"time":100}', JSON.dump({'time' => time}))
|
50
49
|
assert_equal('["tag",100,{"key":"value"}]', JSON.dump(["tag", time, {"key" => "value"}]))
|
51
50
|
end
|
52
51
|
|
53
52
|
test 'Oj.dump' do
|
54
53
|
time = Fluent::EventTime.new(100)
|
55
|
-
assert_equal('100', Oj.dump(time, mode: :compat))
|
56
54
|
assert_equal('{"time":100}', Oj.dump({'time' => time}, mode: :compat))
|
57
55
|
assert_equal('["tag",100,{"key":"value"}]', Oj.dump(["tag", time, {"key" => "value"}], mode: :compat))
|
58
56
|
end
|
59
57
|
|
60
58
|
test 'Yajl.dump' do
|
61
59
|
time = Fluent::EventTime.new(100)
|
62
|
-
assert_equal('100', Yajl.dump(time))
|
63
60
|
assert_equal('{"time":100}', Yajl.dump({'time' => time}))
|
64
61
|
assert_equal('["tag",100,{"key":"value"}]', Yajl.dump(["tag", time, {"key" => "value"}]))
|
65
62
|
end
|
data/test/test_formatter.rb
CHANGED
@@ -5,28 +5,12 @@ require 'fluent/formatter'
|
|
5
5
|
module FormatterTest
|
6
6
|
include Fluent
|
7
7
|
|
8
|
-
def time2str(time, localtime = false, format = nil)
|
9
|
-
if format
|
10
|
-
if localtime
|
11
|
-
Time.at(time).strftime(format)
|
12
|
-
else
|
13
|
-
Time.at(time).utc.strftime(format)
|
14
|
-
end
|
15
|
-
else
|
16
|
-
if localtime
|
17
|
-
Time.at(time).iso8601
|
18
|
-
else
|
19
|
-
Time.at(time).utc.iso8601
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
8
|
def tag
|
25
9
|
'tag'
|
26
10
|
end
|
27
11
|
|
28
12
|
def record
|
29
|
-
{'message' => 'awesome'}
|
13
|
+
{'message' => 'awesome', 'greeting' => 'hello'}
|
30
14
|
end
|
31
15
|
|
32
16
|
def with_timezone(tz)
|
@@ -137,36 +121,6 @@ module FormatterTest
|
|
137
121
|
|
138
122
|
assert_equal("#{Yajl.dump(record)}\n", formatted)
|
139
123
|
end
|
140
|
-
|
141
|
-
data('oj' => 'oj', 'yajl' => 'yajl')
|
142
|
-
def test_format_with_include_tag(data)
|
143
|
-
@formatter.configure('include_tag_key' => 'true', 'tag_key' => 'foo', 'json_parser' => data)
|
144
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
145
|
-
|
146
|
-
r = record
|
147
|
-
r['foo'] = tag
|
148
|
-
assert_equal("#{Yajl.dump(r)}\n", formatted)
|
149
|
-
end
|
150
|
-
|
151
|
-
data('oj' => 'oj', 'yajl' => 'yajl')
|
152
|
-
def test_format_with_include_time(data)
|
153
|
-
@formatter.configure('include_time_key' => 'true', 'localtime' => '', 'json_parser' => data)
|
154
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
155
|
-
|
156
|
-
r = record
|
157
|
-
r['time'] = time2str(@time, true)
|
158
|
-
assert_equal("#{Yajl.dump(r)}\n", formatted)
|
159
|
-
end
|
160
|
-
|
161
|
-
data('oj' => 'oj', 'yajl' => 'yajl')
|
162
|
-
def test_format_with_include_time_as_number(data)
|
163
|
-
@formatter.configure('include_time_key' => 'true', 'time_as_epoch' => 'true', 'time_key' => 'epoch', 'json_parser' => data)
|
164
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
165
|
-
|
166
|
-
r = record
|
167
|
-
r['epoch'] = @time
|
168
|
-
assert_equal("#{Yajl.dump(r)}\n", formatted)
|
169
|
-
end
|
170
124
|
end
|
171
125
|
|
172
126
|
class MessagePackFormatterTest < ::Test::Unit::TestCase
|
@@ -183,33 +137,6 @@ module FormatterTest
|
|
183
137
|
|
184
138
|
assert_equal(record.to_msgpack, formatted)
|
185
139
|
end
|
186
|
-
|
187
|
-
def test_format_with_include_tag
|
188
|
-
@formatter.configure('include_tag_key' => 'true', 'tag_key' => 'foo')
|
189
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
190
|
-
|
191
|
-
r = record
|
192
|
-
r['foo'] = tag
|
193
|
-
assert_equal(r.to_msgpack, formatted)
|
194
|
-
end
|
195
|
-
|
196
|
-
def test_format_with_include_time
|
197
|
-
@formatter.configure('include_time_key' => 'true', 'localtime' => '')
|
198
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
199
|
-
|
200
|
-
r = record
|
201
|
-
r['time'] = time2str(@time, true)
|
202
|
-
assert_equal(r.to_msgpack, formatted)
|
203
|
-
end
|
204
|
-
|
205
|
-
def test_format_with_include_time_as_number
|
206
|
-
@formatter.configure('include_time_key' => 'true', 'time_as_epoch' => 'true', 'time_key' => 'epoch')
|
207
|
-
formatted = @formatter.format(tag, @time, record.dup)
|
208
|
-
|
209
|
-
r = record
|
210
|
-
r['epoch'] = @time
|
211
|
-
assert_equal(r.to_msgpack, formatted)
|
212
|
-
end
|
213
140
|
end
|
214
141
|
|
215
142
|
class LabeledTSVFormatterTest < ::Test::Unit::TestCase
|
@@ -237,32 +164,17 @@ module FormatterTest
|
|
237
164
|
@formatter.configure({})
|
238
165
|
formatted = @formatter.format(tag, @time, record)
|
239
166
|
|
240
|
-
assert_equal("message:awesome\n", formatted)
|
241
|
-
end
|
242
|
-
|
243
|
-
def test_format_with_tag
|
244
|
-
@formatter.configure('include_tag_key' => 'true')
|
245
|
-
formatted = @formatter.format(tag, @time, record)
|
246
|
-
|
247
|
-
assert_equal("message:awesome\ttag:tag\n", formatted)
|
248
|
-
end
|
249
|
-
|
250
|
-
def test_format_with_time
|
251
|
-
@formatter.configure('include_time_key' => 'true', 'time_format' => '%Y')
|
252
|
-
formatted = @formatter.format(tag, @time, record)
|
253
|
-
|
254
|
-
assert_equal("message:awesome\ttime:#{Time.now.year}\n", formatted)
|
167
|
+
assert_equal("message:awesome\tgreeting:hello\n", formatted)
|
255
168
|
end
|
256
169
|
|
257
170
|
def test_format_with_customized_delimiters
|
258
171
|
@formatter.configure(
|
259
|
-
'include_tag_key' => 'true',
|
260
172
|
'delimiter' => ',',
|
261
173
|
'label_delimiter' => '=',
|
262
174
|
)
|
263
175
|
formatted = @formatter.format(tag, @time, record)
|
264
176
|
|
265
|
-
assert_equal("message=awesome,
|
177
|
+
assert_equal("message=awesome,greeting=hello\n", formatted)
|
266
178
|
end
|
267
179
|
end
|
268
180
|
|
@@ -273,11 +185,11 @@ module FormatterTest
|
|
273
185
|
@formatter = TextFormatter::CsvFormatter.new
|
274
186
|
@time = Engine.now
|
275
187
|
end
|
276
|
-
|
188
|
+
|
277
189
|
def test_config_params
|
278
190
|
assert_equal ',', @formatter.delimiter
|
279
191
|
assert_equal true, @formatter.force_quotes
|
280
|
-
|
192
|
+
assert_nil @formatter.fields
|
281
193
|
end
|
282
194
|
|
283
195
|
data(
|
@@ -286,8 +198,9 @@ module FormatterTest
|
|
286
198
|
'pipe' => ['|', '|'])
|
287
199
|
def test_config_params_with_customized_delimiters(data)
|
288
200
|
expected, target = data
|
289
|
-
@formatter.configure('delimiter' => target)
|
201
|
+
@formatter.configure('delimiter' => target, 'fields' => 'a,b,c')
|
290
202
|
assert_equal expected, @formatter.delimiter
|
203
|
+
assert_equal ['a', 'b', 'c'], @formatter.fields
|
291
204
|
end
|
292
205
|
|
293
206
|
def test_format
|
@@ -299,32 +212,6 @@ module FormatterTest
|
|
299
212
|
assert_equal("\"awesome\",\"awesome2\"\n", formatted)
|
300
213
|
end
|
301
214
|
|
302
|
-
def test_format_with_tag
|
303
|
-
@formatter.configure(
|
304
|
-
'fields' => 'tag,message,message2',
|
305
|
-
'include_tag_key' => 'true'
|
306
|
-
)
|
307
|
-
formatted = @formatter.format(tag, @time, {
|
308
|
-
'message' => 'awesome',
|
309
|
-
'message2' => 'awesome2'
|
310
|
-
})
|
311
|
-
assert_equal("\"tag\",\"awesome\",\"awesome2\"\n", formatted)
|
312
|
-
end
|
313
|
-
|
314
|
-
def test_format_with_time
|
315
|
-
@formatter.configure(
|
316
|
-
'fields' => 'time,message,message2',
|
317
|
-
'include_time_key' => 'true',
|
318
|
-
'time_format' => '%Y'
|
319
|
-
)
|
320
|
-
formatted = @formatter.format(tag, @time, {
|
321
|
-
'message' => 'awesome',
|
322
|
-
'message2' => 'awesome2'
|
323
|
-
})
|
324
|
-
assert_equal("\"#{Time.now.year}\",\"awesome\",\"awesome2\"\n",
|
325
|
-
formatted)
|
326
|
-
end
|
327
|
-
|
328
215
|
def test_format_with_customized_delimiters
|
329
216
|
@formatter.configure(
|
330
217
|
'fields' => 'message,message2',
|
@@ -429,48 +316,4 @@ module FormatterTest
|
|
429
316
|
$LOAD_PATH.shift
|
430
317
|
end
|
431
318
|
end
|
432
|
-
|
433
|
-
class TimeConfigTest < ::Test::Unit::TestCase
|
434
|
-
include FormatterTest
|
435
|
-
|
436
|
-
def setup
|
437
|
-
@formatter = TextFormatter::LabeledTSVFormatter.new
|
438
|
-
@time = Time.new(2014, 9, 27, 0, 0, 0, 0).to_i
|
439
|
-
end
|
440
|
-
|
441
|
-
def format(conf)
|
442
|
-
@formatter.configure({'include_time_key' => true}.merge(conf))
|
443
|
-
formatted = @formatter.format("tag", @time, {})
|
444
|
-
# Drop the leading "time:" and the trailing "\n".
|
445
|
-
formatted[5..-2]
|
446
|
-
end
|
447
|
-
|
448
|
-
def test_none
|
449
|
-
with_timezone("UTC-01") do
|
450
|
-
# 'localtime' is true by default.
|
451
|
-
assert_equal("2014-09-27T01:00:00+01:00", format({}))
|
452
|
-
end
|
453
|
-
end
|
454
|
-
|
455
|
-
def test_utc
|
456
|
-
with_timezone("UTC-01") do
|
457
|
-
# 'utc' takes precedence over 'localtime'.
|
458
|
-
assert_equal("2014-09-27T00:00:00Z", format("utc" => true))
|
459
|
-
end
|
460
|
-
end
|
461
|
-
|
462
|
-
def test_timezone
|
463
|
-
with_timezone("UTC-01") do
|
464
|
-
# 'timezone' takes precedence over 'localtime'.
|
465
|
-
assert_equal("2014-09-27T02:00:00+02:00", format("timezone" => "+02"))
|
466
|
-
end
|
467
|
-
end
|
468
|
-
|
469
|
-
def test_utc_timezone
|
470
|
-
with_timezone("UTC-01") do
|
471
|
-
# 'timezone' takes precedence over 'utc'.
|
472
|
-
assert_equal("2014-09-27T09:00:00+09:00", format("utc" => true, "timezone" => "Asia/Tokyo"))
|
473
|
-
end
|
474
|
-
end
|
475
|
-
end
|
476
319
|
end
|