fluent/fluentd · error · ConfigError

valid options are # but got #

Error message

valid options are #{list.join(',')} but got #{val}

What it means

For enum parameters (config_param :x, :enum, list: [:a, :b]), enum_value converts the value to a Symbol and checks membership in the plugin-provided :list; a miss raises ConfigError with the exact allowed set in the message. The check runs only after verifying the plugin itself supplied a Symbol array, otherwise the author-facing 'Plugin BUG' error fires first. Comparison is exact and case-sensitive after to_sym, so 'JSON' will not match :json.

Solutions

  1. Use one of the values printed in the error message (they are the plugin's declared list)
  2. Fix typos and casing — the value must match a listed symbol exactly
  3. Check the plugin's docs/config_param declaration for the current allowed set; plugin versions sometimes narrow the list
  4. If you own the plugin, add the value to the :list or switch the param to :string when an open-ended value is legitimate

Example fix

# before
# config_param :format, :enum, list: [:out_file, :json, :ltsv]
<match demo.**>
  @type file
  <format>
    @type ltsvv
  </format>
</match>

# after
<match demo.**>
  @type file
  <format>
    @type ltsv
  </format>
</match>
Defensive patterns

Strategy: validation

Validate before calling

allowed = %i[text json ltsv] # from the plugin's :list
unless allowed.include?(raw_value.to_sym)
  raise ArgumentError, "#{raw_value.inspect} not in #{allowed.join(',')}"
end

Prevention

When it happens

Trigger: config_param :format, :enum, list: [:text, :ltsv] with 'format json' (json not in list), a typo like 'jsonn', wrong casing, or an ENV-expanded value that yields a string outside the declared list.

Common situations: Copy-pasting a value valid for a different plugin (e.g. 'json' where the plugin only accepts :msgpack/:text); typos in long option names; case-mismatched values; upgrading a plugin whose enum list dropped an old value.

Related errors


AI-assisted analysis of fluent/fluentd@dd45c6e18d (2026-08-21). Data as JSON: /api/errors/409282d51d688d02. Report an issue: GitHub.

Appendix: source

Thrown at lib/fluent/config/types.rb:128

    def self.symbol_value(val, opts = {}, name = nil)
      return nil if val.nil? || val.empty?

      val.delete_prefix(":").to_sym
    end

    SYMBOL_TYPE = Proc.new { |val, opts = {}, name = nil|
      Config.symbol_value(val, opts, name)
    }

    def self.enum_value(val, opts = {}, name = nil)
      return nil if val.nil?

      s = val.to_sym
      list = opts[:list]
      raise "Plugin BUG: config type 'enum' requires :list of symbols" unless list.is_a?(Array) && list.all?(Symbol)
      unless list.include?(s)
        raise ConfigError, "valid options are #{list.join(',')} but got #{val}"
      end
      s
    end

    ENUM_TYPE = Proc.new { |val, opts = {}, name = nil|
      Config.enum_value(val, opts, name)
    }

    INTEGER_TYPE = Proc.new { |val, opts = {}, name = nil|
      if val.nil?
        nil
      elsif opts[:strict]
        begin
          Integer(val)
        rescue ArgumentError, TypeError => e
          raise ConfigError, "#{name}: #{e.message}"
        end
      else

View on GitHub (pinned to dd45c6e18d)