fluentd222 1.16.2-x86_64-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.deepsource.toml +13 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +71 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +39 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/stale-actions.yml +24 -0
- data/.github/workflows/test-ruby-head.yaml +31 -0
- data/.github/workflows/test.yaml +32 -0
- data/.gitignore +30 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2720 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/Gemfile +9 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +13 -0
- data/README.md +75 -0
- data/Rakefile +79 -0
- data/SECURITY.md +14 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -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 +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- 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_sd.conf +17 -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/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/fluentd.gemspec +54 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +374 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -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 +721 -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/basic_parser.rb +123 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +44 -0
- data/lib/fluent/config/literal_parser.rb +286 -0
- data/lib/fluent/config/parser.rb +107 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +249 -0
- data/lib/fluent/config/v1_parser.rb +192 -0
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +108 -0
- data/lib/fluent/config/yaml_parser/parser.rb +166 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +201 -0
- data/lib/fluent/counter/base_socket.rb +44 -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 +13 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +253 -0
- data/lib/fluent/env.rb +40 -0
- data/lib/fluent/error.rb +37 -0
- data/lib/fluent/event.rb +330 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +34 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +752 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +104 -0
- data/lib/fluent/plugin/base.rb +214 -0
- data/lib/fluent/plugin/buf_file.rb +242 -0
- data/lib/fluent/plugin/buf_file_single.rb +254 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +240 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +310 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +941 -0
- data/lib/fluent/plugin/compressable.rb +96 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/filter.rb +127 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +130 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +78 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +59 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +53 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +110 -0
- data/lib/fluent/plugin/in_forward.rb +473 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +677 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +141 -0
- data/lib/fluent/plugin/in_syslog.rb +276 -0
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1299 -0
- data/lib/fluent/plugin/in_tcp.rb +226 -0
- data/lib/fluent/plugin/in_udp.rb +92 -0
- data/lib/fluent/plugin/in_unix.rb +195 -0
- data/lib/fluent/plugin/input.rb +75 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +195 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +340 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +142 -0
- data/lib/fluent/plugin/out_forward.rb +826 -0
- data/lib/fluent/plugin/out_http.rb +275 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +148 -0
- data/lib/fluent/plugin/out_stdout.rb +74 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1603 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -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 +114 -0
- data/lib/fluent/plugin/parser_json.rb +96 -0
- data/lib/fluent/plugin/parser_ltsv.rb +51 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -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 +496 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/sd_file.rb +156 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +162 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +191 -0
- data/lib/fluent/plugin_helper/child_process.rb +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +100 -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 +92 -0
- data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -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 +94 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +135 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +129 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +219 -0
- data/lib/fluent/plugin_helper/server.rb +828 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1076 -0
- data/lib/fluent/system_config.rb +189 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -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 +61 -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/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +134 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +44 -0
- data/lib/fluent/test.rb +58 -0
- data/lib/fluent/time.rb +512 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +81 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +100 -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/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +7 -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/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -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 +362 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_cap_ctl.rb +100 -0
- data/test/command/test_cat.rb +128 -0
- data/test/command/test_ctl.rb +56 -0
- data/test/command/test_fluentd.rb +1291 -0
- data/test/command/test_plugin_config_formatter.rb +397 -0
- data/test/command/test_plugin_generator.rb +109 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/assertions.rb +42 -0
- data/test/config/test_config_parser.rb +551 -0
- data/test/config/test_configurable.rb +1784 -0
- data/test/config/test_configure_proxy.rb +604 -0
- data/test/config/test_dsl.rb +415 -0
- data/test/config/test_element.rb +518 -0
- data/test/config/test_literal_parser.rb +309 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +191 -0
- data/test/config/test_system_config.rb +195 -0
- data/test/config/test_types.rb +408 -0
- data/test/counter/test_client.rb +563 -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 +155 -0
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/helpers/process_extenstion.rb +33 -0
- data/test/log/test_console_adapter.rb +110 -0
- data/test/plugin/data/2010/01/20100102-030405.log +0 -0
- data/test/plugin/data/2010/01/20100102-030406.log +0 -0
- data/test/plugin/data/2010/01/20100102.log +0 -0
- data/test/plugin/data/log/bar +0 -0
- data/test/plugin/data/log/foo/bar.log +0 -0
- data/test/plugin/data/log/foo/bar2 +0 -0
- data/test/plugin/data/log/test.log +0 -0
- data/test/plugin/data/sd_file/config +11 -0
- data/test/plugin/data/sd_file/config.json +17 -0
- data/test/plugin/data/sd_file/config.yaml +11 -0
- data/test/plugin/data/sd_file/config.yml +11 -0
- data/test/plugin/data/sd_file/invalid_config.yml +7 -0
- data/test/plugin/in_tail/test_fifo.rb +121 -0
- data/test/plugin/in_tail/test_io_handler.rb +150 -0
- data/test/plugin/in_tail/test_position_file.rb +346 -0
- data/test/plugin/out_forward/test_ack_handler.rb +140 -0
- data/test/plugin/out_forward/test_connection_manager.rb +145 -0
- data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
- data/test/plugin/out_forward/test_load_balancer.rb +106 -0
- data/test/plugin/out_forward/test_socket_cache.rb +174 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +247 -0
- data/test/plugin/test_buf_file.rb +1314 -0
- data/test/plugin/test_buf_file_single.rb +898 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1434 -0
- data/test/plugin/test_buffer_chunk.rb +209 -0
- data/test/plugin/test_buffer_file_chunk.rb +871 -0
- data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
- data/test/plugin/test_buffer_memory_chunk.rb +339 -0
- data/test/plugin/test_compressable.rb +87 -0
- data/test/plugin/test_file_util.rb +96 -0
- data/test/plugin/test_filter.rb +368 -0
- data/test/plugin/test_filter_grep.rb +697 -0
- data/test/plugin/test_filter_parser.rb +731 -0
- data/test/plugin/test_filter_record_transformer.rb +577 -0
- data/test/plugin/test_filter_stdout.rb +207 -0
- data/test/plugin/test_formatter_csv.rb +136 -0
- data/test/plugin/test_formatter_hash.rb +38 -0
- data/test/plugin/test_formatter_json.rb +61 -0
- data/test/plugin/test_formatter_ltsv.rb +70 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +116 -0
- data/test/plugin/test_formatter_single_value.rb +44 -0
- data/test/plugin/test_formatter_tsv.rb +76 -0
- data/test/plugin/test_in_debug_agent.rb +49 -0
- data/test/plugin/test_in_exec.rb +261 -0
- data/test/plugin/test_in_forward.rb +1178 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1102 -0
- data/test/plugin/test_in_monitor_agent.rb +922 -0
- data/test/plugin/test_in_object_space.rb +66 -0
- data/test/plugin/test_in_sample.rb +190 -0
- data/test/plugin/test_in_syslog.rb +505 -0
- data/test/plugin/test_in_tail.rb +3125 -0
- data/test/plugin/test_in_tcp.rb +328 -0
- data/test/plugin/test_in_udp.rb +296 -0
- data/test/plugin/test_in_unix.rb +181 -0
- data/test/plugin/test_input.rb +137 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_metrics.rb +294 -0
- data/test/plugin/test_metrics_local.rb +96 -0
- data/test/plugin/test_multi_output.rb +204 -0
- data/test/plugin/test_out_copy.rb +308 -0
- data/test/plugin/test_out_exec.rb +312 -0
- data/test/plugin/test_out_exec_filter.rb +606 -0
- data/test/plugin/test_out_file.rb +1038 -0
- data/test/plugin/test_out_forward.rb +1361 -0
- data/test/plugin/test_out_http.rb +429 -0
- 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 +146 -0
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +205 -0
- data/test/plugin/test_out_stream.rb +103 -0
- data/test/plugin/test_output.rb +1334 -0
- data/test/plugin/test_output_as_buffered.rb +2024 -0
- data/test/plugin/test_output_as_buffered_backup.rb +363 -0
- data/test/plugin/test_output_as_buffered_compress.rb +179 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +966 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +34 -0
- data/test/plugin/test_parser.rb +399 -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 +200 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +160 -0
- data/test/plugin/test_parser_multiline.rb +111 -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 +284 -0
- data/test/plugin/test_parser_syslog.rb +650 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_sd_file.rb +228 -0
- data/test/plugin/test_sd_srv.rb +230 -0
- data/test/plugin/test_storage.rb +166 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin/test_string_util.rb +26 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -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/data/cert/cert_chains/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
- data/test/plugin_helper/data/cert/empty.pem +0 -0
- data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
- data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
- data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
- data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -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/service_discovery/test_manager.rb +93 -0
- data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
- data/test/plugin_helper/test_cert_option.rb +25 -0
- data/test/plugin_helper/test_child_process.rb +862 -0
- data/test/plugin_helper/test_compat_parameters.rb +358 -0
- data/test/plugin_helper/test_event_emitter.rb +80 -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 +372 -0
- data/test/plugin_helper/test_inject.rb +561 -0
- data/test/plugin_helper/test_metrics.rb +137 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +238 -0
- data/test/plugin_helper/test_retry_state.rb +1006 -0
- data/test/plugin_helper/test_server.rb +1895 -0
- data/test/plugin_helper/test_service_discovery.rb +165 -0
- data/test/plugin_helper/test_socket.rb +146 -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 +130 -0
- data/test/scripts/exec_script.rb +32 -0
- 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/formatter_known.rb +8 -0
- data/test/scripts/fluent/plugin/out_test.rb +81 -0
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/scripts/fluent/plugin/parser_known.rb +4 -0
- data/test/test_capability.rb +74 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +369 -0
- data/test/test_configdsl.rb +148 -0
- data/test/test_daemonizer.rb +91 -0
- data/test/test_engine.rb +203 -0
- data/test/test_event.rb +531 -0
- data/test/test_event_router.rb +348 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_file_wrapper.rb +53 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +369 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +1076 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +50 -0
- data/test/test_oj_options.rb +55 -0
- data/test/test_output.rb +278 -0
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +370 -0
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +119 -0
- data/test/test_process.rb +14 -0
- data/test/test_root_agent.rb +951 -0
- data/test/test_static_config_analysis.rb +177 -0
- data/test/test_supervisor.rb +821 -0
- data/test/test_test_drivers.rb +136 -0
- data/test/test_time_formatter.rb +301 -0
- data/test/test_time_parser.rb +362 -0
- data/test/test_tls.rb +65 -0
- data/test/test_unique_id.rb +47 -0
- data/test/test_variable_store.rb +65 -0
- metadata +1183 -0
@@ -0,0 +1,44 @@
|
|
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 'serverengine'
|
18
|
+
require 'fileutils'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Test
|
22
|
+
module StartupShutdown
|
23
|
+
def startup
|
24
|
+
@server = ServerEngine::SocketManager::Server.open
|
25
|
+
ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @server.path.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
def shutdown
|
29
|
+
@server.close
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.setup
|
33
|
+
@server = ServerEngine::SocketManager::Server.open
|
34
|
+
ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = @server.path.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.teardown
|
38
|
+
@server.close
|
39
|
+
# on Windows, the path is a TCP port number
|
40
|
+
FileUtils.rm_f @server.path unless Fluent.windows?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/fluent/test.rb
ADDED
@@ -0,0 +1,58 @@
|
|
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 'test/unit'
|
18
|
+
require 'fluent/env' # for Fluent.windows?
|
19
|
+
require 'fluent/test/log'
|
20
|
+
require 'fluent/test/base'
|
21
|
+
require 'fluent/test/input_test'
|
22
|
+
require 'fluent/test/output_test'
|
23
|
+
require 'fluent/test/filter_test'
|
24
|
+
require 'fluent/test/parser_test'
|
25
|
+
require 'fluent/test/formatter_test'
|
26
|
+
require 'serverengine'
|
27
|
+
|
28
|
+
|
29
|
+
module Fluent
|
30
|
+
module Test
|
31
|
+
def self.dummy_logger
|
32
|
+
dl_opts = {log_level: ServerEngine::DaemonLogger::INFO}
|
33
|
+
logdev = Fluent::Test::DummyLogDevice.new
|
34
|
+
logger = ServerEngine::DaemonLogger.new(logdev, dl_opts)
|
35
|
+
Fluent::Log.new(logger)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.setup
|
39
|
+
ENV['SERVERENGINE_WORKER_ID'] = '0'
|
40
|
+
|
41
|
+
$log = dummy_logger
|
42
|
+
|
43
|
+
Fluent.__send__(:remove_const, :Engine)
|
44
|
+
engine = Fluent.const_set(:Engine, EngineClass.new).init(SystemConfig.new)
|
45
|
+
|
46
|
+
engine.define_singleton_method(:now=) {|n|
|
47
|
+
@now = n
|
48
|
+
}
|
49
|
+
engine.define_singleton_method(:now) {
|
50
|
+
@now ||= super()
|
51
|
+
}
|
52
|
+
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
$log ||= Fluent::Test.dummy_logger
|
data/lib/fluent/time.rb
ADDED
@@ -0,0 +1,512 @@
|
|
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
|
+
alias :to_i :to_int
|
54
|
+
|
55
|
+
def to_f
|
56
|
+
@sec + @nsec / 1_000_000_000.0
|
57
|
+
end
|
58
|
+
|
59
|
+
# for Time.at
|
60
|
+
def to_r
|
61
|
+
Rational(@sec * 1_000_000_000 + @nsec, 1_000_000_000)
|
62
|
+
end
|
63
|
+
|
64
|
+
# for > and others
|
65
|
+
def coerce(other)
|
66
|
+
[other, @sec]
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
@sec.to_s
|
71
|
+
end
|
72
|
+
|
73
|
+
begin
|
74
|
+
# ruby 2.5 or later
|
75
|
+
Time.at(0, 0, :nanosecond)
|
76
|
+
|
77
|
+
def to_time
|
78
|
+
Time.at(@sec, @nsec, :nanosecond)
|
79
|
+
end
|
80
|
+
rescue
|
81
|
+
def to_time
|
82
|
+
Time.at(Rational(@sec * 1_000_000_000 + @nsec, 1_000_000_000))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_json(*args)
|
87
|
+
@sec.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
def to_msgpack(io = nil)
|
91
|
+
@sec.to_msgpack(io)
|
92
|
+
end
|
93
|
+
|
94
|
+
def to_msgpack_ext
|
95
|
+
[@sec, @nsec].pack('NN')
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.from_msgpack_ext(data)
|
99
|
+
new(*data.unpack('NN'))
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.from_time(time)
|
103
|
+
Fluent::EventTime.new(time.to_i, time.nsec)
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.eq?(a, b)
|
107
|
+
if a.is_a?(Fluent::EventTime) && b.is_a?(Fluent::EventTime)
|
108
|
+
a.sec == b.sec && a.nsec == b.nsec
|
109
|
+
else
|
110
|
+
a == b
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.now
|
115
|
+
# This method is called many time. so call Process.clock_gettime directly instead of Fluent::Clock.real_now
|
116
|
+
now = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond)
|
117
|
+
Fluent::EventTime.new(now / 1_000_000_000, now % 1_000_000_000)
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.parse(*args)
|
121
|
+
from_time(Time.parse(*args))
|
122
|
+
end
|
123
|
+
|
124
|
+
## TODO: For performance, implement +, -, and so on
|
125
|
+
def method_missing(name, *args, &block)
|
126
|
+
@sec.send(name, *args, &block)
|
127
|
+
end
|
128
|
+
|
129
|
+
def inspect
|
130
|
+
FORMATTER.exec(Time.at(self))
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
module TimeMixin
|
135
|
+
TIME_TYPES = ['string', 'unixtime', 'float', 'mixed']
|
136
|
+
|
137
|
+
TIME_PARAMETERS = [
|
138
|
+
[:time_format, :string, {default: nil}],
|
139
|
+
[:localtime, :bool, {default: true}], # UTC if :localtime is false and :timezone is nil
|
140
|
+
[:utc, :bool, {default: false}], # to turn :localtime false
|
141
|
+
[:timezone, :string, {default: nil}],
|
142
|
+
[:time_format_fallbacks, :array, {default: []}], # try time_format, then try fallbacks
|
143
|
+
]
|
144
|
+
TIME_FULL_PARAMETERS = [
|
145
|
+
# To avoid to define :time_type twice (in plugin_helper/inject)
|
146
|
+
[:time_type, :enum, {default: :string, list: TIME_TYPES.map(&:to_sym)}],
|
147
|
+
] + TIME_PARAMETERS
|
148
|
+
|
149
|
+
module TimeParameters
|
150
|
+
include Fluent::Configurable
|
151
|
+
TIME_FULL_PARAMETERS.each do |name, type, opts|
|
152
|
+
config_param(name, type, **opts)
|
153
|
+
end
|
154
|
+
|
155
|
+
def configure(conf)
|
156
|
+
if conf.has_key?('localtime') || conf.has_key?('utc')
|
157
|
+
if conf.has_key?('localtime')
|
158
|
+
conf['localtime'] = Fluent::Config.bool_value(conf['localtime'])
|
159
|
+
elsif conf.has_key?('utc')
|
160
|
+
conf['localtime'] = !(Fluent::Config.bool_value(conf['utc']))
|
161
|
+
# Specifying "localtime false" means using UTC in TimeFormatter
|
162
|
+
# And specifying "utc" is different from specifying "timezone +0000"(it's not always UTC).
|
163
|
+
# There are difference between "Z" and "+0000" in timezone formatting.
|
164
|
+
# TODO: add kwargs to TimeFormatter to specify "using localtime", "using UTC" or "using specified timezone" in more explicit way
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
super
|
169
|
+
|
170
|
+
if conf.has_key?('localtime') && conf.has_key?('utc') && !(@localtime ^ @utc)
|
171
|
+
raise Fluent::ConfigError, "both of utc and localtime are specified, use only one of them"
|
172
|
+
end
|
173
|
+
|
174
|
+
if conf.has_key?('time_type') and @time_type == :mixed
|
175
|
+
if @time_format.nil? and @time_format_fallbacks.empty?
|
176
|
+
raise Fluent::ConfigError, "time_type is :mixed but time_format and time_format_fallbacks is empty."
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
Fluent::Timezone.validate!(@timezone) if @timezone
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
module Parser
|
185
|
+
def self.included(mod)
|
186
|
+
mod.include TimeParameters
|
187
|
+
end
|
188
|
+
|
189
|
+
def time_parser_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
|
190
|
+
return MixedTimeParser.new(type, format, @localtime, timezone, @utc, force_localtime, @time_format_fallbacks) if type == :mixed
|
191
|
+
return NumericTimeParser.new(type) if type != :string
|
192
|
+
return TimeParser.new(format, true, nil) if force_localtime
|
193
|
+
|
194
|
+
localtime = @localtime && (timezone.nil? && !@utc)
|
195
|
+
TimeParser.new(format, localtime, timezone)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
module Formatter
|
200
|
+
def self.included(mod)
|
201
|
+
mod.include TimeParameters
|
202
|
+
end
|
203
|
+
|
204
|
+
def time_formatter_create(type: @time_type, format: @time_format, timezone: @timezone, force_localtime: false)
|
205
|
+
return NumericTimeFormatter.new(type) if type != :string
|
206
|
+
return TimeFormatter.new(format, true, nil) if force_localtime
|
207
|
+
|
208
|
+
localtime = @localtime && (timezone.nil? && !@utc)
|
209
|
+
TimeFormatter.new(format, localtime, timezone)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
class TimeParser
|
215
|
+
class TimeParseError < StandardError; end
|
216
|
+
|
217
|
+
def initialize(format = nil, localtime = true, timezone = nil)
|
218
|
+
if format.nil? && (timezone || !localtime)
|
219
|
+
raise Fluent::ConfigError, "specifying timezone requires time format"
|
220
|
+
end
|
221
|
+
|
222
|
+
@cache1_key = nil
|
223
|
+
@cache1_time = nil
|
224
|
+
@cache2_key = nil
|
225
|
+
@cache2_time = nil
|
226
|
+
|
227
|
+
format_with_timezone = format && (format.include?("%z") || format.include?("%Z"))
|
228
|
+
|
229
|
+
utc_offset = case
|
230
|
+
when format_with_timezone then
|
231
|
+
nil
|
232
|
+
when timezone then
|
233
|
+
Fluent::Timezone.utc_offset(timezone)
|
234
|
+
when localtime then
|
235
|
+
nil
|
236
|
+
else
|
237
|
+
0 # utc
|
238
|
+
end
|
239
|
+
|
240
|
+
strptime = format && (Strptime.new(format) rescue nil)
|
241
|
+
|
242
|
+
@parse = case
|
243
|
+
when format_with_timezone && strptime then ->(v){ Fluent::EventTime.from_time(strptime.exec(v)) }
|
244
|
+
when format_with_timezone then ->(v){ Fluent::EventTime.from_time(Time.strptime(v, format)) }
|
245
|
+
when format == '%iso8601' then ->(v){ Fluent::EventTime.from_time(Time.iso8601(v)) }
|
246
|
+
when strptime then
|
247
|
+
if utc_offset.nil?
|
248
|
+
->(v){ t = strptime.exec(v); Fluent::EventTime.new(t.to_i, t.nsec) }
|
249
|
+
elsif utc_offset.respond_to?(:call)
|
250
|
+
->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset.call(t), t.nsec) }
|
251
|
+
else
|
252
|
+
->(v) { t = strptime.exec(v); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset, t.nsec) }
|
253
|
+
end
|
254
|
+
when format then
|
255
|
+
if utc_offset.nil?
|
256
|
+
->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i, t.nsec) }
|
257
|
+
elsif utc_offset.respond_to?(:call)
|
258
|
+
->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset.call(t), t.nsec) }
|
259
|
+
else
|
260
|
+
->(v){ t = Time.strptime(v, format); Fluent::EventTime.new(t.to_i + t.utc_offset - utc_offset, t.nsec) }
|
261
|
+
end
|
262
|
+
else ->(v){ Fluent::EventTime.parse(v) }
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
# TODO: new cache mechanism using format string
|
267
|
+
def parse(value)
|
268
|
+
unless value.is_a?(String)
|
269
|
+
raise TimeParseError, "value must be string: #{value}"
|
270
|
+
end
|
271
|
+
|
272
|
+
if @cache1_key == value
|
273
|
+
return @cache1_time
|
274
|
+
elsif @cache2_key == value
|
275
|
+
return @cache2_time
|
276
|
+
else
|
277
|
+
begin
|
278
|
+
time = @parse.call(value)
|
279
|
+
rescue => e
|
280
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
281
|
+
end
|
282
|
+
@cache1_key = @cache2_key
|
283
|
+
@cache1_time = @cache2_time
|
284
|
+
@cache2_key = value
|
285
|
+
@cache2_time = time
|
286
|
+
return time
|
287
|
+
end
|
288
|
+
end
|
289
|
+
alias :call :parse
|
290
|
+
end
|
291
|
+
|
292
|
+
class NumericTimeParser < TimeParser # to include TimeParseError
|
293
|
+
def initialize(type, localtime = nil, timezone = nil)
|
294
|
+
@cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
|
295
|
+
|
296
|
+
if type == :unixtime
|
297
|
+
define_singleton_method(:parse, method(:parse_unixtime))
|
298
|
+
define_singleton_method(:call, method(:parse_unixtime))
|
299
|
+
else # :float
|
300
|
+
define_singleton_method(:parse, method(:parse_float))
|
301
|
+
define_singleton_method(:call, method(:parse_float))
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def parse_unixtime(value)
|
306
|
+
unless value.is_a?(String) || value.is_a?(Numeric)
|
307
|
+
raise TimeParseError, "value must be a string or a number: #{value}(#{value.class})"
|
308
|
+
end
|
309
|
+
|
310
|
+
if @cache1_key == value
|
311
|
+
return @cache1_time
|
312
|
+
elsif @cache2_key == value
|
313
|
+
return @cache2_time
|
314
|
+
end
|
315
|
+
|
316
|
+
begin
|
317
|
+
time = Fluent::EventTime.new(value.to_i)
|
318
|
+
rescue => e
|
319
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
320
|
+
end
|
321
|
+
@cache1_key = @cache2_key
|
322
|
+
@cache1_time = @cache2_time
|
323
|
+
@cache2_key = value
|
324
|
+
@cache2_time = time
|
325
|
+
time
|
326
|
+
end
|
327
|
+
|
328
|
+
# rough benchmark result to compare handmade parser vs Fluent::EventTime.from_time(Time.at(value.to_r))
|
329
|
+
# full: with 9-digits of nsec after dot
|
330
|
+
# msec: with 3-digits of msec after dot
|
331
|
+
# 10_000_000 times loop on MacBookAir
|
332
|
+
## parse_by_myself(full): 12.162475 sec
|
333
|
+
## parse_by_myself(msec): 15.050435 sec
|
334
|
+
## parse_by_to_r (full): 28.722362 sec
|
335
|
+
## parse_by_to_r (msec): 28.232856 sec
|
336
|
+
def parse_float(value)
|
337
|
+
unless value.is_a?(String) || value.is_a?(Numeric)
|
338
|
+
raise TimeParseError, "value must be a string or a number: #{value}(#{value.class})"
|
339
|
+
end
|
340
|
+
|
341
|
+
if @cache1_key == value
|
342
|
+
return @cache1_time
|
343
|
+
elsif @cache2_key == value
|
344
|
+
return @cache2_time
|
345
|
+
end
|
346
|
+
|
347
|
+
begin
|
348
|
+
sec_s, nsec_s, _ = value.to_s.split('.', 3) # throw away second-dot and later
|
349
|
+
nsec_s = nsec_s && nsec_s[0..9] || '0'
|
350
|
+
nsec_s += '0' * (9 - nsec_s.size) if nsec_s.size < 9
|
351
|
+
time = Fluent::EventTime.new(sec_s.to_i, nsec_s.to_i)
|
352
|
+
rescue => e
|
353
|
+
raise TimeParseError, "invalid time format: value = #{value}, error_class = #{e.class.name}, error = #{e.message}"
|
354
|
+
end
|
355
|
+
@cache1_key = @cache2_key
|
356
|
+
@cache1_time = @cache2_time
|
357
|
+
@cache2_key = value
|
358
|
+
@cache2_time = time
|
359
|
+
time
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
class TimeFormatter
|
364
|
+
def initialize(format = nil, localtime = true, timezone = nil)
|
365
|
+
@tc1 = 0
|
366
|
+
@tc1_str = nil
|
367
|
+
@tc2 = 0
|
368
|
+
@tc2_str = nil
|
369
|
+
|
370
|
+
strftime = format && (Strftime.new(format) rescue nil)
|
371
|
+
if format && format =~ /(^|[^%])(%%)*%L|(^|[^%])(%%)*%\d*N/
|
372
|
+
define_singleton_method(:format, method(:format_with_subsec))
|
373
|
+
define_singleton_method(:call, method(:format_with_subsec))
|
374
|
+
else
|
375
|
+
define_singleton_method(:format, method(:format_without_subsec))
|
376
|
+
define_singleton_method(:call, method(:format_without_subsec))
|
377
|
+
end
|
378
|
+
|
379
|
+
formatter = Fluent::Timezone.formatter(timezone, strftime ? strftime : format)
|
380
|
+
@format_nocache = case
|
381
|
+
when formatter then formatter
|
382
|
+
when strftime && localtime then ->(time){ strftime.exec(Time.at(time)) }
|
383
|
+
when format && localtime then ->(time){ Time.at(time).strftime(format) }
|
384
|
+
when strftime then ->(time){ strftime.exec(Time.at(time).utc) }
|
385
|
+
when format then ->(time){ Time.at(time).utc.strftime(format) }
|
386
|
+
when localtime then ->(time){ Time.at(time).iso8601 }
|
387
|
+
else ->(time){ Time.at(time).utc.iso8601 }
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def format_without_subsec(time)
|
392
|
+
if @tc1 == time
|
393
|
+
return @tc1_str
|
394
|
+
elsif @tc2 == time
|
395
|
+
return @tc2_str
|
396
|
+
else
|
397
|
+
str = format_nocache(time)
|
398
|
+
if @tc1 < @tc2
|
399
|
+
@tc1 = time
|
400
|
+
@tc1_str = str
|
401
|
+
else
|
402
|
+
@tc2 = time
|
403
|
+
@tc2_str = str
|
404
|
+
end
|
405
|
+
return str
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def format_with_subsec(time)
|
410
|
+
if Fluent::EventTime.eq?(@tc1, time)
|
411
|
+
return @tc1_str
|
412
|
+
elsif Fluent::EventTime.eq?(@tc2, time)
|
413
|
+
return @tc2_str
|
414
|
+
else
|
415
|
+
str = format_nocache(time)
|
416
|
+
if @tc1 < @tc2
|
417
|
+
@tc1 = time
|
418
|
+
@tc1_str = str
|
419
|
+
else
|
420
|
+
@tc2 = time
|
421
|
+
@tc2_str = str
|
422
|
+
end
|
423
|
+
return str
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
## Dynamically defined in #initialize
|
428
|
+
# def format(time)
|
429
|
+
# end
|
430
|
+
|
431
|
+
def format_nocache(time)
|
432
|
+
@format_nocache.call(time)
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
class NumericTimeFormatter < TimeFormatter
|
437
|
+
def initialize(type, localtime = nil, timezone = nil)
|
438
|
+
@cache1_key = @cache1_time = @cache2_key = @cache2_time = nil
|
439
|
+
|
440
|
+
if type == :unixtime
|
441
|
+
define_singleton_method(:format, method(:format_unixtime))
|
442
|
+
define_singleton_method(:call, method(:format_unixtime))
|
443
|
+
else # :float
|
444
|
+
define_singleton_method(:format, method(:format_float))
|
445
|
+
define_singleton_method(:call, method(:format_float))
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
def format_unixtime(time)
|
450
|
+
time.to_i.to_s
|
451
|
+
end
|
452
|
+
|
453
|
+
def format_float(time)
|
454
|
+
if time.is_a?(Fluent::EventTime) || time.is_a?(Time)
|
455
|
+
# 10.015 secs for 10_000_000 times call on MacBookAir
|
456
|
+
nsec_s = time.nsec.to_s
|
457
|
+
nsec_s = '0' * (9 - nsec_s.size) if nsec_s.size < 9
|
458
|
+
"#{time.sec}.#{nsec_s}"
|
459
|
+
else # integer (or float?)
|
460
|
+
time.to_f.to_s
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
|
465
|
+
# MixedTimeParser is available when time_type is set to :mixed
|
466
|
+
#
|
467
|
+
# Use Case 1: primary format is specified explicitly in time_format
|
468
|
+
# time_type mixed
|
469
|
+
# time_format %iso8601
|
470
|
+
# time_format_fallbacks unixtime
|
471
|
+
# Use Case 2: time_format is omitted
|
472
|
+
# time_type mixed
|
473
|
+
# time_format_fallbacks %iso8601, unixtime
|
474
|
+
#
|
475
|
+
class MixedTimeParser < TimeParser # to include TimeParseError
|
476
|
+
def initialize(type, format = nil, localtime = nil, timezone = nil, utc = nil, force_localtime = nil, fallbacks = [])
|
477
|
+
@parsers = []
|
478
|
+
fallbacks.unshift(format).each do |fallback|
|
479
|
+
next unless fallback
|
480
|
+
case fallback
|
481
|
+
when 'unixtime', 'float'
|
482
|
+
@parsers << NumericTimeParser.new(fallback, localtime, timezone)
|
483
|
+
else
|
484
|
+
if force_localtime
|
485
|
+
@parsers << TimeParser.new(fallback, true, nil)
|
486
|
+
else
|
487
|
+
localtime = localtime && (timezone.nil? && !utc)
|
488
|
+
@parsers << TimeParser.new(fallback, localtime, timezone)
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
494
|
+
def parse(value)
|
495
|
+
@parsers.each do |parser|
|
496
|
+
begin
|
497
|
+
Float(value) if parser.class == Fluent::NumericTimeParser
|
498
|
+
rescue
|
499
|
+
next
|
500
|
+
end
|
501
|
+
begin
|
502
|
+
return parser.parse(value)
|
503
|
+
rescue
|
504
|
+
# skip TimeParseError
|
505
|
+
end
|
506
|
+
end
|
507
|
+
fallback_class = @parsers.collect do |parser| parser.class end.join(",")
|
508
|
+
raise TimeParseError, "invalid time format: value = #{value}, even though fallbacks: #{fallback_class}"
|
509
|
+
end
|
510
|
+
end
|
511
|
+
|
512
|
+
end
|