app/models/concerns/fluentd/setting/plugin.rb
require "fluent/plugin"
require "fluent/plugin/buf_file"
require "fluent/test/log"
require "fluent/test/driver/input"
require "fluent/test/driver/output"
require "fluent/test/driver/filter"
require "fluent/test/driver/parser"
require "fluent/test/driver/formatter"
class Fluentd
module Setting
module Plugin
extend ActiveSupport::Concern
include ActiveModel::Model
include ActiveModel::Attributes
include Fluentd::Setting::Configurable
include Fluentd::Setting::PluginConfig
include Fluentd::Setting::SectionParser
include Fluentd::Setting::PluginParameter
included do
cattr_accessor :plugin_type, :plugin_name, :config_definition
end
module ClassMethods
def register_plugin(type, name)
self.plugin_type = type
self.plugin_name = name
if ["filter", "output"].include?(type)
include Fluentd::Setting::Pattern
end
if ["input", "filter", "output"].include?(type)
include Fluentd::Setting::Label
end
if ["parser"].include?(type)
include Fluentd::Setting::ParserAdvancedOptions
end
if ["formatter"].include?(type)
include Fluentd::Setting::FormatterAdvancedOptions
end
self.load_plugin_config do |_name, params|
params.each do |param_name, definition|
if definition[:section]
parse_section(param_name, definition)
if %i(buffer storage parse format).include?(param_name)
attribute("#{param_name}_type", :string)
end
else
config_param(param_name, definition[:type] || self._types[param_name], **definition.except(:type))
end
end
end
end
def load_plugin_config
dumped_config = {}
plugin_class.ancestors.reverse_each do |klass|
next unless klass.respond_to?(:dump_config_definition)
dumped_config_definition = klass.dump_config_definition
dumped_config[klass.name] = dumped_config_definition unless dumped_config_definition.empty?
end
self.config_definition = dumped_config
dumped_config.each do |name, config|
yield name, config
end
end
def plugin_instance
@plugin_instance ||= Fluent::Plugin.__send__("new_#{plugin_type}", plugin_name)
end
def plugin_class
@plugin_class ||= plugin_instance.class
end
def create_driver(config)
case plugin_type
when "input"
if plugin_class.class_variable_defined?(:@@pos_file_paths)
plugin_class.class_variable_set(:@@pos_file_paths, {})
end
Fluent::Test::Driver::Input.new(plugin_class).configure(config)
when "output"
if Fluent::Plugin::FileBuffer.class_variable_defined?(:@@buffer_paths)
Fluent::Plugin::FileBuffer.class_variable_set(:@@buffer_paths, {})
end
Fluent::Test::Driver::Output.new(plugin_class).configure(config)
when "filter"
Fluent::Test::Driver::Filter.new(plugin_class).configure(config)
when "parser"
Fluent::Test::Driver::Parser.new(plugin_class).configure(config)
when "formatter"
FLuent::Test::Driver::Formatter.new(plugin_class).configure(config)
else
nil
end
end
def plugin_helpers
@plugin_helpers ||= if plugin_instance.respond_to?(:plugin_helpers)
plugin_instance.plugin_helpers
else
[]
end
end
def section?
false
end
end
end
end
end