fluentd 0.12.40 → 1.6.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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- data/.gitignore +5 -0
- data/.gitlab/cicd-template.yaml +10 -0
- data/.gitlab-ci.yml +147 -0
- data/.travis.yml +56 -20
- data/ADOPTERS.md +5 -0
- data/CHANGELOG.md +1369 -0
- data/CONTRIBUTING.md +16 -5
- data/GOVERNANCE.md +55 -0
- data/Gemfile +5 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +7 -0
- data/README.md +23 -11
- data/Rakefile +48 -2
- data/Vagrantfile +17 -0
- data/appveyor.yml +37 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +3 -0
- data/code-of-conduct.md +3 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/in_dummy_blocks.conf +17 -0
- data/example/in_dummy_with_compression.conf +23 -0
- data/example/in_forward.conf +7 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +3 -1
- data/example/in_out_forward.conf +17 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_forward.conf +13 -13
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +29 -0
- data/fluentd.gemspec +21 -11
- data/lib/fluent/agent.rb +67 -90
- data/lib/fluent/clock.rb +62 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/ca_generate.rb +181 -0
- data/lib/fluent/command/cat.rb +42 -18
- data/lib/fluent/command/debug.rb +12 -10
- data/lib/fluent/command/fluentd.rb +153 -5
- data/lib/fluent/command/plugin_config_formatter.rb +292 -0
- data/lib/fluent/command/plugin_generator.rb +324 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -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 +68 -0
- data/lib/fluent/compat/formatter.rb +111 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +718 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/configure_proxy.rb +210 -62
- data/lib/fluent/config/dsl.rb +12 -5
- data/lib/fluent/config/element.rb +107 -9
- data/lib/fluent/config/literal_parser.rb +9 -3
- data/lib/fluent/config/parser.rb +4 -4
- data/lib/fluent/config/section.rb +51 -14
- data/lib/fluent/config/types.rb +28 -13
- data/lib/fluent/config/v1_parser.rb +3 -5
- data/lib/fluent/config.rb +23 -20
- data/lib/fluent/configurable.rb +79 -21
- 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/counter.rb +23 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +102 -65
- data/lib/fluent/env.rb +7 -3
- data/lib/fluent/error.rb +30 -0
- data/lib/fluent/event.rb +197 -21
- data/lib/fluent/event_router.rb +93 -10
- data/lib/fluent/filter.rb +2 -50
- data/lib/fluent/formatter.rb +4 -293
- data/lib/fluent/input.rb +2 -32
- data/lib/fluent/label.rb +10 -2
- data/lib/fluent/load.rb +3 -3
- data/lib/fluent/log.rb +348 -81
- data/lib/fluent/match.rb +37 -36
- data/lib/fluent/mixin.rb +12 -176
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +10 -612
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +4 -800
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +192 -0
- data/lib/fluent/plugin/buf_file.rb +128 -174
- data/lib/fluent/plugin/buf_memory.rb +9 -92
- data/lib/fluent/plugin/buffer/chunk.rb +221 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/buffer.rb +779 -0
- data/lib/fluent/plugin/compressable.rb +92 -0
- data/lib/fluent/plugin/exec_util.rb +3 -108
- data/lib/fluent/plugin/file_util.rb +4 -34
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +117 -34
- data/lib/fluent/plugin/filter_parser.rb +85 -62
- data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
- data/lib/fluent/plugin/filter_stdout.rb +15 -12
- data/lib/fluent/plugin/formatter.rb +50 -0
- data/lib/fluent/plugin/formatter_csv.rb +52 -0
- data/lib/fluent/plugin/formatter_hash.rb +33 -0
- data/lib/fluent/plugin/formatter_json.rb +55 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +51 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +38 -0
- data/lib/fluent/plugin/in_debug_agent.rb +17 -6
- data/lib/fluent/plugin/in_dummy.rb +47 -20
- data/lib/fluent/plugin/in_exec.rb +55 -123
- data/lib/fluent/plugin/in_forward.rb +299 -216
- data/lib/fluent/plugin/in_gc_stat.rb +14 -36
- data/lib/fluent/plugin/in_http.rb +204 -91
- data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
- data/lib/fluent/plugin/in_object_space.rb +13 -41
- data/lib/fluent/plugin/in_syslog.rb +112 -134
- data/lib/fluent/plugin/in_tail.rb +408 -745
- data/lib/fluent/plugin/in_tcp.rb +66 -9
- data/lib/fluent/plugin/in_udp.rb +60 -11
- data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
- data/lib/fluent/plugin/input.rb +37 -0
- data/lib/fluent/plugin/multi_output.rb +158 -0
- data/lib/fluent/plugin/out_copy.rb +23 -35
- data/lib/fluent/plugin/out_exec.rb +67 -70
- data/lib/fluent/plugin/out_exec_filter.rb +204 -271
- data/lib/fluent/plugin/out_file.rb +267 -73
- data/lib/fluent/plugin/out_forward.rb +854 -325
- data/lib/fluent/plugin/out_null.rb +42 -9
- data/lib/fluent/plugin/out_relabel.rb +9 -5
- data/lib/fluent/plugin/out_roundrobin.rb +18 -37
- data/lib/fluent/plugin/out_secondary_file.rb +133 -0
- data/lib/fluent/plugin/out_stdout.rb +43 -10
- data/lib/fluent/plugin/out_stream.rb +7 -2
- data/lib/fluent/plugin/output.rb +1498 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +191 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +39 -0
- data/lib/fluent/plugin/parser_json.rb +94 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +106 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +142 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/socket_util.rb +3 -143
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +164 -0
- data/lib/fluent/plugin/string_util.rb +3 -15
- data/lib/fluent/plugin.rb +122 -121
- data/lib/fluent/plugin_helper/cert_option.rb +178 -0
- data/lib/fluent/plugin_helper/child_process.rb +364 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
- data/lib/fluent/plugin_helper/http_server.rb +76 -0
- data/lib/fluent/plugin_helper/inject.rb +151 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
- data/lib/fluent/plugin_helper/retry_state.rb +205 -0
- data/lib/fluent/plugin_helper/server.rb +807 -0
- data/lib/fluent/plugin_helper/socket.rb +250 -0
- data/lib/fluent/plugin_helper/socket_option.rb +80 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +179 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +73 -0
- data/lib/fluent/plugin_id.rb +80 -0
- data/lib/fluent/process.rb +3 -489
- data/lib/fluent/registry.rb +52 -10
- data/lib/fluent/root_agent.rb +204 -42
- data/lib/fluent/supervisor.rb +597 -359
- data/lib/fluent/system_config.rb +131 -42
- data/lib/fluent/test/base.rb +6 -54
- data/lib/fluent/test/driver/base.rb +224 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +57 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +0 -1
- data/lib/fluent/test/formatter_test.rb +4 -1
- data/lib/fluent/test/helpers.rb +58 -10
- data/lib/fluent/test/input_test.rb +27 -19
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +28 -39
- data/lib/fluent/test/parser_test.rb +3 -1
- data/lib/fluent/test/startup_shutdown.rb +46 -0
- data/lib/fluent/test.rb +33 -1
- data/lib/fluent/time.rb +450 -1
- data/lib/fluent/timezone.rb +27 -3
- data/lib/fluent/{status.rb → unique_id.rb} +15 -24
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +85 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/test/helper.rb.erb +8 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- data/test/command/test_binlog_reader.rb +346 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_fluentd.rb +901 -0
- data/test/command/test_plugin_config_formatter.rb +276 -0
- data/test/command/test_plugin_generator.rb +92 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/test_config_parser.rb +126 -2
- data/test/config/test_configurable.rb +946 -187
- data/test/config/test_configure_proxy.rb +424 -74
- data/test/config/test_dsl.rb +11 -11
- data/test/config/test_element.rb +500 -0
- data/test/config/test_literal_parser.rb +8 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +79 -7
- data/test/config/test_system_config.rb +122 -35
- data/test/config/test_types.rb +38 -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/helper.rb +89 -6
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +823 -460
- data/test/plugin/test_buf_memory.rb +32 -194
- data/test/plugin/test_buffer.rb +1233 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +844 -0
- data/test/plugin/test_buffer_memory_chunk.rb +338 -0
- data/test/plugin/test_compressable.rb +84 -0
- data/test/plugin/test_filter.rb +357 -0
- data/test/plugin/test_filter_grep.rb +540 -29
- data/test/plugin/test_filter_parser.rb +439 -452
- data/test/plugin/test_filter_record_transformer.rb +123 -166
- data/test/plugin/test_filter_stdout.rb +160 -72
- data/test/plugin/test_formatter_csv.rb +111 -0
- data/test/plugin/test_formatter_hash.rb +35 -0
- data/test/plugin/test_formatter_json.rb +51 -0
- data/test/plugin/test_formatter_ltsv.rb +62 -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_formatter_tsv.rb +68 -0
- data/test/plugin/test_in_debug_agent.rb +24 -1
- data/test/plugin/test_in_dummy.rb +111 -18
- data/test/plugin/test_in_exec.rb +200 -113
- data/test/plugin/test_in_forward.rb +990 -387
- data/test/plugin/test_in_gc_stat.rb +10 -8
- data/test/plugin/test_in_http.rb +600 -224
- data/test/plugin/test_in_monitor_agent.rb +690 -0
- data/test/plugin/test_in_object_space.rb +24 -8
- data/test/plugin/test_in_syslog.rb +154 -215
- data/test/plugin/test_in_tail.rb +1006 -707
- data/test/plugin/test_in_tcp.rb +125 -48
- data/test/plugin/test_in_udp.rb +204 -63
- data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
- data/test/plugin/test_input.rb +126 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_copy.rb +117 -112
- data/test/plugin/test_out_exec.rb +258 -53
- data/test/plugin/test_out_exec_filter.rb +538 -115
- data/test/plugin/test_out_file.rb +865 -178
- data/test/plugin/test_out_forward.rb +998 -210
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +36 -29
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +135 -37
- data/test/plugin/test_out_stream.rb +18 -0
- data/test/plugin/test_output.rb +984 -0
- data/test/plugin/test_output_as_buffered.rb +2021 -0
- data/test/plugin/test_output_as_buffered_backup.rb +312 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +911 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +359 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +103 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +145 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +441 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/test_cert_option.rb +16 -0
- data/test/plugin_helper/test_child_process.rb +794 -0
- data/test/plugin_helper/test_compat_parameters.rb +353 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +205 -0
- data/test/plugin_helper/test_inject.rb +519 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +197 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1714 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +132 -0
- data/test/scripts/exec_script.rb +0 -6
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/out_test.rb +23 -15
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +16 -7
- data/test/test_configdsl.rb +2 -2
- data/test/test_event.rb +360 -13
- data/test/test_event_router.rb +108 -11
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +48 -6
- data/test/test_formatter.rb +11 -391
- data/test/test_input.rb +1 -1
- data/test/test_log.rb +591 -31
- data/test/test_mixin.rb +1 -1
- data/test/test_output.rb +121 -185
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +177 -10
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +101 -0
- data/test/test_process.rb +8 -42
- data/test/test_root_agent.rb +766 -21
- data/test/test_supervisor.rb +481 -0
- data/test/test_test_drivers.rb +135 -0
- data/test/test_time_formatter.rb +282 -0
- data/test/test_time_parser.rb +231 -0
- data/test/test_unique_id.rb +47 -0
- metadata +454 -60
- data/COPYING +0 -14
- data/ChangeLog +0 -666
- data/lib/fluent/buffer.rb +0 -365
- data/lib/fluent/plugin/in_status.rb +0 -76
- data/test/plugin/test_in_status.rb +0 -38
- data/test/test_buffer.rb +0 -624
- data/test/test_parser.rb +0 -1305
data/lib/fluent/time.rb
CHANGED
@@ -1 +1,450 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
|
+
# Fluentd
|
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
|
+
|
17
|
+
require 'time'
|
18
|
+
require 'msgpack'
|
19
|
+
require 'strptime'
|
20
|
+
require 'fluent/timezone'
|
21
|
+
require 'fluent/configurable'
|
22
|
+
require 'fluent/config/error'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
class EventTime
|
26
|
+
TYPE = 0
|
27
|
+
FORMATTER = Strftime.new('%Y-%m-%d %H:%M:%S.%N %z')
|
28
|
+
|
29
|
+
def initialize(sec, nsec = 0)
|
30
|
+
@sec = sec
|
31
|
+
@nsec = nsec
|
32
|
+
end
|
33
|
+
|
34
|
+
def ==(other)
|
35
|
+
if other.is_a?(Fluent::EventTime)
|
36
|
+
@sec == other.sec
|
37
|
+
else
|
38
|
+
@sec == other
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def sec
|
43
|
+
@sec
|
44
|
+
end
|
45
|
+
|
46
|
+
def nsec
|
47
|
+
@nsec
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_int
|
51
|
+
@sec
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_f
|
55
|
+
@sec + @nsec / 1_000_000_000.0
|
56
|
+
end
|
57
|
+
|
58
|
+
# for Time.at
|
59
|
+
def to_r
|
60
|
+
Rational(@sec * 1_000_000_000 + @nsec, 1_000_000_000)
|
61
|
+
end
|
62
|
+
|
63
|
+
# for > and others
|
64
|
+
def coerce(other)
|
65
|
+
[other, @sec]
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
@sec.to_s
|
70
|
+
end
|
71
|
+
|
72
|
+
begin
|
73
|
+
# ruby 2.5 or later
|
74
|
+
Time.at(0, 0, :nanosecond)
|
75
|
+
|
76
|
+
def to_time
|
77
|
+
Time.at(@sec, @nsec, :nanosecond)
|
78
|
+
end
|
79
|
+
rescue
|
80
|
+
def to_time
|
81
|
+
Time.at(@sec, @nsec / 1000.0)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_json(*args)
|
86
|
+
@sec.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
def to_msgpack(io = nil)
|
90
|
+
@sec.to_msgpack(io)
|
91
|
+
end
|
92
|
+
|
93
|
+
def to_msgpack_ext
|
94
|
+
[@sec, @nsec].pack('NN')
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.from_msgpack_ext(data)
|
98
|
+
new(*data.unpack('NN'))
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.from_time(time)
|
102
|
+
Fluent::EventTime.new(time.to_i, time.nsec)
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.eq?(a, b)
|
106
|
+
if a.is_a?(Fluent::EventTime) && b.is_a?(Fluent::EventTime)
|
107
|
+
a.sec == b.sec && a.nsec == b.nsec
|
108
|
+
else
|
109
|
+
a == b
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.now
|
114
|
+
from_time(Time.now)
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.parse(*args)
|
118
|
+
from_time(Time.parse(*args))
|
119
|
+
end
|
120
|
+
|
121
|
+
## TODO: For performance, implement +, -, and so on
|
122
|
+
def method_missing(name, *args, &block)
|
123
|
+
@sec.send(name, *args, &block)
|
124
|
+
end
|
125
|
+
|
126
|
+
def inspect
|
127
|
+
FORMATTER.exec(Time.at(self))
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
module TimeMixin
|
132
|
+
TIME_TYPES = ['string', 'unixtime', 'float']
|
133
|
+
|
134
|
+
TIME_PARAMETERS = [
|
135
|
+
[:time_format, :string, {default: nil}],
|
136
|
+
[:localtime, :bool, {default: true}], # UTC if :localtime is false and :timezone is nil
|
137
|
+
[:utc, :bool, {default: false}], # to turn :localtime false
|
138
|
+
[:timezone, :string, {default: nil}],
|
139
|
+
]
|
140
|
+
TIME_FULL_PARAMETERS = [
|
141
|
+
# To avoid to define :time_type twice (in plugin_helper/inject)
|
142
|
+
[:time_type, :enum, {default: :string, list: TIME_TYPES.map(&:to_sym)}],
|
143
|
+
] + TIME_PARAMETERS
|
144
|
+
|
145
|
+
module TimeParameters
|
146
|
+
include Fluent::Configurable
|
147
|
+
TIME_FULL_PARAMETERS.each do |name, type, opts|
|
148
|
+
config_param name, type, opts
|
149
|
+
end
|
150
|
+
|
151
|
+
def configure(conf)
|
152
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
153
|
+
if conf.has_key?('localtime') && conf.has_key?('utc')
|
154
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
155
|
+
elsif conf.has_key?('localtime')
|
156
|
+
conf['localtime'] = Fluent::Config.bool_value(conf['localtime'])
|
157
|
+
elsif conf.has_key?('utc')
|
158
|
+
conf['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
|
159
|
+
# Specifying "localtime false" means using UTC in TimeFormatter
|
160
|
+
# And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
|
161
|
+
# There are difference between "Z" and "+0000" in timezone formatting.
|
162
|
+
# TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
super
|
167
|
+
|
168
|
+
Fluent::Timezone.validate!(@timezone) if @timezone
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
module Parser
|
173
|
+
def self.included(mod)
|
174
|
+
mod.include TimeParameters
|
175
|
+
end
|
176
|
+
|
177
|
+
def time_parser_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
|
178
|
+
return NumericTimeParser.new(type) if type != :string
|
179
|
+
return TimeParser.new(format, true, nil) if force_localtime
|
180
|
+
|
181
|
+
localtime = @localtime && (timezone.nil? && !@utc)
|
182
|
+
TimeParser.new(format, localtime, timezone)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
module Formatter
|
187
|
+
def self.included(mod)
|
188
|
+
mod.include TimeParameters
|
189
|
+
end
|
190
|
+
|
191
|
+
def time_formatter_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
|
192
|
+
return NumericTimeFormatter.new(type) if type != :string
|
193
|
+
return TimeFormatter.new(format, true, nil) if force_localtime
|
194
|
+
|
195
|
+
localtime = @localtime && (timezone.nil? && !@utc)
|
196
|
+
TimeFormatter.new(format, localtime, timezone)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
class TimeParser
|
202
|
+
class TimeParseError < StandardError; end
|
203
|
+
|
204
|
+
def initialize(format = nil, localtime = true, timezone = nil)
|
205
|
+
if format.nil? && (timezone || !localtime)
|
206
|
+
raise Fluent::ConfigError, "specifying timezone requires time format"
|
207
|
+
end
|
208
|
+
|
209
|
+
@cache1_key = nil
|
210
|
+
@cache1_time = nil
|
211
|
+
@cache2_key = nil
|
212
|
+
@cache2_time = nil
|
213
|
+
|
214
|
+
format_with_timezone = format && (format.include?("%z") || format.include?("%Z"))
|
215
|
+
|
216
|
+
# unixtime_in_expected_tz = unixtime_in_localtime + offset_diff
|
217
|
+
offset_diff = case
|
218
|
+
when format_with_timezone then nil
|
219
|
+
when timezone then
|
220
|
+
offset = Fluent::Timezone.utc_offset(timezone)
|
221
|
+
if offset.respond_to?(:call)
|
222
|
+
->(t) { Time.now.localtime.utc_offset - offset.call(t) }
|
223
|
+
else
|
224
|
+
Time.now.localtime.utc_offset - offset
|
225
|
+
end
|
226
|
+
when localtime then 0
|
227
|
+
else Time.now.localtime.utc_offset # utc
|
228
|
+
end
|
229
|
+
|
230
|
+
strptime = format && (Strptime.new(format) rescue nil)
|
231
|
+
|
232
|
+
@parse = case
|
233
|
+
when format_with_timezone && strptime then ->(v){ Fluent::EventTime.from_time(strptime.exec(v)) }
|
234
|
+
when format_with_timezone then ->(v){ Fluent::EventTime.from_time(Time.strptime(v, format)) }
|
235
|
+
when format == '%iso8601' then ->(v){ Fluent::EventTime.from_time(Time.iso8601(v)) }
|
236
|
+
when strptime then
|
237
|
+
if offset_diff.respond_to?(:call)
|
238
|
+
->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
|
239
|
+
else
|
240
|
+
->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
|
241
|
+
end
|
242
|
+
when format then
|
243
|
+
if offset_diff.respond_to?(:call)
|
244
|
+
->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff.call(t), t.nsec) }
|
245
|
+
else
|
246
|
+
->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + offset_diff, t.nsec) }
|
247
|
+
end
|
248
|
+
else ->(v){ Fluent::EventTime.parse(v) }
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
# TODO: new cache mechanism using format string
|
253
|
+
def parse(value)
|
254
|
+
unless value.is_a?(String)
|
255
|
+
raise TimeParseError, "value must be string: #{value}"
|
256
|
+
end
|
257
|
+
|
258
|
+
if @cache1_key == value
|
259
|
+
return @cache1_time
|
260
|
+
elsif @cache2_key == value
|
261
|
+
return @cache2_time
|
262
|
+
else
|
263
|
+
begin
|
264
|
+
time = @parse.call(value)
|
265
|
+
rescue => e
|
266
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
267
|
+
end
|
268
|
+
@cache1_key = @cache2_key
|
269
|
+
@cache1_time = @cache2_time
|
270
|
+
@cache2_key = value
|
271
|
+
@cache2_time = time
|
272
|
+
return time
|
273
|
+
end
|
274
|
+
end
|
275
|
+
alias :call :parse
|
276
|
+
end
|
277
|
+
|
278
|
+
class NumericTimeParser < TimeParser # to include TimeParseError
|
279
|
+
def initialize(type, localtime = nil, timezone = nil)
|
280
|
+
@cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
|
281
|
+
|
282
|
+
if type == :unixtime
|
283
|
+
define_singleton_method(:parse, method(:parse_unixtime))
|
284
|
+
define_singleton_method(:call, method(:parse_unixtime))
|
285
|
+
else # :float
|
286
|
+
define_singleton_method(:parse, method(:parse_float))
|
287
|
+
define_singleton_method(:call, method(:parse_float))
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
def parse_unixtime(value)
|
292
|
+
unless value.is_a?(String) || value.is_a?(Numeric)
|
293
|
+
raise TimeParseError, "value must be a string or a number: #{value}(value.class)"
|
294
|
+
end
|
295
|
+
|
296
|
+
if @cache1_key == value
|
297
|
+
return @cache1_time
|
298
|
+
elsif @cache2_key == value
|
299
|
+
return @cache2_time
|
300
|
+
end
|
301
|
+
|
302
|
+
begin
|
303
|
+
time = Fluent::EventTime.new(value.to_i)
|
304
|
+
rescue => e
|
305
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
306
|
+
end
|
307
|
+
@cache1_key = @cache2_key
|
308
|
+
@cache1_time = @cache2_time
|
309
|
+
@cache2_key = value
|
310
|
+
@cache2_time = time
|
311
|
+
time
|
312
|
+
end
|
313
|
+
|
314
|
+
# rough benchmark result to compare handmade parser vs Fluent::EventTime.from_time(Time.at(value.to_r))
|
315
|
+
# full: with 9-digits of nsec after dot
|
316
|
+
# msec: with 3-digits of msec after dot
|
317
|
+
# 10_000_000 times loop on MacBookAir
|
318
|
+
## parse_by_myself(full): 12.162475 sec
|
319
|
+
## parse_by_myself(msec): 15.050435 sec
|
320
|
+
## parse_by_to_r (full): 28.722362 sec
|
321
|
+
## parse_by_to_r (msec): 28.232856 sec
|
322
|
+
def parse_float(value)
|
323
|
+
unless value.is_a?(String) || value.is_a?(Numeric)
|
324
|
+
raise TimeParseError, "value must be a string or a number: #{value}(value.class)"
|
325
|
+
end
|
326
|
+
|
327
|
+
if @cache1_key == value
|
328
|
+
return @cache1_time
|
329
|
+
elsif @cache2_key == value
|
330
|
+
return @cache2_time
|
331
|
+
end
|
332
|
+
|
333
|
+
begin
|
334
|
+
sec_s, nsec_s, _ = value.to_s.split('.', 3) # throw away second-dot and later
|
335
|
+
nsec_s = nsec_s && nsec_s[0..9] || '0'
|
336
|
+
nsec_s += '0' * (9 - nsec_s.size) if nsec_s.size < 9
|
337
|
+
time = Fluent::EventTime.new(sec_s.to_i, nsec_s.to_i)
|
338
|
+
rescue => e
|
339
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
340
|
+
end
|
341
|
+
@cache1_key = @cache2_key
|
342
|
+
@cache1_time = @cache2_time
|
343
|
+
@cache2_key = value
|
344
|
+
@cache2_time = time
|
345
|
+
time
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
class TimeFormatter
|
350
|
+
def initialize(format = nil, localtime = true, timezone = nil)
|
351
|
+
@tc1 = 0
|
352
|
+
@tc1_str = nil
|
353
|
+
@tc2 = 0
|
354
|
+
@tc2_str = nil
|
355
|
+
|
356
|
+
strftime = format && (Strftime.new(format) rescue nil)
|
357
|
+
if format && format =~ /(^|[^%])(%%)*%L|(^|[^%])(%%)*%\d*N/
|
358
|
+
define_singleton_method(:format, method(:format_with_subsec))
|
359
|
+
define_singleton_method(:call, method(:format_with_subsec))
|
360
|
+
else
|
361
|
+
define_singleton_method(:format, method(:format_without_subsec))
|
362
|
+
define_singleton_method(:call, method(:format_without_subsec))
|
363
|
+
end
|
364
|
+
|
365
|
+
formatter = Fluent::Timezone.formatter(timezone, strftime ? strftime : format)
|
366
|
+
@format_nocache = case
|
367
|
+
when formatter then formatter
|
368
|
+
when strftime && localtime then ->(time){ strftime.exec(Time.at(time)) }
|
369
|
+
when format && localtime then ->(time){ Time.at(time).strftime(format) }
|
370
|
+
when strftime then ->(time){ strftime.exec(Time.at(time).utc) }
|
371
|
+
when format then ->(time){ Time.at(time).utc.strftime(format) }
|
372
|
+
when localtime then ->(time){ Time.at(time).iso8601 }
|
373
|
+
else ->(time){ Time.at(time).utc.iso8601 }
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
def format_without_subsec(time)
|
378
|
+
if @tc1 == time
|
379
|
+
return @tc1_str
|
380
|
+
elsif @tc2 == time
|
381
|
+
return @tc2_str
|
382
|
+
else
|
383
|
+
str = format_nocache(time)
|
384
|
+
if @tc1 < @tc2
|
385
|
+
@tc1 = time
|
386
|
+
@tc1_str = str
|
387
|
+
else
|
388
|
+
@tc2 = time
|
389
|
+
@tc2_str = str
|
390
|
+
end
|
391
|
+
return str
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
def format_with_subsec(time)
|
396
|
+
if Fluent::EventTime.eq?(@tc1, time)
|
397
|
+
return @tc1_str
|
398
|
+
elsif Fluent::EventTime.eq?(@tc2, time)
|
399
|
+
return @tc2_str
|
400
|
+
else
|
401
|
+
str = format_nocache(time)
|
402
|
+
if @tc1 < @tc2
|
403
|
+
@tc1 = time
|
404
|
+
@tc1_str = str
|
405
|
+
else
|
406
|
+
@tc2 = time
|
407
|
+
@tc2_str = str
|
408
|
+
end
|
409
|
+
return str
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
## Dynamically defined in #initialize
|
414
|
+
# def format(time)
|
415
|
+
# end
|
416
|
+
|
417
|
+
def format_nocache(time)
|
418
|
+
@format_nocache.call(time)
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
class NumericTimeFormatter < TimeFormatter
|
423
|
+
def initialize(type, localtime = nil, timezone = nil)
|
424
|
+
@cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
|
425
|
+
|
426
|
+
if type == :unixtime
|
427
|
+
define_singleton_method(:format, method(:format_unixtime))
|
428
|
+
define_singleton_method(:call, method(:format_unixtime))
|
429
|
+
else # :float
|
430
|
+
define_singleton_method(:format, method(:format_float))
|
431
|
+
define_singleton_method(:call, method(:format_float))
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
def format_unixtime(time)
|
436
|
+
time.to_i.to_s
|
437
|
+
end
|
438
|
+
|
439
|
+
def format_float(time)
|
440
|
+
if time.is_a?(Fluent::EventTime) || time.is_a?(Time)
|
441
|
+
# 10.015 secs for 10_000_000 times call on MacBookAir
|
442
|
+
nsec_s = time.nsec.to_s
|
443
|
+
nsec_s = '0' * (9 - nsec_s.size) if nsec_s.size < 9
|
444
|
+
"#{time.sec}.#{nsec_s}"
|
445
|
+
else # integer (or float?)
|
446
|
+
time.to_f.to_s
|
447
|
+
end
|
448
|
+
end
|
449
|
+
end
|
450
|
+
end
|
data/lib/fluent/timezone.rb
CHANGED
@@ -88,7 +88,7 @@ module Fluent
|
|
88
88
|
#
|
89
89
|
# An Proc object is returned. If the given timezone is invalid,
|
90
90
|
# nil is returned.
|
91
|
-
def self.formatter(timezone, format = nil)
|
91
|
+
def self.formatter(timezone = nil, format = nil)
|
92
92
|
if timezone.nil?
|
93
93
|
return nil
|
94
94
|
end
|
@@ -97,10 +97,15 @@ module Fluent
|
|
97
97
|
if NUMERIC_PATTERN === timezone
|
98
98
|
offset = Time.zone_offset(timezone)
|
99
99
|
|
100
|
-
|
100
|
+
case
|
101
|
+
when format.is_a?(String)
|
101
102
|
return Proc.new {|time|
|
102
103
|
Time.at(time).localtime(offset).strftime(format)
|
103
104
|
}
|
105
|
+
when format.is_a?(Strftime)
|
106
|
+
return Proc.new {|time|
|
107
|
+
format.exec(Time.at(time).localtime(offset))
|
108
|
+
}
|
104
109
|
else
|
105
110
|
return Proc.new {|time|
|
106
111
|
Time.at(time).localtime(offset).iso8601
|
@@ -116,10 +121,15 @@ module Fluent
|
|
116
121
|
return nil
|
117
122
|
end
|
118
123
|
|
119
|
-
|
124
|
+
case
|
125
|
+
when format.is_a?(String)
|
120
126
|
return Proc.new {|time|
|
121
127
|
Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).strftime(format)
|
122
128
|
}
|
129
|
+
when format.is_a?(Strftime)
|
130
|
+
return Proc.new {|time|
|
131
|
+
format.exec(Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset))
|
132
|
+
}
|
123
133
|
else
|
124
134
|
return Proc.new {|time|
|
125
135
|
Time.at(time).localtime(tz.period_for_utc(time).utc_total_offset).iso8601
|
@@ -129,5 +139,19 @@ module Fluent
|
|
129
139
|
|
130
140
|
return nil
|
131
141
|
end
|
142
|
+
|
143
|
+
def self.utc_offset(timezone)
|
144
|
+
return 0 if timezone.nil?
|
145
|
+
|
146
|
+
case timezone
|
147
|
+
when NUMERIC_PATTERN
|
148
|
+
Time.zone_offset(timezone)
|
149
|
+
when NAME_PATTERN
|
150
|
+
tz = TZInfo::Timezone.get(timezone)
|
151
|
+
->(time) {
|
152
|
+
tz.period_for_utc(time).utc_total_offset
|
153
|
+
}
|
154
|
+
end
|
155
|
+
end
|
132
156
|
end
|
133
157
|
end
|
@@ -15,34 +15,25 @@
|
|
15
15
|
#
|
16
16
|
|
17
17
|
module Fluent
|
18
|
-
|
19
|
-
def
|
20
|
-
|
21
|
-
|
18
|
+
module UniqueId
|
19
|
+
def self.generate
|
20
|
+
now = Time.now.utc
|
21
|
+
u1 = ((now.to_i * 1000 * 1000 + now.usec) << 12 | rand(0xfff))
|
22
|
+
[u1 >> 32, u1 & 0xffffffff, rand(0xffffffff), rand(0xffffffff)].pack('NNNN')
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
-
|
26
|
-
(@entries[instance.object_id] ||= {})[name] = block
|
27
|
-
}
|
28
|
-
nil
|
25
|
+
def self.hex(unique_id)
|
26
|
+
unique_id.unpack('H*').first
|
29
27
|
end
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
}
|
40
|
-
}
|
29
|
+
module Mixin
|
30
|
+
def generate_unique_id
|
31
|
+
Fluent::UniqueId.generate
|
32
|
+
end
|
33
|
+
|
34
|
+
def dump_unique_id_hex(unique_id)
|
35
|
+
Fluent::UniqueId.hex(unique_id)
|
36
|
+
end
|
41
37
|
end
|
42
38
|
end
|
43
|
-
|
44
|
-
# Don't use this class from plugins.
|
45
|
-
# The interface may be changed
|
46
|
-
Status = StatusClass.new
|
47
39
|
end
|
48
|
-
|
data/lib/fluent/version.rb
CHANGED
@@ -0,0 +1,85 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd
|
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
|
+
|
17
|
+
begin
|
18
|
+
|
19
|
+
require 'optparse'
|
20
|
+
require 'windows/debug'
|
21
|
+
require 'Windows/Library'
|
22
|
+
require 'win32/daemon'
|
23
|
+
require 'win32/event'
|
24
|
+
|
25
|
+
include Win32
|
26
|
+
include Windows::Library
|
27
|
+
include Windows::Debug
|
28
|
+
|
29
|
+
op = OptionParser.new
|
30
|
+
opts = {service_name: nil}
|
31
|
+
op.on('--service-name NAME', "The name of the Windows Service") {|name|
|
32
|
+
opts[:service_name] = name
|
33
|
+
}
|
34
|
+
op.parse(ARGV)
|
35
|
+
if opts[:service_name] == nil
|
36
|
+
raise "Error: No Windows Service name set. Use '--service-name'"
|
37
|
+
end
|
38
|
+
|
39
|
+
def read_fluentdopt(service_name)
|
40
|
+
require 'win32/Registry'
|
41
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open("SYSTEM\\CurrentControlSet\\Services\\#{service_name}") do |reg|
|
42
|
+
reg.read("fluentdopt")[1] rescue ""
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def service_main_start(service_name)
|
47
|
+
ruby_path = 0.chr * 260
|
48
|
+
GetModuleFileName.call(0, ruby_path,260)
|
49
|
+
ruby_path = ruby_path.rstrip.gsub(/\\/, '/')
|
50
|
+
rubybin_dir = ruby_path[0, ruby_path.rindex("/")]
|
51
|
+
opt = read_fluentdopt(service_name)
|
52
|
+
Process.spawn("\"#{rubybin_dir}/ruby.exe\" \"#{rubybin_dir}/fluentd\" #{opt} -x #{service_name}")
|
53
|
+
end
|
54
|
+
|
55
|
+
class FluentdService < Daemon
|
56
|
+
@pid = 0
|
57
|
+
@service_name = ''
|
58
|
+
|
59
|
+
def initialize(service_name)
|
60
|
+
@service_name = service_name
|
61
|
+
end
|
62
|
+
|
63
|
+
def service_main
|
64
|
+
|
65
|
+
@pid = service_main_start(@service_name)
|
66
|
+
while running?
|
67
|
+
sleep 10
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def service_stop
|
72
|
+
ev = Win32::Event.open(@service_name)
|
73
|
+
ev.set
|
74
|
+
ev.close
|
75
|
+
if @pid > 0
|
76
|
+
Process.waitpid(@pid)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
FluentdService.new(opts[:service_name]).mainloop
|
82
|
+
|
83
|
+
rescue Exception => err
|
84
|
+
raise
|
85
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# <%= gem_name %>
|
2
|
+
|
3
|
+
[Fluentd](https://fluentd.org/) <%= type %> plugin to do something.
|
4
|
+
|
5
|
+
TODO: write description for you plugin.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
### RubyGems
|
10
|
+
|
11
|
+
```
|
12
|
+
$ gem install <%= gem_name %>
|
13
|
+
```
|
14
|
+
|
15
|
+
### Bundler
|
16
|
+
|
17
|
+
Add following line to your Gemfile:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem "<%= gem_name %>"
|
21
|
+
```
|
22
|
+
|
23
|
+
And then execute:
|
24
|
+
|
25
|
+
```
|
26
|
+
$ bundle
|
27
|
+
```
|
28
|
+
|
29
|
+
## Configuration
|
30
|
+
|
31
|
+
You can generate configuration template:
|
32
|
+
|
33
|
+
```
|
34
|
+
$ fluent-plugin-config-format <%= type %> <%= name %>
|
35
|
+
```
|
36
|
+
|
37
|
+
You can copy and paste generated documents here.
|
38
|
+
|
39
|
+
## Copyright
|
40
|
+
|
41
|
+
* Copyright(c) <%= Date.today.year %>- <%= user_name %>
|
42
|
+
* License
|
43
|
+
* <%= @license.full_name %>
|