fluentd 0.12.40 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- data/.gitignore +5 -0
- data/.gitlab/cicd-template.yaml +10 -0
- data/.gitlab-ci.yml +147 -0
- data/.travis.yml +56 -20
- data/ADOPTERS.md +5 -0
- data/CHANGELOG.md +1369 -0
- data/CONTRIBUTING.md +16 -5
- data/GOVERNANCE.md +55 -0
- data/Gemfile +5 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +7 -0
- data/README.md +23 -11
- data/Rakefile +48 -2
- data/Vagrantfile +17 -0
- data/appveyor.yml +37 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +3 -0
- data/code-of-conduct.md +3 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/in_dummy_blocks.conf +17 -0
- data/example/in_dummy_with_compression.conf +23 -0
- data/example/in_forward.conf +7 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +3 -1
- data/example/in_out_forward.conf +17 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_forward.conf +13 -13
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +29 -0
- data/fluentd.gemspec +21 -11
- data/lib/fluent/agent.rb +67 -90
- data/lib/fluent/clock.rb +62 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/ca_generate.rb +181 -0
- data/lib/fluent/command/cat.rb +42 -18
- data/lib/fluent/command/debug.rb +12 -10
- data/lib/fluent/command/fluentd.rb +153 -5
- data/lib/fluent/command/plugin_config_formatter.rb +292 -0
- data/lib/fluent/command/plugin_generator.rb +324 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +718 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/configure_proxy.rb +210 -62
- data/lib/fluent/config/dsl.rb +12 -5
- data/lib/fluent/config/element.rb +107 -9
- data/lib/fluent/config/literal_parser.rb +9 -3
- data/lib/fluent/config/parser.rb +4 -4
- data/lib/fluent/config/section.rb +51 -14
- data/lib/fluent/config/types.rb +28 -13
- data/lib/fluent/config/v1_parser.rb +3 -5
- data/lib/fluent/config.rb +23 -20
- data/lib/fluent/configurable.rb +79 -21
- data/lib/fluent/counter/base_socket.rb +46 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +15 -0
- data/lib/fluent/engine.rb +102 -65
- data/lib/fluent/env.rb +7 -3
- data/lib/fluent/error.rb +30 -0
- data/lib/fluent/event.rb +197 -21
- data/lib/fluent/event_router.rb +93 -10
- data/lib/fluent/filter.rb +2 -50
- data/lib/fluent/formatter.rb +4 -293
- data/lib/fluent/input.rb +2 -32
- data/lib/fluent/label.rb +10 -2
- data/lib/fluent/load.rb +3 -3
- data/lib/fluent/log.rb +348 -81
- data/lib/fluent/match.rb +37 -36
- data/lib/fluent/mixin.rb +12 -176
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +10 -612
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +4 -800
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +192 -0
- data/lib/fluent/plugin/buf_file.rb +128 -174
- data/lib/fluent/plugin/buf_memory.rb +9 -92
- data/lib/fluent/plugin/buffer/chunk.rb +221 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/buffer.rb +779 -0
- data/lib/fluent/plugin/compressable.rb +92 -0
- data/lib/fluent/plugin/exec_util.rb +3 -108
- data/lib/fluent/plugin/file_util.rb +4 -34
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +117 -34
- data/lib/fluent/plugin/filter_parser.rb +85 -62
- data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
- data/lib/fluent/plugin/filter_stdout.rb +15 -12
- data/lib/fluent/plugin/formatter.rb +50 -0
- data/lib/fluent/plugin/formatter_csv.rb +52 -0
- data/lib/fluent/plugin/formatter_hash.rb +33 -0
- data/lib/fluent/plugin/formatter_json.rb +55 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +51 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +38 -0
- data/lib/fluent/plugin/in_debug_agent.rb +17 -6
- data/lib/fluent/plugin/in_dummy.rb +47 -20
- data/lib/fluent/plugin/in_exec.rb +55 -123
- data/lib/fluent/plugin/in_forward.rb +299 -216
- data/lib/fluent/plugin/in_gc_stat.rb +14 -36
- data/lib/fluent/plugin/in_http.rb +204 -91
- data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
- data/lib/fluent/plugin/in_object_space.rb +13 -41
- data/lib/fluent/plugin/in_syslog.rb +112 -134
- data/lib/fluent/plugin/in_tail.rb +408 -745
- data/lib/fluent/plugin/in_tcp.rb +66 -9
- data/lib/fluent/plugin/in_udp.rb +60 -11
- data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
- data/lib/fluent/plugin/input.rb +37 -0
- data/lib/fluent/plugin/multi_output.rb +158 -0
- data/lib/fluent/plugin/out_copy.rb +23 -35
- data/lib/fluent/plugin/out_exec.rb +67 -70
- data/lib/fluent/plugin/out_exec_filter.rb +204 -271
- data/lib/fluent/plugin/out_file.rb +267 -73
- data/lib/fluent/plugin/out_forward.rb +854 -325
- data/lib/fluent/plugin/out_null.rb +42 -9
- data/lib/fluent/plugin/out_relabel.rb +9 -5
- data/lib/fluent/plugin/out_roundrobin.rb +18 -37
- data/lib/fluent/plugin/out_secondary_file.rb +133 -0
- data/lib/fluent/plugin/out_stdout.rb +43 -10
- data/lib/fluent/plugin/out_stream.rb +7 -2
- data/lib/fluent/plugin/output.rb +1498 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +191 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +39 -0
- data/lib/fluent/plugin/parser_json.rb +94 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +106 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +142 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/socket_util.rb +3 -143
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +164 -0
- data/lib/fluent/plugin/string_util.rb +3 -15
- data/lib/fluent/plugin.rb +122 -121
- data/lib/fluent/plugin_helper/cert_option.rb +178 -0
- data/lib/fluent/plugin_helper/child_process.rb +364 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
- data/lib/fluent/plugin_helper/http_server.rb +76 -0
- data/lib/fluent/plugin_helper/inject.rb +151 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
- data/lib/fluent/plugin_helper/retry_state.rb +205 -0
- data/lib/fluent/plugin_helper/server.rb +807 -0
- data/lib/fluent/plugin_helper/socket.rb +250 -0
- data/lib/fluent/plugin_helper/socket_option.rb +80 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +179 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +73 -0
- data/lib/fluent/plugin_id.rb +80 -0
- data/lib/fluent/process.rb +3 -489
- data/lib/fluent/registry.rb +52 -10
- data/lib/fluent/root_agent.rb +204 -42
- data/lib/fluent/supervisor.rb +597 -359
- data/lib/fluent/system_config.rb +131 -42
- data/lib/fluent/test/base.rb +6 -54
- data/lib/fluent/test/driver/base.rb +224 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +57 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +0 -1
- data/lib/fluent/test/formatter_test.rb +4 -1
- data/lib/fluent/test/helpers.rb +58 -10
- data/lib/fluent/test/input_test.rb +27 -19
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +28 -39
- data/lib/fluent/test/parser_test.rb +3 -1
- data/lib/fluent/test/startup_shutdown.rb +46 -0
- data/lib/fluent/test.rb +33 -1
- data/lib/fluent/time.rb +450 -1
- data/lib/fluent/timezone.rb +27 -3
- data/lib/fluent/{status.rb → unique_id.rb} +15 -24
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +85 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/test/helper.rb.erb +8 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- data/test/command/test_binlog_reader.rb +346 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_fluentd.rb +901 -0
- data/test/command/test_plugin_config_formatter.rb +276 -0
- data/test/command/test_plugin_generator.rb +92 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/test_config_parser.rb +126 -2
- data/test/config/test_configurable.rb +946 -187
- data/test/config/test_configure_proxy.rb +424 -74
- data/test/config/test_dsl.rb +11 -11
- data/test/config/test_element.rb +500 -0
- data/test/config/test_literal_parser.rb +8 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +79 -7
- data/test/config/test_system_config.rb +122 -35
- data/test/config/test_types.rb +38 -0
- data/test/counter/test_client.rb +559 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/helper.rb +89 -6
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +823 -460
- data/test/plugin/test_buf_memory.rb +32 -194
- data/test/plugin/test_buffer.rb +1233 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +844 -0
- data/test/plugin/test_buffer_memory_chunk.rb +338 -0
- data/test/plugin/test_compressable.rb +84 -0
- data/test/plugin/test_filter.rb +357 -0
- data/test/plugin/test_filter_grep.rb +540 -29
- data/test/plugin/test_filter_parser.rb +439 -452
- data/test/plugin/test_filter_record_transformer.rb +123 -166
- data/test/plugin/test_filter_stdout.rb +160 -72
- data/test/plugin/test_formatter_csv.rb +111 -0
- data/test/plugin/test_formatter_hash.rb +35 -0
- data/test/plugin/test_formatter_json.rb +51 -0
- data/test/plugin/test_formatter_ltsv.rb +62 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_formatter_tsv.rb +68 -0
- data/test/plugin/test_in_debug_agent.rb +24 -1
- data/test/plugin/test_in_dummy.rb +111 -18
- data/test/plugin/test_in_exec.rb +200 -113
- data/test/plugin/test_in_forward.rb +990 -387
- data/test/plugin/test_in_gc_stat.rb +10 -8
- data/test/plugin/test_in_http.rb +600 -224
- data/test/plugin/test_in_monitor_agent.rb +690 -0
- data/test/plugin/test_in_object_space.rb +24 -8
- data/test/plugin/test_in_syslog.rb +154 -215
- data/test/plugin/test_in_tail.rb +1006 -707
- data/test/plugin/test_in_tcp.rb +125 -48
- data/test/plugin/test_in_udp.rb +204 -63
- data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
- data/test/plugin/test_input.rb +126 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_copy.rb +117 -112
- data/test/plugin/test_out_exec.rb +258 -53
- data/test/plugin/test_out_exec_filter.rb +538 -115
- data/test/plugin/test_out_file.rb +865 -178
- data/test/plugin/test_out_forward.rb +998 -210
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +36 -29
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +135 -37
- data/test/plugin/test_out_stream.rb +18 -0
- data/test/plugin/test_output.rb +984 -0
- data/test/plugin/test_output_as_buffered.rb +2021 -0
- data/test/plugin/test_output_as_buffered_backup.rb +312 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +911 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +359 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +103 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +145 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +441 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/test_cert_option.rb +16 -0
- data/test/plugin_helper/test_child_process.rb +794 -0
- data/test/plugin_helper/test_compat_parameters.rb +353 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +205 -0
- data/test/plugin_helper/test_inject.rb +519 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +197 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1714 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +132 -0
- data/test/scripts/exec_script.rb +0 -6
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/out_test.rb +23 -15
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +16 -7
- data/test/test_configdsl.rb +2 -2
- data/test/test_event.rb +360 -13
- data/test/test_event_router.rb +108 -11
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +48 -6
- data/test/test_formatter.rb +11 -391
- data/test/test_input.rb +1 -1
- data/test/test_log.rb +591 -31
- data/test/test_mixin.rb +1 -1
- data/test/test_output.rb +121 -185
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +177 -10
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +101 -0
- data/test/test_process.rb +8 -42
- data/test/test_root_agent.rb +766 -21
- data/test/test_supervisor.rb +481 -0
- data/test/test_test_drivers.rb +135 -0
- data/test/test_time_formatter.rb +282 -0
- data/test/test_time_parser.rb +231 -0
- data/test/test_unique_id.rb +47 -0
- metadata +454 -60
- data/COPYING +0 -14
- data/ChangeLog +0 -666
- data/lib/fluent/buffer.rb +0 -365
- data/lib/fluent/plugin/in_status.rb +0 -76
- data/test/plugin/test_in_status.rb +0 -38
- data/test/test_buffer.rb +0 -624
- data/test/test_parser.rb +0 -1305
@@ -0,0 +1,273 @@
|
|
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 'cool.io'
|
18
|
+
require 'fluent/counter/base_socket'
|
19
|
+
require 'fluent/counter/validator'
|
20
|
+
require 'fluent/counter/store'
|
21
|
+
require 'fluent/counter/mutex_hash'
|
22
|
+
|
23
|
+
module Fluent
|
24
|
+
module Counter
|
25
|
+
class Server
|
26
|
+
DEFAULT_ADDR = '127.0.0.1'
|
27
|
+
DEFAULT_PORT = 24321
|
28
|
+
|
29
|
+
def initialize(name, opt = {})
|
30
|
+
raise 'Counter server name is invalid' unless Validator::VALID_NAME =~ name
|
31
|
+
@name = name
|
32
|
+
@opt = opt
|
33
|
+
@addr = @opt[:addr] || DEFAULT_ADDR
|
34
|
+
@port = @opt[:port] || DEFAULT_PORT
|
35
|
+
@loop = @opt[:loop] || Coolio::Loop.new
|
36
|
+
@log = @opt[:log] || $log
|
37
|
+
|
38
|
+
@store = Fluent::Counter::Store.new(opt)
|
39
|
+
@mutex_hash = MutexHash.new(@store)
|
40
|
+
|
41
|
+
@server = Coolio::TCPServer.new(@addr, @port, Handler, method(:on_message))
|
42
|
+
@thread = nil
|
43
|
+
@running = false
|
44
|
+
end
|
45
|
+
|
46
|
+
def start
|
47
|
+
@server.attach(@loop)
|
48
|
+
@thread = Thread.new do
|
49
|
+
@running = true
|
50
|
+
@loop.run(0.5)
|
51
|
+
@running = false
|
52
|
+
end
|
53
|
+
@log.debug("starting counter server #{@addr}:#{@port}")
|
54
|
+
@mutex_hash.start
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def stop
|
59
|
+
# This `sleep` for a test to wait for a `@loop` to begin to run
|
60
|
+
sleep 0.1
|
61
|
+
@server.close
|
62
|
+
@loop.stop if @running
|
63
|
+
@mutex_hash.stop
|
64
|
+
@thread.join if @thread
|
65
|
+
@log.debug("calling stop in counter server #{@addr}:#{@port}")
|
66
|
+
end
|
67
|
+
|
68
|
+
def on_message(data)
|
69
|
+
errors = Validator.request(data)
|
70
|
+
unless errors.empty?
|
71
|
+
return { 'id' => data['id'], 'data' => [], 'errors' => errors }
|
72
|
+
end
|
73
|
+
|
74
|
+
result = safe_run do
|
75
|
+
send(data['method'], data['params'], data['scope'], data['options'])
|
76
|
+
end
|
77
|
+
result.merge('id' => data['id'])
|
78
|
+
rescue => e
|
79
|
+
@log.error e.to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def establish(params, _scope, _options)
|
85
|
+
validator = Fluent::Counter::ArrayValidator.new(:empty, :scope)
|
86
|
+
valid_params, errors = validator.call(params)
|
87
|
+
res = Response.new(errors)
|
88
|
+
|
89
|
+
if scope = valid_params.first
|
90
|
+
new_scope = "#{@name}\t#{scope}"
|
91
|
+
res.push_data new_scope
|
92
|
+
@log.debug("Establish new key: #{new_scope}")
|
93
|
+
end
|
94
|
+
|
95
|
+
res.to_hash
|
96
|
+
end
|
97
|
+
|
98
|
+
def init(params, scope, options)
|
99
|
+
validator = Fluent::Counter::HashValidator.new(:empty, :name, :reset_interval)
|
100
|
+
valid_params, errors = validator.call(params)
|
101
|
+
res = Response.new(errors)
|
102
|
+
key_hash = valid_params.reduce({}) do |acc, vp|
|
103
|
+
acc.merge(Store.gen_key(scope, vp['name']) => vp)
|
104
|
+
end
|
105
|
+
|
106
|
+
do_init = lambda do |store, key|
|
107
|
+
begin
|
108
|
+
param = key_hash[key]
|
109
|
+
v = store.init(key, param, ignore: options['ignore'])
|
110
|
+
@log.debug("Create new key: #{param['name']}")
|
111
|
+
res.push_data v
|
112
|
+
rescue => e
|
113
|
+
res.push_error e
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if options['random']
|
118
|
+
@mutex_hash.synchronize_keys(*(key_hash.keys), &do_init)
|
119
|
+
else
|
120
|
+
@mutex_hash.synchronize(*(key_hash.keys), &do_init)
|
121
|
+
end
|
122
|
+
|
123
|
+
res.to_hash
|
124
|
+
end
|
125
|
+
|
126
|
+
def delete(params, scope, options)
|
127
|
+
validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
|
128
|
+
valid_params, errors = validator.call(params)
|
129
|
+
res = Response.new(errors)
|
130
|
+
keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
|
131
|
+
|
132
|
+
do_delete = lambda do |store, key|
|
133
|
+
begin
|
134
|
+
v = store.delete(key)
|
135
|
+
@log.debug("delete a key: #{key}")
|
136
|
+
res.push_data v
|
137
|
+
rescue => e
|
138
|
+
res.push_error e
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
if options['random']
|
143
|
+
@mutex_hash.synchronize_keys(*keys, &do_delete)
|
144
|
+
else
|
145
|
+
@mutex_hash.synchronize(*keys, &do_delete)
|
146
|
+
end
|
147
|
+
|
148
|
+
res.to_hash
|
149
|
+
end
|
150
|
+
|
151
|
+
def inc(params, scope, options)
|
152
|
+
validate_param = [:empty, :name, :value]
|
153
|
+
validate_param << :reset_interval if options['force']
|
154
|
+
validator = Fluent::Counter::HashValidator.new(*validate_param)
|
155
|
+
valid_params, errors = validator.call(params)
|
156
|
+
res = Response.new(errors)
|
157
|
+
key_hash = valid_params.reduce({}) do |acc, vp|
|
158
|
+
acc.merge(Store.gen_key(scope, vp['name']) => vp)
|
159
|
+
end
|
160
|
+
|
161
|
+
do_inc = lambda do |store, key|
|
162
|
+
begin
|
163
|
+
param = key_hash[key]
|
164
|
+
v = store.inc(key, param, force: options['force'])
|
165
|
+
@log.debug("Increment #{key} by #{param['value']}")
|
166
|
+
res.push_data v
|
167
|
+
rescue => e
|
168
|
+
res.push_error e
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
if options['random']
|
173
|
+
@mutex_hash.synchronize_keys(*(key_hash.keys), &do_inc)
|
174
|
+
else
|
175
|
+
@mutex_hash.synchronize(*(key_hash.keys), &do_inc)
|
176
|
+
end
|
177
|
+
|
178
|
+
res.to_hash
|
179
|
+
end
|
180
|
+
|
181
|
+
def reset(params, scope, options)
|
182
|
+
validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
|
183
|
+
valid_params, errors = validator.call(params)
|
184
|
+
res = Response.new(errors)
|
185
|
+
keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
|
186
|
+
|
187
|
+
do_reset = lambda do |store, key|
|
188
|
+
begin
|
189
|
+
v = store.reset(key)
|
190
|
+
@log.debug("Reset #{key}'s' counter value")
|
191
|
+
res.push_data v
|
192
|
+
rescue => e
|
193
|
+
res.push_error e
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
if options['random']
|
198
|
+
@mutex_hash.synchronize_keys(*keys, &do_reset)
|
199
|
+
else
|
200
|
+
@mutex_hash.synchronize(*keys, &do_reset)
|
201
|
+
end
|
202
|
+
|
203
|
+
res.to_hash
|
204
|
+
end
|
205
|
+
|
206
|
+
def get(params, scope, _options)
|
207
|
+
validator = Fluent::Counter::ArrayValidator.new(:empty, :key)
|
208
|
+
valid_params, errors = validator.call(params)
|
209
|
+
res = Response.new(errors)
|
210
|
+
|
211
|
+
keys = valid_params.map { |vp| Store.gen_key(scope, vp) }
|
212
|
+
keys.each do |key|
|
213
|
+
begin
|
214
|
+
v = @store.get(key, raise_error: true)
|
215
|
+
@log.debug("Get counter value: #{key}")
|
216
|
+
res.push_data v
|
217
|
+
rescue => e
|
218
|
+
res.push_error e
|
219
|
+
end
|
220
|
+
end
|
221
|
+
res.to_hash
|
222
|
+
end
|
223
|
+
|
224
|
+
def safe_run
|
225
|
+
yield
|
226
|
+
rescue => e
|
227
|
+
{
|
228
|
+
'errors' => [InternalServerError.new(e).to_hash],
|
229
|
+
'data' => []
|
230
|
+
}
|
231
|
+
end
|
232
|
+
|
233
|
+
class Response
|
234
|
+
def initialize(errors = [], data = [])
|
235
|
+
@errors = errors
|
236
|
+
@data = data
|
237
|
+
end
|
238
|
+
|
239
|
+
def push_error(error)
|
240
|
+
@errors << error
|
241
|
+
end
|
242
|
+
|
243
|
+
def push_data(data)
|
244
|
+
@data << data
|
245
|
+
end
|
246
|
+
|
247
|
+
def to_hash
|
248
|
+
if @errors.empty?
|
249
|
+
{ 'data' => @data }
|
250
|
+
else
|
251
|
+
errors = @errors.map do |e|
|
252
|
+
error = e.respond_to?(:to_hash) ? e : InternalServerError.new(e.to_s)
|
253
|
+
error.to_hash
|
254
|
+
end
|
255
|
+
{ 'data' => @data, 'errors' => errors }
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
class Handler < Fluent::Counter::BaseSocket
|
262
|
+
def initialize(io, on_message)
|
263
|
+
super(io)
|
264
|
+
@on_message = on_message
|
265
|
+
end
|
266
|
+
|
267
|
+
def on_message(data)
|
268
|
+
res = @on_message.call(data)
|
269
|
+
packed_write res if res
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
@@ -0,0 +1,205 @@
|
|
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/config'
|
18
|
+
require 'fluent/counter/error'
|
19
|
+
require 'fluent/plugin/storage_local'
|
20
|
+
require 'fluent/time'
|
21
|
+
|
22
|
+
module Fluent
|
23
|
+
module Counter
|
24
|
+
class Store
|
25
|
+
def self.gen_key(scope, key)
|
26
|
+
"#{scope}\t#{key}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(opt = {})
|
30
|
+
@log = opt[:log] || $log
|
31
|
+
|
32
|
+
# Notice: This storage is not be implemented auto save.
|
33
|
+
@storage = Plugin.new_storage('local', parent: DummyParent.new(@log))
|
34
|
+
conf = if opt[:path]
|
35
|
+
{'persistent' => true, 'path' => opt[:path] }
|
36
|
+
else
|
37
|
+
{'persistent' => false }
|
38
|
+
end
|
39
|
+
@storage.configure(Fluent::Config::Element.new('storage', {}, conf, []))
|
40
|
+
end
|
41
|
+
|
42
|
+
# This class behaves as a configurable plugin for using in storage (OwnedByMixin).
|
43
|
+
class DummyParent
|
44
|
+
include Configurable
|
45
|
+
|
46
|
+
attr_reader :log
|
47
|
+
|
48
|
+
def initialize(log)
|
49
|
+
@log = log
|
50
|
+
end
|
51
|
+
|
52
|
+
def plugin_id
|
53
|
+
'dummy_parent_store'
|
54
|
+
end
|
55
|
+
|
56
|
+
def plugin_id_configured?
|
57
|
+
false
|
58
|
+
end
|
59
|
+
|
60
|
+
# storage_local calls PluginId#plugin_root_dir
|
61
|
+
def plugin_root_dir
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def start
|
67
|
+
@storage.load
|
68
|
+
end
|
69
|
+
|
70
|
+
def stop
|
71
|
+
@storage.save
|
72
|
+
end
|
73
|
+
|
74
|
+
def init(key, data, ignore: false)
|
75
|
+
ret = if v = get(key)
|
76
|
+
raise InvalidParams.new("#{key} already exists in counter") unless ignore
|
77
|
+
v
|
78
|
+
else
|
79
|
+
@storage.put(key, build_value(data))
|
80
|
+
end
|
81
|
+
|
82
|
+
build_response(ret)
|
83
|
+
end
|
84
|
+
|
85
|
+
def get(key, raise_error: false, raw: false)
|
86
|
+
ret = if raise_error
|
87
|
+
@storage.get(key) or raise UnknownKey.new("`#{key}` doesn't exist in counter")
|
88
|
+
else
|
89
|
+
@storage.get(key)
|
90
|
+
end
|
91
|
+
if raw
|
92
|
+
ret
|
93
|
+
else
|
94
|
+
ret && build_response(ret)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def key?(key)
|
99
|
+
!!@storage.get(key)
|
100
|
+
end
|
101
|
+
|
102
|
+
def delete(key)
|
103
|
+
ret = @storage.delete(key) or raise UnknownKey.new("`#{key}` doesn't exist in counter")
|
104
|
+
build_response(ret)
|
105
|
+
end
|
106
|
+
|
107
|
+
def inc(key, data, force: false)
|
108
|
+
value = data.delete('value')
|
109
|
+
init(key, data) if !key?(key) && force
|
110
|
+
v = get(key, raise_error: true, raw: true)
|
111
|
+
valid_type!(v, value)
|
112
|
+
|
113
|
+
v['total'] += value
|
114
|
+
v['current'] += value
|
115
|
+
t = EventTime.now
|
116
|
+
v['last_modified_at'] = [t.sec, t.nsec]
|
117
|
+
@storage.put(key, v)
|
118
|
+
|
119
|
+
build_response(v)
|
120
|
+
end
|
121
|
+
|
122
|
+
def reset(key)
|
123
|
+
v = get(key, raise_error: true, raw: true)
|
124
|
+
success = false
|
125
|
+
old_data = v.dup
|
126
|
+
now = EventTime.now
|
127
|
+
last_reset_at = EventTime.new(*v['last_reset_at'])
|
128
|
+
|
129
|
+
# Does it need reset?
|
130
|
+
if (last_reset_at + v['reset_interval']) <= now
|
131
|
+
success = true
|
132
|
+
v['current'] = initial_value(v['type'])
|
133
|
+
t = [now.sec, now.nsec]
|
134
|
+
v['last_reset_at'] = t
|
135
|
+
v['last_modified_at'] = t
|
136
|
+
@storage.put(key, v)
|
137
|
+
end
|
138
|
+
|
139
|
+
{
|
140
|
+
'elapsed_time' => now - last_reset_at,
|
141
|
+
'success' => success,
|
142
|
+
'counter_data' => build_response(old_data)
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def build_response(d)
|
149
|
+
{
|
150
|
+
'name' => d['name'],
|
151
|
+
'total' => d['total'],
|
152
|
+
'current' => d['current'],
|
153
|
+
'type' => d['type'],
|
154
|
+
'reset_interval' => d['reset_interval'],
|
155
|
+
'last_reset_at' => EventTime.new(*d['last_reset_at']),
|
156
|
+
}
|
157
|
+
end
|
158
|
+
|
159
|
+
# value is Hash. value requires these fileds.
|
160
|
+
# :name, :total, :current, :type, :reset_interval, :last_reset_at, :last_modified_at
|
161
|
+
def build_value(data)
|
162
|
+
type = data['type'] || 'numeric'
|
163
|
+
now = EventTime.now
|
164
|
+
t = [now.sec, now.nsec]
|
165
|
+
|
166
|
+
v = initial_value(type)
|
167
|
+
|
168
|
+
data.merge(
|
169
|
+
'type' => type,
|
170
|
+
'last_reset_at' => t,
|
171
|
+
'last_modified_at' => t,
|
172
|
+
'current' => v,
|
173
|
+
'total' => v,
|
174
|
+
)
|
175
|
+
end
|
176
|
+
|
177
|
+
def initial_value(type)
|
178
|
+
case type
|
179
|
+
when 'numeric', 'integer' then 0
|
180
|
+
when 'float' then 0.0
|
181
|
+
else raise InvalidParams.new('`type` should be integer, float, or numeric')
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def valid_type!(v, value)
|
186
|
+
type = v['type']
|
187
|
+
return unless (type != 'numeric') && (type_str(value) != type)
|
188
|
+
raise InvalidParams.new("`type` is #{type}. You should pass #{type} value as a `value`")
|
189
|
+
end
|
190
|
+
|
191
|
+
def type_str(v)
|
192
|
+
case v
|
193
|
+
when Integer
|
194
|
+
'integer'
|
195
|
+
when Float
|
196
|
+
'float'
|
197
|
+
when Numeric
|
198
|
+
'numeric'
|
199
|
+
else
|
200
|
+
raise InvalidParams.new("`type` should be integer, float, or numeric")
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
@@ -0,0 +1,145 @@
|
|
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/counter/error'
|
18
|
+
|
19
|
+
module Fluent
|
20
|
+
module Counter
|
21
|
+
class Validator
|
22
|
+
VALID_NAME = /\A[a-z][a-zA-Z0-9\-_]*\Z/
|
23
|
+
VALID_SCOPE_NAME = /\A[a-z][\ta-zA-Z0-9\-_]*\Z/
|
24
|
+
VALID_METHODS = %w(establish init delete inc get reset)
|
25
|
+
|
26
|
+
def self.request(data)
|
27
|
+
errors = []
|
28
|
+
raise "Received data is not Hash: #{data}" unless data.is_a?(Hash)
|
29
|
+
|
30
|
+
unless data['id']
|
31
|
+
errors << Fluent::Counter::InvalidRequest.new('Request should include `id`')
|
32
|
+
end
|
33
|
+
|
34
|
+
if !data['method']
|
35
|
+
errors << Fluent::Counter::InvalidRequest.new('Request should include `method`')
|
36
|
+
elsif !(VALID_NAME =~ data['method'])
|
37
|
+
errors << Fluent::Counter::InvalidRequest.new('`method` is the invalid format')
|
38
|
+
elsif !VALID_METHODS.include?(data['method'])
|
39
|
+
errors << Fluent::Counter::MethodNotFound.new("Unknown method name passed: #{data['method']}")
|
40
|
+
end
|
41
|
+
|
42
|
+
errors.map(&:to_hash)
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize(*types)
|
46
|
+
@types = types.map(&:to_s)
|
47
|
+
@empty = @types.delete('empty')
|
48
|
+
end
|
49
|
+
|
50
|
+
def call(data)
|
51
|
+
success = []
|
52
|
+
errors = []
|
53
|
+
|
54
|
+
if @empty && data.empty?
|
55
|
+
errors << Fluent::Counter::InvalidParams.new('One or more `params` are required')
|
56
|
+
else
|
57
|
+
data.each do |d|
|
58
|
+
begin
|
59
|
+
@types.each { |type| dispatch(type, d) }
|
60
|
+
success << d
|
61
|
+
rescue => e
|
62
|
+
errors << e
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
[success, errors]
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def dispatch(type, data)
|
73
|
+
send("validate_#{type}!", data)
|
74
|
+
rescue NoMethodError => e
|
75
|
+
raise Fluent::Counter::InternalServerError.new(e)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class ArrayValidator < Validator
|
80
|
+
def validate_key!(name)
|
81
|
+
unless name.is_a?(String)
|
82
|
+
raise Fluent::Counter::InvalidParams.new('The type of `key` should be String')
|
83
|
+
end
|
84
|
+
|
85
|
+
unless VALID_NAME =~ name
|
86
|
+
raise Fluent::Counter::InvalidParams.new('`key` is the invalid format')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def validate_scope!(name)
|
91
|
+
unless name.is_a?(String)
|
92
|
+
raise Fluent::Counter::InvalidParams.new('The type of `scope` should be String')
|
93
|
+
end
|
94
|
+
|
95
|
+
unless VALID_SCOPE_NAME =~ name
|
96
|
+
raise Fluent::Counter::InvalidParams.new('`scope` is the invalid format')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class HashValidator < Validator
|
102
|
+
def validate_name!(hash)
|
103
|
+
name = hash['name']
|
104
|
+
unless name
|
105
|
+
raise Fluent::Counter::InvalidParams.new('`name` is required')
|
106
|
+
end
|
107
|
+
|
108
|
+
unless name.is_a?(String)
|
109
|
+
raise Fluent::Counter::InvalidParams.new('The type of `name` should be String')
|
110
|
+
end
|
111
|
+
|
112
|
+
unless VALID_NAME =~ name
|
113
|
+
raise Fluent::Counter::InvalidParams.new("`name` is the invalid format")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def validate_value!(hash)
|
118
|
+
value = hash['value']
|
119
|
+
unless value
|
120
|
+
raise Fluent::Counter::InvalidParams.new('`value` is required')
|
121
|
+
end
|
122
|
+
|
123
|
+
unless value.is_a?(Numeric)
|
124
|
+
raise Fluent::Counter::InvalidParams.new("The type of `value` type should be Numeric")
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def validate_reset_interval!(hash)
|
129
|
+
interval = hash['reset_interval']
|
130
|
+
|
131
|
+
unless interval
|
132
|
+
raise Fluent::Counter::InvalidParams.new('`reset_interval` is required')
|
133
|
+
end
|
134
|
+
|
135
|
+
unless interval.is_a?(Numeric)
|
136
|
+
raise Fluent::Counter::InvalidParams.new('The type of `reset_interval` should be Numeric')
|
137
|
+
end
|
138
|
+
|
139
|
+
if interval < 0
|
140
|
+
raise Fluent::Counter::InvalidParams.new('`reset_interval` should be a positive number')
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,23 @@
|
|
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/counter/client'
|
18
|
+
require 'fluent/counter/server'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Counter
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
here = File.dirname(__FILE__)
|
5
|
+
$LOAD_PATH << File.expand_path(File.join(here, '..'))
|
6
|
+
|
7
|
+
require 'serverengine'
|
8
|
+
require 'fluent/supervisor'
|
9
|
+
|
10
|
+
server_module = Fluent.const_get(ARGV[0])
|
11
|
+
worker_module = Fluent.const_get(ARGV[1])
|
12
|
+
# it doesn't call ARGV in block because when reloading config, params will be initialized and then it can't use previous config.
|
13
|
+
config_path = ARGV[2]
|
14
|
+
params = JSON.parse(ARGV[3])
|
15
|
+
ServerEngine::Daemon.run_server(server_module, worker_module) { Fluent::Supervisor.load_config(config_path, params) }
|