THIS CLASS MUST BE THREAD-SAFE
# File lib/fluent/plugin/filter_record_transformer.rb, line 246 def initialize(params) @log = params[:log] @auto_typecast = params[:auto_typecast] @cleanroom_expander = CleanroomExpander.new end
Preprocess record map to convert into ruby string expansion
@param [Hash|String|Array] value record map config @param [Boolean] force_stringify the value must be string, used for hash key
# File lib/fluent/plugin/filter_record_transformer.rb, line 260 def preprocess_map(value, force_stringify = false) new_value = nil if value.is_a?(String) if @auto_typecast && !force_stringify num_placeholders = value.scan('${').size if num_placeholders == 1 && value.start_with?('${') && value.end_with?('}') new_value = value[2..-2] # ${..} => .. end end unless new_value new_value = "%Q[#{value.gsub('${', '#{')}]" # xx${..}xx => %Q[xx#{..}xx] end elsif value.is_a?(Hash) new_value = {} value.each_pair do |k, v| new_value[preprocess_map(k, true)] = preprocess_map(v) end elsif value.is_a?(Array) new_value = [] value.each_with_index do |v, i| new_value[i] = preprocess_map(v) end else new_value = value end new_value end def prepare_placeholders(placeholder_values) placeholder_values end # Expand string with placeholders # # @param [String] str def expand(str, placeholders, force_stringify = false) @cleanroom_expander.expand( str, placeholders['tag'], placeholders['time'], placeholders['record'], placeholders['tag_parts'], placeholders['tag_prefix'], placeholders['tag_suffix'], placeholders['hostname'], ) rescue => e log.warn "failed to expand `#{str}`", error_class: e.class, error: e.message log.warn_backtrace nil end class CleanroomExpander def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname) tags = tag_parts # for old version compatibility Thread.current[:record_transformer_record] = record # for old version compatibility instance_eval(__str_to_eval__) end # for old version compatibility def method_missing(name) key = name.to_s record = Thread.current[:record_transformer_record] if record.has_key?(key) record[key] else raise NameError, "undefined local variable or method `#{key}'" end end (Object.instance_methods).each do |m| 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/ end end end end end
# File lib/fluent/plugin/filter_record_transformer.rb, line 252 def time_value(time) Time.at(time) end