fluentd 1.11.0-x86-mingw32 → 1.11.5-x86-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/CHANGELOG.md +92 -1
- data/example/copy_roundrobin.conf +3 -3
- data/example/counter.conf +1 -1
- data/example/filter_stdout.conf +2 -2
- data/example/{in_dummy_blocks.conf → in_sample_blocks.conf} +4 -4
- data/example/{in_dummy_with_compression.conf → in_sample_with_compression.conf} +3 -3
- data/example/logevents.conf +5 -5
- data/example/multi_filters.conf +1 -1
- data/example/out_exec_filter.conf +2 -2
- data/example/out_forward.conf +1 -1
- data/example/out_forward_buf_file.conf +1 -1
- data/example/out_forward_client.conf +5 -5
- data/example/out_forward_heartbeat_none.conf +1 -1
- data/example/out_forward_sd.conf +1 -1
- data/example/out_forward_shared_key.conf +2 -2
- data/example/out_forward_tls.conf +1 -1
- data/example/out_forward_users.conf +3 -3
- data/example/out_null.conf +4 -4
- data/example/secondary_file.conf +1 -1
- data/fluentd.gemspec +6 -6
- data/lib/fluent/command/fluentd.rb +11 -0
- data/lib/fluent/log.rb +33 -3
- data/lib/fluent/match.rb +9 -0
- data/lib/fluent/plugin/buffer.rb +49 -40
- data/lib/fluent/plugin/buffer/chunk.rb +2 -1
- data/lib/fluent/plugin/formatter.rb +24 -0
- data/lib/fluent/plugin/formatter_hash.rb +3 -1
- data/lib/fluent/plugin/formatter_json.rb +3 -1
- data/lib/fluent/plugin/formatter_ltsv.rb +3 -1
- data/lib/fluent/plugin/formatter_out_file.rb +3 -1
- data/lib/fluent/plugin/formatter_single_value.rb +3 -1
- data/lib/fluent/plugin/formatter_tsv.rb +3 -1
- data/lib/fluent/plugin/in_dummy.rb +2 -123
- data/lib/fluent/plugin/in_exec.rb +4 -2
- data/lib/fluent/plugin/in_http.rb +148 -77
- data/lib/fluent/plugin/in_sample.rb +141 -0
- data/lib/fluent/plugin/in_tail.rb +2 -2
- data/lib/fluent/plugin/out_http.rb +20 -2
- data/lib/fluent/plugin/output.rb +8 -5
- data/lib/fluent/plugin/parser_json.rb +5 -2
- data/lib/fluent/plugin_helper/cert_option.rb +5 -8
- data/lib/fluent/plugin_helper/child_process.rb +3 -2
- data/lib/fluent/plugin_helper/inject.rb +2 -1
- data/lib/fluent/plugin_helper/socket.rb +1 -1
- data/lib/fluent/supervisor.rb +11 -6
- data/lib/fluent/system_config.rb +2 -1
- data/lib/fluent/version.rb +1 -1
- data/test/command/test_binlog_reader.rb +22 -6
- data/test/plugin/test_buffer.rb +4 -0
- data/test/plugin/test_filter_stdout.rb +6 -1
- data/test/plugin/test_formatter_hash.rb +6 -3
- data/test/plugin/test_formatter_json.rb +14 -4
- data/test/plugin/test_formatter_ltsv.rb +13 -5
- data/test/plugin/test_formatter_out_file.rb +35 -14
- data/test/plugin/test_formatter_single_value.rb +12 -6
- data/test/plugin/test_formatter_tsv.rb +12 -4
- data/test/plugin/test_in_exec.rb +18 -0
- data/test/plugin/test_in_http.rb +57 -0
- data/test/plugin/{test_in_dummy.rb → test_in_sample.rb} +25 -25
- data/test/plugin/test_in_tail.rb +3 -0
- data/test/plugin/test_out_file.rb +23 -18
- data/test/plugin/test_output.rb +12 -0
- data/test/plugin_helper/data/cert/empty.pem +0 -0
- data/test/plugin_helper/test_cert_option.rb +7 -0
- data/test/plugin_helper/test_child_process.rb +15 -0
- data/test/plugin_helper/test_compat_parameters.rb +7 -2
- data/test/plugin_helper/test_http_server_helper.rb +5 -0
- data/test/plugin_helper/test_inject.rb +13 -0
- data/test/plugin_helper/test_server.rb +34 -0
- data/test/plugin_helper/test_socket.rb +8 -0
- data/test/test_formatter.rb +34 -10
- data/test/test_log.rb +44 -0
- data/test/test_match.rb +11 -0
- data/test/test_output.rb +6 -1
- data/test/test_static_config_analysis.rb +2 -2
- data/test/test_supervisor.rb +26 -0
- metadata +21 -18
data/test/plugin/test_output.rb
CHANGED
@@ -378,6 +378,18 @@ class OutputTest < Test::Unit::TestCase
|
|
378
378
|
assert { logs.any? { |log| log.include?("${chunk_id} is not allowed in this plugin") } }
|
379
379
|
end
|
380
380
|
|
381
|
+
test '#extract_placeholders does not log for ${chunk_id} placeholder' do
|
382
|
+
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
|
383
|
+
tmpl = "/mypath/${chunk_id}/tail"
|
384
|
+
t = event_time('2016-04-11 20:30:00 +0900')
|
385
|
+
v = {key1: "value1", key2: "value2"}
|
386
|
+
c = create_chunk(timekey: t, tag: 'fluentd.test.output', variables: v)
|
387
|
+
@i.log.out.logs.clear
|
388
|
+
@i.extract_placeholders(tmpl, c)
|
389
|
+
logs = @i.log.out.logs
|
390
|
+
assert { logs.none? { |log| log.include?("${chunk_id}") } }
|
391
|
+
end
|
392
|
+
|
381
393
|
test '#extract_placeholders logs warn message with not replaced key' do
|
382
394
|
@i.configure(config_element('ROOT', '', {}, [config_element('buffer', '')]))
|
383
395
|
tmpl = "/mypath/${key1}/test"
|
File without changes
|
@@ -15,4 +15,11 @@ class CertOptionPluginHelperTest < Test::Unit::TestCase
|
|
15
15
|
certs = d.cert_option_certificates_from_file("test/plugin_helper/data/cert/cert-with-CRLF.pem")
|
16
16
|
assert_equal(1, certs.length)
|
17
17
|
end
|
18
|
+
|
19
|
+
test 'raise an error for broken certificates_from_file file' do
|
20
|
+
d = Dummy.new
|
21
|
+
assert_raise Fluent::ConfigError do
|
22
|
+
certs = d.cert_option_certificates_from_file("test/plugin_helper/data/cert/empty.pem")
|
23
|
+
end
|
24
|
+
end
|
18
25
|
end
|
@@ -818,5 +818,20 @@ class ChildProcessTest < Test::Unit::TestCase
|
|
818
818
|
end
|
819
819
|
assert File.exist?(@temp_path)
|
820
820
|
end
|
821
|
+
|
822
|
+
test 'execute child process writing data to stdout which is unread' do
|
823
|
+
callback_called = false
|
824
|
+
exit_status = nil
|
825
|
+
prog = "echo writing to stdout"
|
826
|
+
callback = ->(status){ exit_status = status; callback_called = true }
|
827
|
+
Timeout.timeout(TEST_DEADLOCK_TIMEOUT) do
|
828
|
+
@d.child_process_execute(:out_exec_process, prog, stderr: :connect, immediate: true, parallel: true, mode: [], wait_timeout: 1, on_exit_callback: callback)
|
829
|
+
sleep TEST_WAIT_INTERVAL_FOR_BLOCK_RUNNING until callback_called
|
830
|
+
end
|
831
|
+
assert callback_called
|
832
|
+
assert exit_status
|
833
|
+
assert exit_status.success?
|
834
|
+
assert_equal 0, exit_status.exitstatus
|
835
|
+
end
|
821
836
|
end
|
822
837
|
end
|
@@ -10,6 +10,11 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
10
10
|
setup do
|
11
11
|
Fluent::Test.setup
|
12
12
|
@i = nil
|
13
|
+
@default_newline = if Fluent.windows?
|
14
|
+
"\r\n"
|
15
|
+
else
|
16
|
+
"\n"
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
teardown do
|
@@ -226,7 +231,7 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
226
231
|
t = event_time('2016-06-24 16:05:01') # localtime
|
227
232
|
iso8601str = Time.at(t.to_i).iso8601
|
228
233
|
formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
|
229
|
-
assert_equal "value%1,tag%tag.test,time%#{iso8601str}
|
234
|
+
assert_equal "value%1,tag%tag.test,time%#{iso8601str}#{@default_newline}", formatted
|
230
235
|
end
|
231
236
|
|
232
237
|
test 'plugin helper setups time injecting as unix time (integer from epoch)' do
|
@@ -260,7 +265,7 @@ class CompatParameterTest < Test::Unit::TestCase
|
|
260
265
|
t = event_time('2016-06-24 16:05:01') # localtime
|
261
266
|
iso8601str = Time.at(t.to_i).iso8601
|
262
267
|
formatted = @i.f.format('tag.test', t, @i.inject_values_to_record('tag.test', t, {"value" => 1}))
|
263
|
-
assert_equal "value%1,tag%tag.test,time%#{iso8601str}
|
268
|
+
assert_equal "value%1,tag%tag.test,time%#{iso8601str}#{@default_newline}", formatted
|
264
269
|
end
|
265
270
|
end
|
266
271
|
|
@@ -278,6 +278,7 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
278
278
|
driver.http_server_create_https_server(:http_server_helper_test_tls, addr: '127.0.0.1', port: PORT, logger: NULL_LOGGER) do |s|
|
279
279
|
s.get('/example/hello') { [200, { 'Content-Type' => 'text/plain' }, 'hello get'] }
|
280
280
|
end
|
281
|
+
omit "TLS connection should be aborted due to `Errno::ECONNABORTED`. Need to debug." if Fluent.windows?
|
281
282
|
|
282
283
|
resp = secure_get("https://127.0.0.1:#{PORT}/example/hello", verify: false)
|
283
284
|
assert_equal('200', resp.code)
|
@@ -293,6 +294,8 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
293
294
|
'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem'],
|
294
295
|
'without passphrase' => [nil, 'cert.pem', 'cert-key.pem'])
|
295
296
|
test 'load self-signed cert/key pair, verified from clients using cert files' do |(passphrase, cert, private_key)|
|
297
|
+
omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
|
298
|
+
|
296
299
|
cert_path = File.join(CERT_DIR, cert)
|
297
300
|
private_key_path = File.join(CERT_DIR, private_key)
|
298
301
|
opt = { 'insecure' => 'false', 'private_key_path' => private_key_path, 'cert_path' => cert_path }
|
@@ -315,6 +318,8 @@ class HttpHelperTest < Test::Unit::TestCase
|
|
315
318
|
'with passphrase' => ['apple', 'cert-pass.pem', 'cert-key-pass.pem', 'ca-cert-pass.pem'],
|
316
319
|
'without passphrase' => [nil, 'cert.pem', 'cert-key.pem', 'ca-cert.pem'])
|
317
320
|
test 'load cert by private CA cert file, verified from clients using CA cert file' do |(passphrase, cert, cert_key, ca_cert)|
|
321
|
+
omit "Self signed certificate blocks TLS connection. Need to debug." if Fluent.windows?
|
322
|
+
|
318
323
|
cert_path = File.join(CERT_CA_DIR, cert)
|
319
324
|
private_key_path = File.join(CERT_CA_DIR, cert_key)
|
320
325
|
|
@@ -176,6 +176,19 @@ class InjectHelperTest < Test::Unit::TestCase
|
|
176
176
|
assert_equal record.merge({"timedata" => float_time}), @d.inject_values_to_record('tag', time, record)
|
177
177
|
end
|
178
178
|
|
179
|
+
test 'injects time as unix time millis into specified key' do
|
180
|
+
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
181
|
+
time_subsecond = 320_101_224
|
182
|
+
time = Fluent::EventTime.new(time_in_unix, time_subsecond)
|
183
|
+
unixtime_millis = 1466464211320
|
184
|
+
|
185
|
+
@d.configure(config_inject_section("time_key" => "timedata", "time_type" => "unixtime_millis"))
|
186
|
+
@d.start
|
187
|
+
|
188
|
+
record = {"key1" => "value1", "key2" => 2}
|
189
|
+
assert_equal record.merge({"timedata" => unixtime_millis}), @d.inject_values_to_record('tag', time, record)
|
190
|
+
end
|
191
|
+
|
179
192
|
test 'injects time as unix time into specified key' do
|
180
193
|
time_in_unix = Time.parse("2016-06-21 08:10:11 +0900").to_i
|
181
194
|
time_subsecond = 320_101_224
|
@@ -1233,6 +1233,40 @@ class ServerPluginHelperTest < Test::Unit::TestCase
|
|
1233
1233
|
waiting(10){ sleep 0.1 until received.bytesize == 8 }
|
1234
1234
|
assert_equal "yay\nfoo\n", received
|
1235
1235
|
end
|
1236
|
+
|
1237
|
+
test 'set ciphers' do
|
1238
|
+
cert_path = File.join(@server_cert_dir, "cert.pem")
|
1239
|
+
private_key_path = File.join(@certs_dir, "server.key.pem")
|
1240
|
+
create_server_pair_signed_by_self(cert_path, private_key_path, nil)
|
1241
|
+
tls_options = {
|
1242
|
+
protocol: :tls,
|
1243
|
+
version: :TLSv1_2,
|
1244
|
+
ciphers: 'SHA256',
|
1245
|
+
insecure: false,
|
1246
|
+
cert_path: cert_path,
|
1247
|
+
private_key_path: private_key_path,
|
1248
|
+
}
|
1249
|
+
conf = @d.server_create_transport_section_object(tls_options)
|
1250
|
+
ctx = @d.cert_option_create_context(conf.version, conf.insecure, conf.ciphers, conf)
|
1251
|
+
matched = false
|
1252
|
+
ctx.ciphers.each do |cipher|
|
1253
|
+
cipher_name, tls_version = cipher
|
1254
|
+
# OpenSSL 1.0.2: "TLSv1/SSLv3"
|
1255
|
+
# OpenSSL 1.1.1: "TLSv1.2"
|
1256
|
+
if tls_version == "TLSv1/SSLv3" || tls_version == "TLSv1.2"
|
1257
|
+
matched = true
|
1258
|
+
unless cipher_name.match(/#{conf.ciphers}/)
|
1259
|
+
matched = false
|
1260
|
+
break
|
1261
|
+
end
|
1262
|
+
end
|
1263
|
+
end
|
1264
|
+
|
1265
|
+
error_msg = build_message("Unexpected ciphers for #{conf.version}",
|
1266
|
+
"<?>\nwas expected to include only <?> ciphers for #{conf.version}",
|
1267
|
+
ctx.ciphers, conf.ciphers)
|
1268
|
+
assert(matched, error_msg)
|
1269
|
+
end
|
1236
1270
|
end
|
1237
1271
|
end
|
1238
1272
|
|
@@ -128,4 +128,12 @@ class SocketHelperTest < Test::Unit::TestCase
|
|
128
128
|
client.close
|
129
129
|
end
|
130
130
|
end
|
131
|
+
|
132
|
+
test 'with empty cert file' do
|
133
|
+
cert_path = File.expand_path(File.dirname(__FILE__) + '/data/cert/empty.pem')
|
134
|
+
|
135
|
+
assert_raise Fluent::ConfigError do
|
136
|
+
SocketHelperTestPlugin.new.socket_create_tls('127.0.0.1', PORT, cert_path: cert_path)
|
137
|
+
end
|
138
|
+
end
|
131
139
|
end
|
data/test/test_formatter.rb
CHANGED
@@ -53,6 +53,11 @@ module FormatterTest
|
|
53
53
|
def setup
|
54
54
|
@formatter = Fluent::Test::FormatterTestDriver.new('out_file')
|
55
55
|
@time = Engine.now
|
56
|
+
@newline = if Fluent.windows?
|
57
|
+
"\r\n"
|
58
|
+
else
|
59
|
+
"\n"
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
63
|
def configure(conf)
|
@@ -63,28 +68,28 @@ module FormatterTest
|
|
63
68
|
configure({})
|
64
69
|
formatted = @formatter.format(tag, @time, record)
|
65
70
|
|
66
|
-
assert_equal("#{time2str(@time)}\t#{tag}\t#{Yajl.dump(record)}
|
71
|
+
assert_equal("#{time2str(@time)}\t#{tag}\t#{Yajl.dump(record)}#{@newline}", formatted)
|
67
72
|
end
|
68
73
|
|
69
74
|
def test_format_without_time
|
70
75
|
configure('output_time' => 'false')
|
71
76
|
formatted = @formatter.format(tag, @time, record)
|
72
77
|
|
73
|
-
assert_equal("#{tag}\t#{Yajl.dump(record)}
|
78
|
+
assert_equal("#{tag}\t#{Yajl.dump(record)}#{@newline}", formatted)
|
74
79
|
end
|
75
80
|
|
76
81
|
def test_format_without_tag
|
77
82
|
configure('output_tag' => 'false')
|
78
83
|
formatted = @formatter.format(tag, @time, record)
|
79
84
|
|
80
|
-
assert_equal("#{time2str(@time)}\t#{Yajl.dump(record)}
|
85
|
+
assert_equal("#{time2str(@time)}\t#{Yajl.dump(record)}#{@newline}", formatted)
|
81
86
|
end
|
82
87
|
|
83
88
|
def test_format_without_time_and_tag
|
84
89
|
configure('output_tag' => 'false', 'output_time' => 'false')
|
85
90
|
formatted = @formatter.format('tag', @time, record)
|
86
91
|
|
87
|
-
assert_equal("#{Yajl.dump(record)}
|
92
|
+
assert_equal("#{Yajl.dump(record)}#{@newline}", formatted)
|
88
93
|
end
|
89
94
|
|
90
95
|
def test_format_without_time_and_tag_against_string_literal_configure
|
@@ -95,7 +100,7 @@ module FormatterTest
|
|
95
100
|
])
|
96
101
|
formatted = @formatter.format('tag', @time, record)
|
97
102
|
|
98
|
-
assert_equal("#{Yajl.dump(record)}
|
103
|
+
assert_equal("#{Yajl.dump(record)}#{@newline}", formatted)
|
99
104
|
end
|
100
105
|
end
|
101
106
|
|
@@ -105,6 +110,11 @@ module FormatterTest
|
|
105
110
|
def setup
|
106
111
|
@formatter = Fluent::Test::FormatterTestDriver.new(TextFormatter::JSONFormatter)
|
107
112
|
@time = Engine.now
|
113
|
+
@newline = if Fluent.windows?
|
114
|
+
"\r\n"
|
115
|
+
else
|
116
|
+
"\n"
|
117
|
+
end
|
108
118
|
end
|
109
119
|
|
110
120
|
data('oj' => 'oj', 'yajl' => 'yajl')
|
@@ -112,7 +122,7 @@ module FormatterTest
|
|
112
122
|
@formatter.configure('json_parser' => data)
|
113
123
|
formatted = @formatter.format(tag, @time, record)
|
114
124
|
|
115
|
-
assert_equal("#{Yajl.dump(record)}
|
125
|
+
assert_equal("#{Yajl.dump(record)}#{@newline}", formatted)
|
116
126
|
end
|
117
127
|
end
|
118
128
|
|
@@ -138,6 +148,11 @@ module FormatterTest
|
|
138
148
|
def setup
|
139
149
|
@formatter = TextFormatter::LabeledTSVFormatter.new
|
140
150
|
@time = Engine.now
|
151
|
+
@newline = if Fluent.windows?
|
152
|
+
"\r\n"
|
153
|
+
else
|
154
|
+
"\n"
|
155
|
+
end
|
141
156
|
end
|
142
157
|
|
143
158
|
def test_config_params
|
@@ -157,7 +172,7 @@ module FormatterTest
|
|
157
172
|
@formatter.configure({})
|
158
173
|
formatted = @formatter.format(tag, @time, record)
|
159
174
|
|
160
|
-
assert_equal("message:awesome\tgreeting:hello
|
175
|
+
assert_equal("message:awesome\tgreeting:hello#{@newline}", formatted)
|
161
176
|
end
|
162
177
|
|
163
178
|
def test_format_with_customized_delimiters
|
@@ -167,7 +182,7 @@ module FormatterTest
|
|
167
182
|
)
|
168
183
|
formatted = @formatter.format(tag, @time, record)
|
169
184
|
|
170
|
-
assert_equal("message=awesome,greeting=hello
|
185
|
+
assert_equal("message=awesome,greeting=hello#{@newline}", formatted)
|
171
186
|
end
|
172
187
|
end
|
173
188
|
|
@@ -260,6 +275,14 @@ module FormatterTest
|
|
260
275
|
|
261
276
|
class SingleValueFormatterTest < ::Test::Unit::TestCase
|
262
277
|
include FormatterTest
|
278
|
+
def setup
|
279
|
+
@newline = if Fluent.windows?
|
280
|
+
"\r\n"
|
281
|
+
else
|
282
|
+
"\n"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
263
286
|
|
264
287
|
def test_config_params
|
265
288
|
formatter = TextFormatter::SingleValueFormatter.new
|
@@ -271,8 +294,9 @@ module FormatterTest
|
|
271
294
|
|
272
295
|
def test_format
|
273
296
|
formatter = Fluent::Plugin.new_formatter('single_value')
|
297
|
+
formatter.configure({})
|
274
298
|
formatted = formatter.format('tag', Engine.now, {'message' => 'awesome'})
|
275
|
-
assert_equal("awesome
|
299
|
+
assert_equal("awesome#{@newline}", formatted)
|
276
300
|
end
|
277
301
|
|
278
302
|
def test_format_without_newline
|
@@ -287,7 +311,7 @@ module FormatterTest
|
|
287
311
|
formatter.configure('message_key' => 'foobar')
|
288
312
|
formatted = formatter.format('tag', Engine.now, {'foobar' => 'foo'})
|
289
313
|
|
290
|
-
assert_equal("foo
|
314
|
+
assert_equal("foo#{@newline}", formatted)
|
291
315
|
end
|
292
316
|
end
|
293
317
|
|
data/test/test_log.rb
CHANGED
@@ -411,6 +411,50 @@ class LogTest < Test::Unit::TestCase
|
|
411
411
|
end
|
412
412
|
end
|
413
413
|
|
414
|
+
sub_test_case "ignore_same_log_interval" do
|
415
|
+
teardown do
|
416
|
+
Thread.current[:last_same_log] = nil
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_same_message
|
420
|
+
message = "This is test"
|
421
|
+
logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
|
422
|
+
log = Fluent::Log.new(logger, {ignore_same_log_interval: 5})
|
423
|
+
|
424
|
+
log.error message
|
425
|
+
10.times { |i|
|
426
|
+
Timecop.freeze(@timestamp + i + 1)
|
427
|
+
log.error message
|
428
|
+
}
|
429
|
+
|
430
|
+
expected = [
|
431
|
+
"2016-04-21 02:58:41 +0000 [error]: This is test\n",
|
432
|
+
"2016-04-21 02:58:47 +0000 [error]: This is test\n"
|
433
|
+
]
|
434
|
+
assert_equal(expected, log.out.logs)
|
435
|
+
end
|
436
|
+
|
437
|
+
def test_different_message
|
438
|
+
message = "This is test"
|
439
|
+
logger = ServerEngine::DaemonLogger.new(@log_device, {log_level: ServerEngine::DaemonLogger::INFO})
|
440
|
+
log = Fluent::Log.new(logger, {ignore_same_log_interval: 10})
|
441
|
+
|
442
|
+
log.error message
|
443
|
+
3.times { |i|
|
444
|
+
Timecop.freeze(@timestamp + i)
|
445
|
+
log.error message
|
446
|
+
log.error message
|
447
|
+
log.info "Hello! " + message
|
448
|
+
}
|
449
|
+
|
450
|
+
expected = [
|
451
|
+
"2016-04-21 02:58:41 +0000 [error]: This is test\n",
|
452
|
+
"2016-04-21 02:58:41 +0000 [info]: Hello! This is test\n",
|
453
|
+
]
|
454
|
+
assert_equal(expected, log.out.logs)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
414
458
|
def test_dup
|
415
459
|
dl_opts = {}
|
416
460
|
dl_opts[:log_level] = ServerEngine::DaemonLogger::TRACE
|
data/test/test_match.rb
CHANGED
@@ -101,6 +101,17 @@ class MatchTest < Test::Unit::TestCase
|
|
101
101
|
assert_or_not_match('a.b.** a.c', 'a.c.d')
|
102
102
|
end
|
103
103
|
|
104
|
+
def test_regex_pattern
|
105
|
+
assert_glob_match('/a/', 'a')
|
106
|
+
assert_glob_not_match('/a/', 'abc')
|
107
|
+
assert_glob_match('/a.*/', 'abc')
|
108
|
+
assert_glob_not_match('/b.*/', 'abc')
|
109
|
+
assert_glob_match('/a\..*/', 'a.b.c')
|
110
|
+
assert_glob_not_match('/(?!a\.).*/', 'a.b.c')
|
111
|
+
assert_glob_not_match('/a\..*/', 'b.b.c')
|
112
|
+
assert_glob_match('/(?!a\.).*/', 'b.b.c')
|
113
|
+
end
|
114
|
+
|
104
115
|
#def test_character_class
|
105
116
|
# assert_match('[a]', 'a')
|
106
117
|
# assert_match('[ab]', 'a')
|
data/test/test_output.rb
CHANGED
@@ -230,6 +230,11 @@ module FluentOutputTest
|
|
230
230
|
setup do
|
231
231
|
@time = Time.parse("2011-01-02 13:14:15 UTC")
|
232
232
|
Timecop.freeze(@time)
|
233
|
+
@newline = if Fluent.windows?
|
234
|
+
"\r\n"
|
235
|
+
else
|
236
|
+
"\n"
|
237
|
+
end
|
233
238
|
end
|
234
239
|
|
235
240
|
teardown do
|
@@ -265,7 +270,7 @@ module FluentOutputTest
|
|
265
270
|
])
|
266
271
|
time = Time.parse("2016-11-08 12:00:00 UTC").to_i
|
267
272
|
d.emit({"a" => 1}, time)
|
268
|
-
d.expect_format %[2016-11-08T12:00:00Z\ttest\t{"a":1,"time":"2016-11-08T12:00:00Z"}
|
273
|
+
d.expect_format %[2016-11-08T12:00:00Z\ttest\t{"a":1,"time":"2016-11-08T12:00:00Z"}#{@newline}]
|
269
274
|
d.run
|
270
275
|
end
|
271
276
|
end
|
@@ -6,7 +6,7 @@ require 'fluent/plugin/out_forward'
|
|
6
6
|
require 'fluent/plugin/out_stdout'
|
7
7
|
require 'fluent/plugin/out_exec'
|
8
8
|
require 'fluent/plugin/in_forward'
|
9
|
-
require 'fluent/plugin/
|
9
|
+
require 'fluent/plugin/in_sample'
|
10
10
|
require 'fluent/plugin/filter_grep'
|
11
11
|
require 'fluent/plugin/filter_stdout'
|
12
12
|
require 'fluent/plugin/filter_parser'
|
@@ -74,7 +74,7 @@ class StaticConfigAnalysisTest < ::Test::Unit::TestCase
|
|
74
74
|
c = Fluent::Config.parse(conf_data, '(test)', '(test_dir)', true)
|
75
75
|
ret = Fluent::StaticConfigAnalysis.call(c)
|
76
76
|
assert_equal [Fluent::Plugin::ExecOutput, Fluent::Plugin::StdoutOutput, Fluent::Plugin::ForwardOutput], ret.outputs.map(&:plugin).map(&:class)
|
77
|
-
assert_equal [Fluent::Plugin::
|
77
|
+
assert_equal [Fluent::Plugin::SampleInput, Fluent::Plugin::ForwardInput], ret.inputs.map(&:plugin).map(&:class)
|
78
78
|
assert_equal [Fluent::Plugin::ParserFilter, Fluent::Plugin::StdoutFilter, Fluent::Plugin::GrepFilter], ret.filters.map(&:plugin).map(&:class)
|
79
79
|
assert_equal 1, ret.labels.size
|
80
80
|
assert_equal '@test', ret.labels[0].name
|
data/test/test_supervisor.rb
CHANGED
@@ -8,6 +8,10 @@ require 'net/http'
|
|
8
8
|
require 'uri'
|
9
9
|
require 'fileutils'
|
10
10
|
|
11
|
+
if Fluent.windows?
|
12
|
+
require 'win32/event'
|
13
|
+
end
|
14
|
+
|
11
15
|
class SupervisorTest < ::Test::Unit::TestCase
|
12
16
|
class DummyServer
|
13
17
|
include Fluent::ServerModule
|
@@ -128,6 +132,28 @@ class SupervisorTest < ::Test::Unit::TestCase
|
|
128
132
|
$log.out.reset if $log && $log.out && $log.out.respond_to?(:reset)
|
129
133
|
end
|
130
134
|
|
135
|
+
def test_windows_shutdown_event
|
136
|
+
omit "Only for Windows platform" unless Fluent.windows?
|
137
|
+
|
138
|
+
server = DummyServer.new
|
139
|
+
def server.config
|
140
|
+
{:signame => "TestFluentdEvent", :worker_pid => {0 => 1234}}
|
141
|
+
end
|
142
|
+
|
143
|
+
mock(server).stop(true)
|
144
|
+
stub(Process).kill.times(0)
|
145
|
+
|
146
|
+
server.before_run
|
147
|
+
server.install_windows_event_handler
|
148
|
+
sleep 0.1 # Wait for starting windows event thread
|
149
|
+
event = Win32::Event.open("TestFluentdEvent")
|
150
|
+
event.set
|
151
|
+
event.close
|
152
|
+
# Wait for stopping windows event thread. Should larger than 1 sec
|
153
|
+
# because the thread is awaked every 1 sec.
|
154
|
+
sleep 1.1
|
155
|
+
end
|
156
|
+
|
131
157
|
def test_rpc_server
|
132
158
|
omit "Windows cannot handle signals" if Fluent.windows?
|
133
159
|
|