fluentd 0.14.17-x64-mingw32 → 1.3.1-x64-mingw32
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/.travis.yml +16 -5
- data/ADOPTERS.md +5 -0
- data/{ChangeLog → CHANGELOG.md} +495 -6
- data/CONTRIBUTING.md +5 -2
- data/GOVERNANCE.md +55 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +7 -5
- data/README.md +17 -10
- data/bin/fluent-ca-generate +6 -0
- data/example/counter.conf +18 -0
- data/example/secondary_file.conf +3 -2
- data/fluentd.gemspec +3 -3
- data/lib/fluent/agent.rb +1 -1
- data/lib/fluent/command/binlog_reader.rb +11 -2
- data/lib/fluent/command/ca_generate.rb +181 -0
- data/lib/fluent/command/cat.rb +28 -15
- data/lib/fluent/command/debug.rb +4 -4
- data/lib/fluent/command/fluentd.rb +2 -2
- data/lib/fluent/command/plugin_config_formatter.rb +24 -2
- data/lib/fluent/command/plugin_generator.rb +26 -8
- data/lib/fluent/config/configure_proxy.rb +7 -1
- data/lib/fluent/config/dsl.rb +8 -5
- data/lib/fluent/config/element.rb +5 -0
- data/lib/fluent/config/literal_parser.rb +7 -1
- data/lib/fluent/config/types.rb +28 -2
- data/lib/fluent/config/v1_parser.rb +1 -2
- data/lib/fluent/configurable.rb +1 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/counter/base_socket.rb +46 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/env.rb +1 -0
- data/lib/fluent/event_router.rb +1 -1
- data/lib/fluent/log.rb +119 -29
- data/lib/fluent/plugin/base.rb +12 -0
- data/lib/fluent/plugin/buf_file.rb +20 -16
- data/lib/fluent/plugin/buffer.rb +130 -32
- data/lib/fluent/plugin/buffer/file_chunk.rb +23 -4
- data/lib/fluent/plugin/compressable.rb +1 -1
- data/lib/fluent/plugin/filter_grep.rb +135 -21
- data/lib/fluent/plugin/filter_parser.rb +13 -2
- data/lib/fluent/plugin/filter_record_transformer.rb +16 -14
- data/lib/fluent/plugin/formatter_stdout.rb +3 -2
- data/lib/fluent/plugin/formatter_tsv.rb +5 -1
- data/lib/fluent/plugin/in_debug_agent.rb +8 -1
- data/lib/fluent/plugin/in_forward.rb +1 -1
- data/lib/fluent/plugin/in_http.rb +84 -3
- data/lib/fluent/plugin/in_monitor_agent.rb +7 -1
- data/lib/fluent/plugin/in_syslog.rb +31 -10
- data/lib/fluent/plugin/in_tail.rb +142 -53
- data/lib/fluent/plugin/in_tcp.rb +5 -6
- data/lib/fluent/plugin/in_udp.rb +6 -2
- data/lib/fluent/plugin/in_unix.rb +1 -1
- data/lib/fluent/plugin/multi_output.rb +1 -0
- data/lib/fluent/plugin/out_copy.rb +25 -2
- data/lib/fluent/plugin/out_file.rb +26 -7
- data/lib/fluent/plugin/out_forward.rb +81 -42
- data/lib/fluent/plugin/out_secondary_file.rb +2 -2
- data/lib/fluent/plugin/out_stdout.rb +0 -1
- data/lib/fluent/plugin/out_stream.rb +1 -1
- data/lib/fluent/plugin/output.rb +221 -57
- data/lib/fluent/plugin/parser_apache.rb +1 -1
- data/lib/fluent/plugin/parser_apache2.rb +5 -1
- data/lib/fluent/plugin/parser_apache_error.rb +1 -1
- data/lib/fluent/plugin/parser_json.rb +10 -3
- data/lib/fluent/plugin/parser_ltsv.rb +7 -0
- data/lib/fluent/plugin/parser_multiline.rb +2 -1
- data/lib/fluent/plugin/parser_nginx.rb +1 -1
- data/lib/fluent/plugin/parser_none.rb +1 -0
- data/lib/fluent/plugin/parser_regexp.rb +15 -14
- data/lib/fluent/plugin/parser_syslog.rb +9 -5
- data/lib/fluent/plugin_helper.rb +2 -0
- data/lib/fluent/plugin_helper/cert_option.rb +28 -9
- data/lib/fluent/plugin_helper/compat_parameters.rb +3 -1
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_loop.rb +9 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
- data/lib/fluent/plugin_helper/retry_state.rb +15 -7
- data/lib/fluent/plugin_helper/server.rb +87 -25
- data/lib/fluent/plugin_helper/socket_option.rb +5 -2
- data/lib/fluent/plugin_helper/timer.rb +8 -7
- data/lib/fluent/root_agent.rb +18 -9
- data/lib/fluent/supervisor.rb +63 -23
- data/lib/fluent/system_config.rb +30 -2
- data/lib/fluent/test/helpers.rb +1 -1
- data/lib/fluent/time.rb +15 -7
- data/lib/fluent/timezone.rb +26 -2
- data/lib/fluent/version.rb +1 -1
- data/templates/new_gem/README.md.erb +2 -2
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +1 -1
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +1 -1
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +1 -1
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +4 -4
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_fluentd.rb +2 -2
- data/test/command/test_plugin_config_formatter.rb +8 -7
- data/test/command/test_plugin_generator.rb +65 -39
- data/test/config/test_config_parser.rb +7 -2
- data/test/config/test_configurable.rb +7 -2
- data/test/config/test_configure_proxy.rb +41 -3
- data/test/config/test_dsl.rb +10 -10
- data/test/config/test_element.rb +10 -0
- data/test/config/test_literal_parser.rb +8 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_system_config.rb +19 -1
- data/test/config/test_types.rb +37 -0
- data/test/counter/test_client.rb +559 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/plugin/test_buf_file.rb +124 -0
- data/test/plugin/test_buffer.rb +3 -2
- data/test/plugin/test_filter_grep.rb +580 -2
- data/test/plugin/test_filter_parser.rb +33 -2
- data/test/plugin/test_filter_record_transformer.rb +22 -1
- data/test/plugin/test_formatter_ltsv.rb +3 -0
- data/test/plugin/test_formatter_tsv.rb +68 -0
- data/test/plugin/test_in_debug_agent.rb +21 -0
- data/test/plugin/test_in_exec.rb +3 -5
- data/test/plugin/test_in_http.rb +178 -0
- data/test/plugin/test_in_monitor_agent.rb +1 -1
- data/test/plugin/test_in_syslog.rb +64 -0
- data/test/plugin/test_in_tail.rb +116 -6
- data/test/plugin/test_in_tcp.rb +21 -0
- data/test/plugin/test_in_udp.rb +78 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_out_copy.rb +31 -0
- data/test/plugin/test_out_file.rb +108 -2
- data/test/plugin/test_out_forward.rb +195 -2
- data/test/plugin/test_out_secondary_file.rb +14 -0
- data/test/plugin/test_output.rb +159 -45
- data/test/plugin/test_output_as_buffered.rb +19 -0
- data/test/plugin/test_output_as_buffered_backup.rb +307 -0
- data/test/plugin/test_output_as_buffered_retries.rb +70 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +1 -1
- data/test/plugin/test_parser_apache2.rb +1 -0
- data/test/plugin/test_parser_labeled_tsv.rb +17 -0
- data/test/plugin/test_parser_nginx.rb +40 -0
- data/test/plugin/test_parser_regexp.rb +6 -7
- data/test/plugin/test_parser_syslog.rb +155 -5
- data/test/plugin_helper/test_child_process.rb +4 -4
- data/test/plugin_helper/test_compat_parameters.rb +22 -0
- data/test/plugin_helper/test_record_accessor.rb +197 -0
- data/test/plugin_helper/test_retry_state.rb +20 -0
- data/test/plugin_helper/test_server.rb +30 -2
- data/test/test_config.rb +3 -3
- data/test/test_configdsl.rb +2 -2
- data/test/test_log.rb +51 -1
- data/test/test_root_agent.rb +33 -0
- data/test/test_supervisor.rb +105 -0
- metadata +68 -8
- data/COPYING +0 -14
@@ -209,10 +209,13 @@ class ParserFilterTest < Test::Unit::TestCase
|
|
209
209
|
|
210
210
|
end
|
211
211
|
|
212
|
-
|
212
|
+
data(:keep_key_name => false,
|
213
|
+
:remove_key_name => true)
|
214
|
+
def test_filter_with_reserved_data(remove_key_name)
|
213
215
|
d1 = create_driver(%[
|
214
216
|
key_name data
|
215
217
|
reserve_data yes
|
218
|
+
remove_key_name_field #{remove_key_name}
|
216
219
|
<parse>
|
217
220
|
@type regexp
|
218
221
|
expression /^(?<x>\\d)(?<y>\\d) (?<t>.+)$/
|
@@ -230,6 +233,7 @@ class ParserFilterTest < Test::Unit::TestCase
|
|
230
233
|
d2 = create_driver(%[
|
231
234
|
key_name data
|
232
235
|
reserve_data yes
|
236
|
+
remove_key_name_field #{remove_key_name}
|
233
237
|
<parse>
|
234
238
|
@type json
|
235
239
|
</parse>
|
@@ -244,7 +248,11 @@ class ParserFilterTest < Test::Unit::TestCase
|
|
244
248
|
|
245
249
|
first = filtered[0]
|
246
250
|
assert_equal_event_time time, first[0]
|
247
|
-
|
251
|
+
if remove_key_name
|
252
|
+
assert_not_include first[1], 'data'
|
253
|
+
else
|
254
|
+
assert_equal '{"xxx":"first","yyy":"second"}', first[1]['data']
|
255
|
+
end
|
248
256
|
assert_equal 'first', first[1]['xxx']
|
249
257
|
assert_equal 'second', first[1]['yyy']
|
250
258
|
|
@@ -390,6 +398,29 @@ class ParserFilterTest < Test::Unit::TestCase
|
|
390
398
|
assert_equal 'value"ThreeYes!', first[1]['key3']
|
391
399
|
end
|
392
400
|
|
401
|
+
def test_filter_with_nested_record
|
402
|
+
d = create_driver(%[
|
403
|
+
key_name $.data.log
|
404
|
+
<parse>
|
405
|
+
@type csv
|
406
|
+
keys key1,key2,key3
|
407
|
+
</parse>
|
408
|
+
])
|
409
|
+
time = @default_time.to_i
|
410
|
+
d.run do
|
411
|
+
d.feed(@tag, time, {'data' => {'log' => 'value1,"value2","value""ThreeYes!"'}, 'xxx' => 'x', 'yyy' => 'y'})
|
412
|
+
end
|
413
|
+
filtered = d.filtered
|
414
|
+
assert_equal 1, filtered.length
|
415
|
+
|
416
|
+
first = filtered[0]
|
417
|
+
assert_equal time, first[0]
|
418
|
+
assert_nil first[1]['data']
|
419
|
+
assert_equal 'value1', first[1]['key1']
|
420
|
+
assert_equal 'value2', first[1]['key2']
|
421
|
+
assert_equal 'value"ThreeYes!', first[1]['key3']
|
422
|
+
end
|
423
|
+
|
393
424
|
CONFIG_HASH_VALUE_FIELD = %[
|
394
425
|
key_name data
|
395
426
|
hash_value_field parsed
|
@@ -44,7 +44,7 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
44
44
|
d = create_driver(config)
|
45
45
|
d.run {
|
46
46
|
msgs.each { |msg|
|
47
|
-
d.feed(@tag, @time, {'foo' => 'bar', 'message' => msg})
|
47
|
+
d.feed(@tag, @time, {'foo' => 'bar', 'message' => msg, 'nest' => {'k1' => 'v1', 'k2' => 'v2'}})
|
48
48
|
}
|
49
49
|
}
|
50
50
|
d.filtered
|
@@ -68,6 +68,7 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
68
68
|
assert_equal(@tag, r['tag'])
|
69
69
|
assert_equal(Time.at(@time).localtime.to_s, r['time'])
|
70
70
|
assert_equal("#{@hostname} #{@tag_parts[-1]} #{msgs[i]}", r['message'])
|
71
|
+
assert_equal({'k1' => 'v1', 'k2' => 'v2'}, r['nest'])
|
71
72
|
end
|
72
73
|
end
|
73
74
|
|
@@ -83,6 +84,14 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
87
|
+
test 'remove_keys with nested key' do
|
88
|
+
config = CONFIG + %[remove_keys $.nest.k1]
|
89
|
+
filtered = filter(config)
|
90
|
+
filtered.each_with_index do |(_t, r), i|
|
91
|
+
assert_not_include(r['nest'], 'k1')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
86
95
|
test 'renew_record' do
|
87
96
|
config = CONFIG + %[renew_record true]
|
88
97
|
msgs = ['1', '2']
|
@@ -137,6 +146,18 @@ class RecordTransformerFilterTest < Test::Unit::TestCase
|
|
137
146
|
end
|
138
147
|
end
|
139
148
|
|
149
|
+
test 'keep_keys that are not present in the original record should not be included in the result record' do
|
150
|
+
config = %[renew_record true\nkeep_keys foo, bar, baz, message]
|
151
|
+
msgs = ['1', '2', nil]
|
152
|
+
filtered = filter(config, msgs)
|
153
|
+
filtered.each_with_index do |(_t, r), i|
|
154
|
+
assert_equal('bar', r['foo'])
|
155
|
+
assert_equal(msgs[i], r['message'])
|
156
|
+
assert_equal(false, r.has_key?('bar'))
|
157
|
+
assert_equal(false, r.has_key?('baz'))
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
140
161
|
test 'enable_ruby' do
|
141
162
|
config = %[
|
142
163
|
enable_ruby yes
|
@@ -23,14 +23,17 @@ class LabeledTSVFormatterTest < ::Test::Unit::TestCase
|
|
23
23
|
d = create_driver
|
24
24
|
assert_equal "\t", d.instance.delimiter
|
25
25
|
assert_equal ":", d.instance.label_delimiter
|
26
|
+
assert_equal true, d.instance.add_newline
|
26
27
|
|
27
28
|
d = create_driver(
|
28
29
|
'delimiter' => ',',
|
29
30
|
'label_delimiter' => '=',
|
31
|
+
'add_newline' => false,
|
30
32
|
)
|
31
33
|
|
32
34
|
assert_equal ",", d.instance.delimiter
|
33
35
|
assert_equal "=", d.instance.label_delimiter
|
36
|
+
assert_equal false, d.instance.add_newline
|
34
37
|
end
|
35
38
|
|
36
39
|
def test_format
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'fluent/test/driver/formatter'
|
3
|
+
require 'fluent/plugin/formatter_tsv'
|
4
|
+
|
5
|
+
class TSVFormatterTest < ::Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@time = event_time
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_driver(conf = "")
|
11
|
+
Fluent::Test::Driver::Formatter.new(Fluent::Plugin::TSVFormatter).configure(conf)
|
12
|
+
end
|
13
|
+
|
14
|
+
def tag
|
15
|
+
"tag"
|
16
|
+
end
|
17
|
+
|
18
|
+
def record
|
19
|
+
{'message' => 'awesome', 'greeting' => 'hello'}
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_config_params
|
23
|
+
d = create_driver(
|
24
|
+
'keys' => 'message,greeting',
|
25
|
+
)
|
26
|
+
assert_equal ["message", "greeting"], d.instance.keys
|
27
|
+
assert_equal "\t", d.instance.delimiter
|
28
|
+
assert_equal true, d.instance.add_newline
|
29
|
+
|
30
|
+
d = create_driver(
|
31
|
+
'keys' => 'message,greeting',
|
32
|
+
'delimiter' => ',',
|
33
|
+
'add_newline' => false,
|
34
|
+
)
|
35
|
+
assert_equal ["message", "greeting"], d.instance.keys
|
36
|
+
assert_equal ",", d.instance.delimiter
|
37
|
+
assert_equal false, d.instance.add_newline
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_format
|
41
|
+
d = create_driver(
|
42
|
+
'keys' => 'message,greeting',
|
43
|
+
)
|
44
|
+
formatted = d.instance.format(tag, @time, record)
|
45
|
+
|
46
|
+
assert_equal("awesome\thello\n", formatted)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_format_without_newline
|
50
|
+
d = create_driver(
|
51
|
+
'keys' => 'message,greeting',
|
52
|
+
'add_newline' => false,
|
53
|
+
)
|
54
|
+
formatted = d.instance.format(tag, @time, record)
|
55
|
+
|
56
|
+
assert_equal("awesome\thello", formatted)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_format_with_customized_delimiters
|
60
|
+
d = create_driver(
|
61
|
+
'keys' => 'message,greeting',
|
62
|
+
'delimiter' => ',',
|
63
|
+
)
|
64
|
+
formatted = d.instance.format(tag, @time, record)
|
65
|
+
|
66
|
+
assert_equal("awesome,hello\n", formatted)
|
67
|
+
end
|
68
|
+
end
|
@@ -25,4 +25,25 @@ class DebugAgentInputTest < Test::Unit::TestCase
|
|
25
25
|
create_driver %[unix_path #{TMP_DIR}/does_not_exist/test_path]
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
def test_multi_worker_environment_with_port
|
30
|
+
Fluent::SystemConfig.overwrite_system_config('workers' => 4) do
|
31
|
+
d = Fluent::Test::Driver::Input.new(Fluent::Plugin::DebugAgentInput)
|
32
|
+
d.instance.instance_eval { @_fluentd_worker_id = 2 }
|
33
|
+
d.configure('port 24230')
|
34
|
+
|
35
|
+
assert_true d.instance.multi_workers_ready?
|
36
|
+
assert_equal(24232, d.instance.instance_variable_get(:@port))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_multi_worker_environment_with_unix_path
|
41
|
+
Fluent::SystemConfig.overwrite_system_config('workers' => 4) do
|
42
|
+
d = Fluent::Test::Driver::Input.new(Fluent::Plugin::DebugAgentInput)
|
43
|
+
d.instance.instance_eval { @_fluentd_worker_id = 2 }
|
44
|
+
d.configure("unix_path #{TMP_DIR}/test_path")
|
45
|
+
|
46
|
+
assert_false d.instance.multi_workers_ready?
|
47
|
+
end
|
48
|
+
end
|
28
49
|
end
|
data/test/plugin/test_in_exec.rb
CHANGED
@@ -131,9 +131,7 @@ EOC
|
|
131
131
|
d = create_driver REGEXP_CONFIG
|
132
132
|
assert{ d.instance.parser.is_a? Fluent::Plugin::RegexpParser }
|
133
133
|
assert_equal "regex_tag", d.instance.tag
|
134
|
-
expression =
|
135
|
-
(?<time>[^\]]*) (?<message>[^ ]*)
|
136
|
-
EXP
|
134
|
+
expression = /(?<time>[^\]]*) (?<message>[^ ]*)/
|
137
135
|
assert_equal expression, d.instance.parser.expression
|
138
136
|
assert_nil d.instance.extract_config
|
139
137
|
end
|
@@ -194,8 +192,8 @@ EXP
|
|
194
192
|
test 'configure_with_regexp' do
|
195
193
|
d = create_driver REGEXP_CONFIG_COMPAT
|
196
194
|
assert{ d.instance.parser.is_a? Fluent::Plugin::RegexpParser }
|
197
|
-
assert_equal
|
198
|
-
assert_equal
|
195
|
+
assert_equal(/(?<time>[^\]]*) (?<message>[^ ]*)/, d.instance.parser.expression)
|
196
|
+
assert_equal('regex_tag', d.instance.tag)
|
199
197
|
end
|
200
198
|
end
|
201
199
|
|
data/test/plugin/test_in_http.rb
CHANGED
@@ -137,6 +137,54 @@ class HttpInputTest < Test::Unit::TestCase
|
|
137
137
|
assert_equal_event_time time, d.events[1][1]
|
138
138
|
end
|
139
139
|
|
140
|
+
def test_multi_json_with_time_field
|
141
|
+
d = create_driver
|
142
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
143
|
+
time_i = time.to_i
|
144
|
+
time_f = time.to_f
|
145
|
+
|
146
|
+
records = [{"a" => 1, 'time' => time_i},{"a" => 2, 'time' => time_f}]
|
147
|
+
events = [
|
148
|
+
["tag1", time, {'a' => 1}],
|
149
|
+
["tag1", time, {'a' => 2}],
|
150
|
+
]
|
151
|
+
tag = "tag1"
|
152
|
+
res_codes = []
|
153
|
+
d.run(expect_records: 2, timeout: 5) do
|
154
|
+
res = post("/#{tag}", {"json" => records.to_json})
|
155
|
+
res_codes << res.code
|
156
|
+
end
|
157
|
+
assert_equal ["200"], res_codes
|
158
|
+
assert_equal events, d.events
|
159
|
+
assert_instance_of Fluent::EventTime, d.events[0][1]
|
160
|
+
assert_instance_of Fluent::EventTime, d.events[1][1]
|
161
|
+
assert_equal_event_time time, d.events[0][1]
|
162
|
+
assert_equal_event_time time, d.events[1][1]
|
163
|
+
end
|
164
|
+
|
165
|
+
def test_multi_json_with_nonexistent_time_key
|
166
|
+
d = create_driver(CONFIG + %[
|
167
|
+
<parse>
|
168
|
+
time_key missing
|
169
|
+
</parse>
|
170
|
+
])
|
171
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
172
|
+
time_i = time.to_i
|
173
|
+
time_f = time.to_f
|
174
|
+
|
175
|
+
records = [{"a" => 1, 'time' => time_i},{"a" => 2, 'time' => time_f}]
|
176
|
+
tag = "tag1"
|
177
|
+
res_codes = []
|
178
|
+
d.run(expect_records: 2, timeout: 5) do
|
179
|
+
res = post("/#{tag}", {"json" => records.to_json})
|
180
|
+
res_codes << res.code
|
181
|
+
end
|
182
|
+
assert_equal ["200"], res_codes
|
183
|
+
assert_equal 2, d.events.size
|
184
|
+
assert_not_equal time_i, d.events[0][1].sec # current time is used because "missing" field doesn't exist
|
185
|
+
assert_not_equal time_i, d.events[1][1].sec
|
186
|
+
end
|
187
|
+
|
140
188
|
def test_json_with_add_remote_addr
|
141
189
|
d = create_driver(CONFIG + "add_remote_addr true")
|
142
190
|
time = event_time("2011-01-02 13:14:15 UTC")
|
@@ -322,6 +370,38 @@ class HttpInputTest < Test::Unit::TestCase
|
|
322
370
|
assert include_http_header?(d.events[1][2])
|
323
371
|
end
|
324
372
|
|
373
|
+
def test_multi_json_with_custom_parser
|
374
|
+
d = create_driver(CONFIG + %[
|
375
|
+
<parse>
|
376
|
+
@type json
|
377
|
+
keep_time_key true
|
378
|
+
time_key foo
|
379
|
+
time_format %iso8601
|
380
|
+
</parse>
|
381
|
+
])
|
382
|
+
|
383
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
384
|
+
time_s = Time.at(time).iso8601
|
385
|
+
|
386
|
+
records = [{"foo"=>time_s,"bar"=>"test1"},{"foo"=>time_s,"bar"=>"test2"}]
|
387
|
+
tag = "tag1"
|
388
|
+
res_codes = []
|
389
|
+
|
390
|
+
d.run(expect_records: 2, timeout: 5) do
|
391
|
+
res = post("/#{tag}", records.to_json, {"Content-Type"=>"application/octet-stream"})
|
392
|
+
res_codes << res.code
|
393
|
+
end
|
394
|
+
assert_equal ["200"], res_codes
|
395
|
+
|
396
|
+
assert_equal "tag1", d.events[0][0]
|
397
|
+
assert_equal_event_time time, d.events[0][1]
|
398
|
+
assert_equal d.events[0][2], records[0]
|
399
|
+
|
400
|
+
assert_equal "tag1", d.events[1][0]
|
401
|
+
assert_equal_event_time time, d.events[1][1]
|
402
|
+
assert_equal d.events[1][2], records[1]
|
403
|
+
end
|
404
|
+
|
325
405
|
def test_application_json
|
326
406
|
d = create_driver
|
327
407
|
time = event_time("2011-01-02 13:14:15 UTC")
|
@@ -524,6 +604,91 @@ class HttpInputTest < Test::Unit::TestCase
|
|
524
604
|
assert_equal_event_time time, d.events[1][1]
|
525
605
|
end
|
526
606
|
|
607
|
+
def test_cors_allowed_wildcard
|
608
|
+
d = create_driver(CONFIG + 'cors_allow_origins ["*"]')
|
609
|
+
|
610
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
611
|
+
events = [
|
612
|
+
["tag1", time, {"a"=>1}],
|
613
|
+
]
|
614
|
+
|
615
|
+
d.run do
|
616
|
+
events.each do |tag, time, record|
|
617
|
+
headers = {"Origin" => "http://foo.com"}
|
618
|
+
|
619
|
+
res = post("/#{tag}", {"json" => record.to_json, "time" => time.to_i}, headers)
|
620
|
+
|
621
|
+
assert_equal "200", res.code
|
622
|
+
assert_equal "*", res["Access-Control-Allow-Origin"]
|
623
|
+
end
|
624
|
+
end
|
625
|
+
end
|
626
|
+
|
627
|
+
def test_cors_preflight
|
628
|
+
d = create_driver(CONFIG + 'cors_allow_origins ["*"]')
|
629
|
+
|
630
|
+
d.run do
|
631
|
+
header = {
|
632
|
+
"Origin" => "http://foo.com",
|
633
|
+
"Access-Control-Request-Method" => "POST",
|
634
|
+
"Access-Control-Request-Headers" => "Content-Type",
|
635
|
+
}
|
636
|
+
res = options("/cors.test", {}, header)
|
637
|
+
|
638
|
+
assert_equal "200", res.code
|
639
|
+
assert_equal "*", res["Access-Control-Allow-Origin"]
|
640
|
+
assert_equal "POST", res["Access-Control-Allow-Methods"]
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
644
|
+
def test_content_encoding_gzip
|
645
|
+
d = create_driver
|
646
|
+
|
647
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
648
|
+
events = [
|
649
|
+
["tag1", time, {"a"=>1}],
|
650
|
+
["tag2", time, {"a"=>2}],
|
651
|
+
]
|
652
|
+
res_codes = []
|
653
|
+
res_headers = []
|
654
|
+
|
655
|
+
d.run do
|
656
|
+
events.each do |tag, time, record|
|
657
|
+
header = {'Content-Type'=>'application/json', 'Content-Encoding'=>'gzip'}
|
658
|
+
res = post("/#{tag}?time=#{time}", compress_gzip(record.to_json), header)
|
659
|
+
res_codes << res.code
|
660
|
+
end
|
661
|
+
end
|
662
|
+
assert_equal ["200", "200"], res_codes
|
663
|
+
assert_equal events, d.events
|
664
|
+
assert_equal_event_time time, d.events[0][1]
|
665
|
+
assert_equal_event_time time, d.events[1][1]
|
666
|
+
end
|
667
|
+
|
668
|
+
def test_content_encoding_deflate
|
669
|
+
d = create_driver
|
670
|
+
|
671
|
+
time = event_time("2011-01-02 13:14:15 UTC")
|
672
|
+
events = [
|
673
|
+
["tag1", time, {"a"=>1}],
|
674
|
+
["tag2", time, {"a"=>2}],
|
675
|
+
]
|
676
|
+
res_codes = []
|
677
|
+
res_headers = []
|
678
|
+
|
679
|
+
d.run do
|
680
|
+
events.each do |tag, time, record|
|
681
|
+
header = {'Content-Type'=>'application/msgpack', 'Content-Encoding'=>'deflate'}
|
682
|
+
res = post("/#{tag}?time=#{time}", Zlib.deflate(record.to_msgpack), header)
|
683
|
+
res_codes << res.code
|
684
|
+
end
|
685
|
+
end
|
686
|
+
assert_equal ["200", "200"], res_codes
|
687
|
+
assert_equal events, d.events
|
688
|
+
assert_equal_event_time time, d.events[0][1]
|
689
|
+
assert_equal_event_time time, d.events[1][1]
|
690
|
+
end
|
691
|
+
|
527
692
|
def test_cors_disallowed
|
528
693
|
d = create_driver(CONFIG + "cors_allow_origins [\"http://foo.com\"]")
|
529
694
|
assert_equal ["http://foo.com"], d.instance.cors_allow_origins
|
@@ -596,6 +761,12 @@ class HttpInputTest < Test::Unit::TestCase
|
|
596
761
|
assert_equal $test_in_http_connection_object_ids[0], $test_in_http_connection_object_ids[1]
|
597
762
|
end
|
598
763
|
|
764
|
+
def options(path, params, header = {})
|
765
|
+
http = Net::HTTP.new("127.0.0.1", PORT)
|
766
|
+
req = Net::HTTP::Options.new(path, header)
|
767
|
+
http.request(req)
|
768
|
+
end
|
769
|
+
|
599
770
|
def post(path, params, header = {}, &block)
|
600
771
|
http = Net::HTTP.new("127.0.0.1", PORT)
|
601
772
|
req = Net::HTTP::Post.new(path, header)
|
@@ -614,6 +785,13 @@ class HttpInputTest < Test::Unit::TestCase
|
|
614
785
|
http.request(req)
|
615
786
|
end
|
616
787
|
|
788
|
+
def compress_gzip(data)
|
789
|
+
io = StringIO.new
|
790
|
+
io.binmode
|
791
|
+
Zlib::GzipWriter.wrap(io) { |gz| gz.write data }
|
792
|
+
return io.string
|
793
|
+
end
|
794
|
+
|
617
795
|
def include_http_header?(record)
|
618
796
|
record.keys.find { |header| header.start_with?('HTTP_') }
|
619
797
|
end
|