class Fluent::RecordReformerOutput::RubyPlaceholderExpander

THIS CLASS MUST BE THREAD-SAFE

Attributes

log[R]

Public Class Methods

new(params) click to toggle source
# File lib/fluent/plugin/out_record_reformer.rb, line 267
def initialize(params)
  @log = params[:log]
  @auto_typecast = params[:auto_typecast]
  @cleanroom_expander = CleanroomExpander.new
end

Public Instance Methods

preprocess_map(value, force_stringify = false) click to toggle source

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/out_record_reformer.rb, line 281
      def preprocess_map(value, force_stringify = false)
        new_value = nil
        if value.is_a?(String)
          if @auto_typecast and !force_stringify
            num_placeholders = value.scan('${').size
            if num_placeholders == 1 and 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 "record_reformer: 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_reformer_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_reformer_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
time_value(time) click to toggle source
# File lib/fluent/plugin/out_record_reformer.rb, line 273
def time_value(time)
  Time.at(time)
end