fluentd 1.14.4-x64-mingw-ucrt
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 +7 -0
- data/.deepsource.toml +13 -0
- data/.drone.yml +35 -0
- data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- data/.github/workflows/issue-auto-closer.yml +12 -0
- data/.github/workflows/linux-test.yaml +36 -0
- data/.github/workflows/macos-test.yaml +30 -0
- data/.github/workflows/stale-actions.yml +22 -0
- data/.github/workflows/windows-test.yaml +46 -0
- data/.gitignore +30 -0
- data/.gitlab-ci.yml +103 -0
- data/ADOPTERS.md +5 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +2409 -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 +11 -0
- data/README.md +97 -0
- data/Rakefile +79 -0
- data/SECURITY.md +18 -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 +55 -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 +177 -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 +32 -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.rb +76 -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 +15 -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 +34 -0
- data/lib/fluent/event.rb +326 -0
- data/lib/fluent/event_router.rb +297 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +141 -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.rb +713 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +106 -0
- data/lib/fluent/oj_options.rb +62 -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 +197 -0
- data/lib/fluent/plugin/buf_file.rb +213 -0
- data/lib/fluent/plugin/buf_file_single.rb +225 -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 +311 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +918 -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/file_wrapper.rb +187 -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 +667 -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/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail.rb +1228 -0
- data/lib/fluent/plugin/in_tcp.rb +181 -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 +334 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -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 +140 -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 +131 -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 +1556 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +275 -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 +366 -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 +93 -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 +209 -0
- data/lib/fluent/plugin_helper/server.rb +801 -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 +277 -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 +116 -0
- data/lib/fluent/root_agent.rb +372 -0
- data/lib/fluent/rpc.rb +94 -0
- data/lib/fluent/static_config_analysis.rb +194 -0
- data/lib/fluent/supervisor.rb +1054 -0
- data/lib/fluent/system_config.rb +187 -0
- data/lib/fluent/test/base.rb +78 -0
- data/lib/fluent/test/driver/base.rb +225 -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 +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/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 +46 -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/winsvc.rb +103 -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 +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/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 +57 -0
- data/test/command/test_fluentd.rb +1106 -0
- data/test/command/test_plugin_config_formatter.rb +398 -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 +199 -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/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 +140 -0
- data/test/plugin/in_tail/test_position_file.rb +379 -0
- data/test/plugin/out_forward/test_ack_handler.rb +101 -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 +149 -0
- data/test/plugin/test_bare_output.rb +131 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +1275 -0
- data/test/plugin/test_buf_file_single.rb +833 -0
- data/test/plugin/test_buf_memory.rb +42 -0
- data/test/plugin/test_buffer.rb +1383 -0
- data/test/plugin/test_buffer_chunk.rb +198 -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_file_wrapper.rb +126 -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 +1180 -0
- data/test/plugin/test_in_gc_stat.rb +62 -0
- data/test/plugin/test_in_http.rb +1080 -0
- data/test/plugin/test_in_monitor_agent.rb +923 -0
- data/test/plugin/test_in_object_space.rb +60 -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 +2363 -0
- data/test/plugin/test_in_tcp.rb +243 -0
- data/test/plugin/test_in_udp.rb +268 -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 +1037 -0
- data/test/plugin/test_out_forward.rb +1348 -0
- data/test/plugin/test_out_http.rb +428 -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 +1065 -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 +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +919 -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 +35 -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 +289 -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 +167 -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 +840 -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 +442 -0
- data/test/plugin_helper/test_server.rb +1823 -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 +202 -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 +331 -0
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +121 -0
- data/test/test_fluent_log_event_router.rb +99 -0
- data/test/test_formatter.rb +366 -0
- data/test/test_input.rb +31 -0
- data/test/test_log.rb +994 -0
- data/test/test_logger_initializer.rb +46 -0
- data/test/test_match.rb +148 -0
- data/test/test_mixin.rb +351 -0
- data/test/test_msgpack_factory.rb +18 -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 +601 -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 +1261 -0
@@ -0,0 +1,130 @@
|
|
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 'fluent/time'
|
18
|
+
require 'fluent/config/error'
|
19
|
+
require 'fluent/plugin/filter'
|
20
|
+
require 'fluent/plugin_helper/parser'
|
21
|
+
require 'fluent/plugin_helper/compat_parameters'
|
22
|
+
|
23
|
+
module Fluent::Plugin
|
24
|
+
class ParserFilter < Filter
|
25
|
+
Fluent::Plugin.register_filter('parser', self)
|
26
|
+
|
27
|
+
helpers :parser, :record_accessor, :compat_parameters
|
28
|
+
|
29
|
+
desc 'Specify field name in the record to parse.'
|
30
|
+
config_param :key_name, :string
|
31
|
+
desc 'Keep original key-value pair in parsed result.'
|
32
|
+
config_param :reserve_data, :bool, default: false
|
33
|
+
desc 'Keep original event time in parsed result.'
|
34
|
+
config_param :reserve_time, :bool, default: false
|
35
|
+
desc 'Remove "key_name" field from the record when parsing is succeeded'
|
36
|
+
config_param :remove_key_name_field, :bool, default: false
|
37
|
+
desc 'Store parsed values with specified key name prefix.'
|
38
|
+
config_param :inject_key_prefix, :string, default: nil
|
39
|
+
desc 'If true, invalid string is replaced with safe characters and re-parse it.'
|
40
|
+
config_param :replace_invalid_sequence, :bool, default: false
|
41
|
+
desc 'Store parsed values as a hash value in a field.'
|
42
|
+
config_param :hash_value_field, :string, default: nil
|
43
|
+
desc 'Emit invalid record to @ERROR label'
|
44
|
+
config_param :emit_invalid_record_to_error, :bool, default: true
|
45
|
+
|
46
|
+
attr_reader :parser
|
47
|
+
|
48
|
+
def configure(conf)
|
49
|
+
compat_parameters_convert(conf, :parser)
|
50
|
+
|
51
|
+
super
|
52
|
+
|
53
|
+
@accessor = record_accessor_create(@key_name)
|
54
|
+
@parser = parser_create
|
55
|
+
end
|
56
|
+
|
57
|
+
FAILED_RESULT = [nil, nil].freeze # reduce allocation cost
|
58
|
+
REPLACE_CHAR = '?'.freeze
|
59
|
+
|
60
|
+
def filter_with_time(tag, time, record)
|
61
|
+
raw_value = @accessor.call(record)
|
62
|
+
if raw_value.nil?
|
63
|
+
if @emit_invalid_record_to_error
|
64
|
+
router.emit_error_event(tag, time, record, ArgumentError.new("#{@key_name} does not exist"))
|
65
|
+
end
|
66
|
+
if @reserve_data
|
67
|
+
return time, handle_parsed(tag, record, time, {})
|
68
|
+
else
|
69
|
+
return FAILED_RESULT
|
70
|
+
end
|
71
|
+
end
|
72
|
+
begin
|
73
|
+
@parser.parse(raw_value) do |t, values|
|
74
|
+
if values
|
75
|
+
t = if @reserve_time
|
76
|
+
time
|
77
|
+
else
|
78
|
+
t.nil? ? time : t
|
79
|
+
end
|
80
|
+
@accessor.delete(record) if @remove_key_name_field
|
81
|
+
r = handle_parsed(tag, record, t, values)
|
82
|
+
return t, r
|
83
|
+
else
|
84
|
+
if @emit_invalid_record_to_error
|
85
|
+
router.emit_error_event(tag, time, record, Fluent::Plugin::Parser::ParserError.new("pattern not matched with data '#{raw_value}'"))
|
86
|
+
end
|
87
|
+
if @reserve_data
|
88
|
+
t = time
|
89
|
+
r = handle_parsed(tag, record, time, {})
|
90
|
+
return t, r
|
91
|
+
else
|
92
|
+
return FAILED_RESULT
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
rescue Fluent::Plugin::Parser::ParserError => e
|
97
|
+
if @emit_invalid_record_to_error
|
98
|
+
raise e
|
99
|
+
else
|
100
|
+
return FAILED_RESULT
|
101
|
+
end
|
102
|
+
rescue ArgumentError => e
|
103
|
+
raise unless @replace_invalid_sequence
|
104
|
+
raise unless e.message.index("invalid byte sequence in") == 0
|
105
|
+
|
106
|
+
raw_value = raw_value.scrub(REPLACE_CHAR)
|
107
|
+
retry
|
108
|
+
rescue => e
|
109
|
+
if @emit_invalid_record_to_error
|
110
|
+
raise Fluent::Plugin::Parser::ParserError, "parse failed #{e.message}"
|
111
|
+
else
|
112
|
+
return FAILED_RESULT
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def handle_parsed(tag, record, t, values)
|
120
|
+
if values && @inject_key_prefix
|
121
|
+
values = Hash[values.map { |k, v| [@inject_key_prefix + k, v] }]
|
122
|
+
end
|
123
|
+
r = @hash_value_field ? {@hash_value_field => values} : values
|
124
|
+
if @reserve_data
|
125
|
+
r = r ? record.merge(r) : record
|
126
|
+
end
|
127
|
+
r
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,324 @@
|
|
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 'socket'
|
18
|
+
require 'json'
|
19
|
+
require 'ostruct'
|
20
|
+
|
21
|
+
require 'fluent/plugin/filter'
|
22
|
+
require 'fluent/config/error'
|
23
|
+
require 'fluent/event'
|
24
|
+
require 'fluent/time'
|
25
|
+
|
26
|
+
module Fluent::Plugin
|
27
|
+
class RecordTransformerFilter < Fluent::Plugin::Filter
|
28
|
+
Fluent::Plugin.register_filter('record_transformer', self)
|
29
|
+
|
30
|
+
helpers :record_accessor
|
31
|
+
|
32
|
+
desc 'A comma-delimited list of keys to delete.'
|
33
|
+
config_param :remove_keys, :array, default: nil
|
34
|
+
desc 'A comma-delimited list of keys to keep.'
|
35
|
+
config_param :keep_keys, :array, default: nil
|
36
|
+
desc 'Create new Hash to transform incoming data'
|
37
|
+
config_param :renew_record, :bool, default: false
|
38
|
+
desc 'Specify field name of the record to overwrite the time of events. Its value must be unix time.'
|
39
|
+
config_param :renew_time_key, :string, default: nil
|
40
|
+
desc 'When set to true, the full Ruby syntax is enabled in the ${...} expression.'
|
41
|
+
config_param :enable_ruby, :bool, default: false
|
42
|
+
desc 'Use original value type.'
|
43
|
+
config_param :auto_typecast, :bool, default: true
|
44
|
+
|
45
|
+
def configure(conf)
|
46
|
+
super
|
47
|
+
|
48
|
+
map = {}
|
49
|
+
# <record></record> directive
|
50
|
+
conf.elements.select { |element| element.name == 'record' }.each do |element|
|
51
|
+
element.each_pair do |k, v|
|
52
|
+
element.has_key?(k) # to suppress unread configuration warning
|
53
|
+
map[k] = parse_value(v)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if @keep_keys
|
58
|
+
raise Fluent::ConfigError, "`renew_record` must be true to use `keep_keys`" unless @renew_record
|
59
|
+
end
|
60
|
+
|
61
|
+
@key_deleters = if @remove_keys
|
62
|
+
@remove_keys.map { |k| record_accessor_create(k) }
|
63
|
+
end
|
64
|
+
|
65
|
+
placeholder_expander_params = {
|
66
|
+
log: log,
|
67
|
+
auto_typecast: @auto_typecast,
|
68
|
+
}
|
69
|
+
@placeholder_expander =
|
70
|
+
if @enable_ruby
|
71
|
+
# require utilities which would be used in ruby placeholders
|
72
|
+
require 'pathname'
|
73
|
+
require 'uri'
|
74
|
+
require 'cgi'
|
75
|
+
RubyPlaceholderExpander.new(placeholder_expander_params)
|
76
|
+
else
|
77
|
+
PlaceholderExpander.new(placeholder_expander_params)
|
78
|
+
end
|
79
|
+
@map = @placeholder_expander.preprocess_map(map)
|
80
|
+
|
81
|
+
@hostname = Socket.gethostname
|
82
|
+
end
|
83
|
+
|
84
|
+
def filter_stream(tag, es)
|
85
|
+
new_es = Fluent::MultiEventStream.new
|
86
|
+
tag_parts = tag.split('.')
|
87
|
+
tag_prefix = tag_prefix(tag_parts)
|
88
|
+
tag_suffix = tag_suffix(tag_parts)
|
89
|
+
placeholder_values = {
|
90
|
+
'tag' => tag,
|
91
|
+
'tag_parts' => tag_parts,
|
92
|
+
'tag_prefix' => tag_prefix,
|
93
|
+
'tag_suffix' => tag_suffix,
|
94
|
+
'hostname' => @hostname,
|
95
|
+
}
|
96
|
+
es.each do |time, record|
|
97
|
+
begin
|
98
|
+
placeholder_values['time'] = @placeholder_expander.time_value(time)
|
99
|
+
placeholder_values['record'] = record
|
100
|
+
|
101
|
+
new_record = reform(record, placeholder_values)
|
102
|
+
if @renew_time_key && new_record.has_key?(@renew_time_key)
|
103
|
+
time = Fluent::EventTime.from_time(Time.at(new_record[@renew_time_key].to_f))
|
104
|
+
end
|
105
|
+
@key_deleters.each { |deleter| deleter.delete(new_record) } if @key_deleters
|
106
|
+
new_es.add(time, new_record)
|
107
|
+
rescue => e
|
108
|
+
router.emit_error_event(tag, time, record, e)
|
109
|
+
log.debug { "map:#{@map} record:#{record} placeholder_values:#{placeholder_values}" }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
new_es
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def parse_value(value_str)
|
118
|
+
if value_str.start_with?('{', '[')
|
119
|
+
JSON.parse(value_str)
|
120
|
+
else
|
121
|
+
value_str
|
122
|
+
end
|
123
|
+
rescue => e
|
124
|
+
log.warn "failed to parse #{value_str} as json. Assuming #{value_str} is a string", error: e
|
125
|
+
value_str # emit as string
|
126
|
+
end
|
127
|
+
|
128
|
+
def reform(record, placeholder_values)
|
129
|
+
placeholders = @placeholder_expander.prepare_placeholders(placeholder_values)
|
130
|
+
|
131
|
+
new_record = @renew_record ? {} : record.dup
|
132
|
+
@keep_keys.each do |k|
|
133
|
+
new_record[k] = record[k] if record.has_key?(k)
|
134
|
+
end if @keep_keys && @renew_record
|
135
|
+
new_record.merge!(expand_placeholders(@map, placeholders))
|
136
|
+
|
137
|
+
new_record
|
138
|
+
end
|
139
|
+
|
140
|
+
def expand_placeholders(value, placeholders)
|
141
|
+
if value.is_a?(String)
|
142
|
+
new_value = @placeholder_expander.expand(value, placeholders)
|
143
|
+
elsif value.is_a?(Hash)
|
144
|
+
new_value = {}
|
145
|
+
value.each_pair do |k, v|
|
146
|
+
new_key = @placeholder_expander.expand(k, placeholders, true)
|
147
|
+
new_value[new_key] = expand_placeholders(v, placeholders)
|
148
|
+
end
|
149
|
+
elsif value.is_a?(Array)
|
150
|
+
new_value = []
|
151
|
+
value.each_with_index do |v, i|
|
152
|
+
new_value[i] = expand_placeholders(v, placeholders)
|
153
|
+
end
|
154
|
+
else
|
155
|
+
new_value = value
|
156
|
+
end
|
157
|
+
new_value
|
158
|
+
end
|
159
|
+
|
160
|
+
def tag_prefix(tag_parts)
|
161
|
+
return [] if tag_parts.empty?
|
162
|
+
tag_prefix = [tag_parts.first]
|
163
|
+
1.upto(tag_parts.size-1).each do |i|
|
164
|
+
tag_prefix[i] = "#{tag_prefix[i-1]}.#{tag_parts[i]}"
|
165
|
+
end
|
166
|
+
tag_prefix
|
167
|
+
end
|
168
|
+
|
169
|
+
def tag_suffix(tag_parts)
|
170
|
+
return [] if tag_parts.empty?
|
171
|
+
rev_tag_parts = tag_parts.reverse
|
172
|
+
rev_tag_suffix = [rev_tag_parts.first]
|
173
|
+
1.upto(tag_parts.size-1).each do |i|
|
174
|
+
rev_tag_suffix[i] = "#{rev_tag_parts[i]}.#{rev_tag_suffix[i-1]}"
|
175
|
+
end
|
176
|
+
rev_tag_suffix.reverse!
|
177
|
+
end
|
178
|
+
|
179
|
+
# THIS CLASS MUST BE THREAD-SAFE
|
180
|
+
class PlaceholderExpander
|
181
|
+
attr_reader :placeholders, :log
|
182
|
+
|
183
|
+
def initialize(params)
|
184
|
+
@log = params[:log]
|
185
|
+
@auto_typecast = params[:auto_typecast]
|
186
|
+
end
|
187
|
+
|
188
|
+
def time_value(time)
|
189
|
+
Time.at(time).to_s
|
190
|
+
end
|
191
|
+
|
192
|
+
def preprocess_map(value, force_stringify = false)
|
193
|
+
value
|
194
|
+
end
|
195
|
+
|
196
|
+
def prepare_placeholders(placeholder_values)
|
197
|
+
placeholders = {}
|
198
|
+
|
199
|
+
placeholder_values.each do |key, value|
|
200
|
+
if value.kind_of?(Array) # tag_parts, etc
|
201
|
+
size = value.size
|
202
|
+
value.each_with_index do |v, idx|
|
203
|
+
placeholders.store("${#{key}[#{idx}]}", v)
|
204
|
+
placeholders.store("${#{key}[#{idx-size}]}", v) # support [-1]
|
205
|
+
end
|
206
|
+
elsif value.kind_of?(Hash) # record, etc
|
207
|
+
value.each do |k, v|
|
208
|
+
placeholders.store(%Q[${#{key}["#{k}"]}], v) # record["foo"]
|
209
|
+
end
|
210
|
+
else # string, interger, float, and others?
|
211
|
+
placeholders.store("${#{key}}", value)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
placeholders
|
216
|
+
end
|
217
|
+
|
218
|
+
# Expand string with placeholders
|
219
|
+
#
|
220
|
+
# @param [String] str
|
221
|
+
# @param [Boolean] force_stringify the value must be string, used for hash key
|
222
|
+
def expand(str, placeholders, force_stringify = false)
|
223
|
+
if @auto_typecast && !force_stringify
|
224
|
+
single_placeholder_matched = str.match(/\A(\${[^}]+}|__[A-Z_]+__)\z/)
|
225
|
+
if single_placeholder_matched
|
226
|
+
log_if_unknown_placeholder($1, placeholders)
|
227
|
+
return placeholders[single_placeholder_matched[1]]
|
228
|
+
end
|
229
|
+
end
|
230
|
+
str.gsub(/(\${[^}]+}|__[A-Z_]+__)/) {
|
231
|
+
log_if_unknown_placeholder($1, placeholders)
|
232
|
+
placeholders[$1]
|
233
|
+
}
|
234
|
+
end
|
235
|
+
|
236
|
+
private
|
237
|
+
|
238
|
+
def log_if_unknown_placeholder(placeholder, placeholders)
|
239
|
+
unless placeholders.include?(placeholder)
|
240
|
+
log.warn "unknown placeholder `#{placeholder}` found"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# THIS CLASS MUST BE THREAD-SAFE
|
246
|
+
class RubyPlaceholderExpander
|
247
|
+
attr_reader :log
|
248
|
+
|
249
|
+
def initialize(params)
|
250
|
+
@log = params[:log]
|
251
|
+
@auto_typecast = params[:auto_typecast]
|
252
|
+
@cleanroom_expander = CleanroomExpander.new
|
253
|
+
end
|
254
|
+
|
255
|
+
def time_value(time)
|
256
|
+
Time.at(time)
|
257
|
+
end
|
258
|
+
|
259
|
+
# Preprocess record map to convert into ruby string expansion
|
260
|
+
#
|
261
|
+
# @param [Hash|String|Array] value record map config
|
262
|
+
# @param [Boolean] force_stringify the value must be string, used for hash key
|
263
|
+
def preprocess_map(value, force_stringify = false)
|
264
|
+
new_value = nil
|
265
|
+
if value.is_a?(String)
|
266
|
+
if @auto_typecast && !force_stringify
|
267
|
+
num_placeholders = value.scan('${').size
|
268
|
+
if num_placeholders == 1 && value.start_with?('${') && value.end_with?('}')
|
269
|
+
new_value = value[2..-2] # ${..} => ..
|
270
|
+
end
|
271
|
+
end
|
272
|
+
unless new_value
|
273
|
+
new_value = "%Q[#{value.gsub('${', '#{')}]" # xx${..}xx => %Q[xx#{..}xx]
|
274
|
+
end
|
275
|
+
elsif value.is_a?(Hash)
|
276
|
+
new_value = {}
|
277
|
+
value.each_pair do |k, v|
|
278
|
+
new_value[preprocess_map(k, true)] = preprocess_map(v)
|
279
|
+
end
|
280
|
+
elsif value.is_a?(Array)
|
281
|
+
new_value = []
|
282
|
+
value.each_with_index do |v, i|
|
283
|
+
new_value[i] = preprocess_map(v)
|
284
|
+
end
|
285
|
+
else
|
286
|
+
new_value = value
|
287
|
+
end
|
288
|
+
new_value
|
289
|
+
end
|
290
|
+
|
291
|
+
def prepare_placeholders(placeholder_values)
|
292
|
+
placeholder_values
|
293
|
+
end
|
294
|
+
|
295
|
+
# Expand string with placeholders
|
296
|
+
#
|
297
|
+
# @param [String] str
|
298
|
+
def expand(str, placeholders, force_stringify = false)
|
299
|
+
@cleanroom_expander.expand(
|
300
|
+
str,
|
301
|
+
placeholders['tag'],
|
302
|
+
placeholders['time'],
|
303
|
+
placeholders['record'],
|
304
|
+
placeholders['tag_parts'],
|
305
|
+
placeholders['tag_prefix'],
|
306
|
+
placeholders['tag_suffix'],
|
307
|
+
placeholders['hostname'],
|
308
|
+
)
|
309
|
+
rescue => e
|
310
|
+
raise "failed to expand `#{str}` : error = #{e}"
|
311
|
+
end
|
312
|
+
|
313
|
+
class CleanroomExpander
|
314
|
+
def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname)
|
315
|
+
instance_eval(__str_to_eval__)
|
316
|
+
end
|
317
|
+
|
318
|
+
(Object.instance_methods).each do |m|
|
319
|
+
undef_method m unless m.to_s =~ /^__|respond_to_missing\?|object_id|public_methods|instance_eval|method_missing|define_singleton_method|respond_to\?|new_ostruct_member|^class$/
|
320
|
+
end
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
@@ -0,0 +1,53 @@
|
|
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 'fluent/plugin/filter'
|
18
|
+
|
19
|
+
module Fluent::Plugin
|
20
|
+
class StdoutFilter < Filter
|
21
|
+
Fluent::Plugin.register_filter('stdout', self)
|
22
|
+
|
23
|
+
helpers :formatter, :compat_parameters, :inject
|
24
|
+
|
25
|
+
DEFAULT_FORMAT_TYPE = 'stdout'
|
26
|
+
|
27
|
+
config_section :format do
|
28
|
+
config_set_default :@type, DEFAULT_FORMAT_TYPE
|
29
|
+
end
|
30
|
+
|
31
|
+
# for tests
|
32
|
+
attr_reader :formatter
|
33
|
+
|
34
|
+
def configure(conf)
|
35
|
+
compat_parameters_convert(conf, :inject, :formatter)
|
36
|
+
super
|
37
|
+
@formatter = formatter_create
|
38
|
+
end
|
39
|
+
|
40
|
+
def filter_stream(tag, es)
|
41
|
+
es.each { |time, record|
|
42
|
+
begin
|
43
|
+
r = inject_values_to_record(tag, time, record)
|
44
|
+
log.write @formatter.format(tag, time, r)
|
45
|
+
rescue => e
|
46
|
+
router.emit_error_event(tag, time, record, e)
|
47
|
+
end
|
48
|
+
}
|
49
|
+
log.flush
|
50
|
+
es
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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 'fluent/env'
|
18
|
+
require 'fluent/plugin/base'
|
19
|
+
require 'fluent/plugin/owned_by_mixin'
|
20
|
+
require 'fluent/time'
|
21
|
+
|
22
|
+
module Fluent
|
23
|
+
module Plugin
|
24
|
+
class Formatter < Base
|
25
|
+
include OwnedByMixin
|
26
|
+
include TimeMixin::Formatter
|
27
|
+
|
28
|
+
configured_in :format
|
29
|
+
|
30
|
+
PARSER_TYPES = [:text_per_line, :text, :binary]
|
31
|
+
def formatter_type
|
32
|
+
:text_per_line
|
33
|
+
end
|
34
|
+
|
35
|
+
def format(tag, time, record)
|
36
|
+
raise NotImplementedError, "Implement this method in child class"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class ProcWrappedFormatter < Formatter
|
41
|
+
def initialize(proc)
|
42
|
+
super()
|
43
|
+
@proc = proc
|
44
|
+
end
|
45
|
+
|
46
|
+
def format(tag, time, record)
|
47
|
+
@proc.call(tag, time, record)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module Newline
|
52
|
+
module Mixin
|
53
|
+
include Fluent::Configurable
|
54
|
+
|
55
|
+
DEFAULT_NEWLINE = if Fluent.windows?
|
56
|
+
:crlf
|
57
|
+
else
|
58
|
+
:lf
|
59
|
+
end
|
60
|
+
|
61
|
+
config_param :newline, :enum, list: [:lf, :crlf], default: DEFAULT_NEWLINE
|
62
|
+
|
63
|
+
def configure(conf)
|
64
|
+
super
|
65
|
+
@newline = case newline
|
66
|
+
when :lf
|
67
|
+
"\n".freeze
|
68
|
+
when :crlf
|
69
|
+
"\r\n".freeze
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,78 @@
|
|
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 'fluent/plugin_helper'
|
18
|
+
require 'fluent/plugin/formatter'
|
19
|
+
require 'csv'
|
20
|
+
|
21
|
+
module Fluent
|
22
|
+
module Plugin
|
23
|
+
class CsvFormatter < Formatter
|
24
|
+
Plugin.register_formatter('csv', self)
|
25
|
+
|
26
|
+
include PluginHelper::Mixin
|
27
|
+
helpers :record_accessor
|
28
|
+
|
29
|
+
config_param :delimiter, default: ',' do |val|
|
30
|
+
['\t', 'TAB'].include?(val) ? "\t".freeze : val.freeze
|
31
|
+
end
|
32
|
+
config_param :force_quotes, :bool, default: true
|
33
|
+
# "array" looks good for type of :fields, but this implementation removes tailing comma
|
34
|
+
# TODO: Is it needed to support tailing comma?
|
35
|
+
config_param :fields, :array, value_type: :string
|
36
|
+
config_param :add_newline, :bool, default: true
|
37
|
+
|
38
|
+
def configure(conf)
|
39
|
+
super
|
40
|
+
|
41
|
+
@fields = fields.select{|f| !f.empty? }
|
42
|
+
raise ConfigError, "empty value is specified in fields parameter" if @fields.empty?
|
43
|
+
|
44
|
+
if @fields.any? { |f| record_accessor_nested?(f) }
|
45
|
+
@accessors = @fields.map { |f| record_accessor_create(f) }
|
46
|
+
mformat = method(:format_with_nested_fields)
|
47
|
+
singleton_class.module_eval do
|
48
|
+
define_method(:format, mformat)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
@generate_opts = {col_sep: @delimiter, force_quotes: @force_quotes, headers: @fields,
|
53
|
+
row_sep: @add_newline ? :auto : "".force_encoding(Encoding::ASCII_8BIT)}
|
54
|
+
# Cache CSV object per thread to avoid internal state sharing
|
55
|
+
@cache = {}
|
56
|
+
end
|
57
|
+
|
58
|
+
def format(tag, time, record)
|
59
|
+
csv = (@cache[Thread.current] ||= CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts))
|
60
|
+
line = (csv << record).string.dup
|
61
|
+
# Need manual cleanup because CSV writer doesn't provide such method.
|
62
|
+
csv.rewind
|
63
|
+
csv.truncate(0)
|
64
|
+
line
|
65
|
+
end
|
66
|
+
|
67
|
+
def format_with_nested_fields(tag, time, record)
|
68
|
+
csv = (@cache[Thread.current] ||= CSV.new("".force_encoding(Encoding::ASCII_8BIT), **@generate_opts))
|
69
|
+
values = @accessors.map { |a| a.call(record) }
|
70
|
+
line = (csv << values).string.dup
|
71
|
+
# Need manual cleanup because CSV writer doesn't provide such method.
|
72
|
+
csv.rewind
|
73
|
+
csv.truncate(0)
|
74
|
+
line
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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 'fluent/plugin/formatter'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module Plugin
|
21
|
+
class HashFormatter < Formatter
|
22
|
+
include Fluent::Plugin::Newline::Mixin
|
23
|
+
|
24
|
+
Plugin.register_formatter('hash', self)
|
25
|
+
|
26
|
+
config_param :add_newline, :bool, default: true
|
27
|
+
|
28
|
+
def format(tag, time, record)
|
29
|
+
line = record.to_s
|
30
|
+
line << @newline if @add_newline
|
31
|
+
line
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|