record_accessor raises ArgumentError instead of ConfigError for an array index that is not an integer
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 82/100
Direzione di ricerca
Inizia da plugin_helper/record_accessor.rb, in particolare da parse_dot_array_op e parse_bracket_notation, dove Integer(index_value) genera l’errore segnalato. Leggi la gestione degli errori di sintassi nelle vicinanze ed esegui test/plugin_helper/test_record_accessor.rb. Il lavoro è completato quando gli indici di array non interi generano Fluent::ConfigError e il messaggio contiene la chiave non valida.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
A record_accessor key with an array index that is not an integer, such as $.a[x] or $['a'][x], makes Fluentd stop with ArgumentError instead of Fluent::ConfigError. Fluentd stops either way, but the error is not reported as a config error: on 1.20.1 it is logged as "unexpected error" without the file of the configuration, and on 1.16.11 Fluentd exits with a Ruby backtrace.
The cause is Integer(index_value) in plugin_helper/record_accessor.rb (line 143 in parse_dot_array_op and line 183 in parse_bracket_notation, on master af25743e1 and v1.20.1). The other syntax errors next to them, such as a missing ] or an empty [], raise Fluent::ConfigError, but the ArgumentError of Integer() is not converted.
This affects every plugin that uses record_accessor_create for a key from the configuration, for example filter_grep.
To Reproduce
With this configuration:
<source>
@type sample
tag t
</source>
<filter t>
@type grep
<regexp>
key $.a[x]
pattern /x/
</regexp>
</filter>
<match t>
@type stdout
</match>
run fluentd --dry-run -c fluent.conf.
The same happens without a configuration file:
require "fluent/version"
require "fluent/plugin_helper/record_accessor"
puts "Fluentd #{Fluent::VERSION}"
["$.a[x]", "$['a'][x]", "$.[bad"].each do |key|
Fluent::PluginHelper::RecordAccessor::Accessor.new(key)
puts "#{key}: no error"
rescue => e
puts "#{key}: #{e.class}: #{e.message}"
end
On master (af25743e1) with Ruby 3.4.12, it prints:
Fluentd 1.20.1
$.a[x]: ArgumentError: invalid value for Integer(): "x"
$['a'][x]: ArgumentError: invalid value for Integer(): "x"
$.[bad: Fluent::ConfigError: '[' found but ']' not found. Invalid syntax: $.[bad
With fluentd --dry-run and the configuration above, with each key in <regexp>:
| key | master (af25743e1) and 1.20.1 | 1.16.11 |
|---|---|---|
$.a[x] |
[error]: unexpected error error_class=ArgumentError error="invalid value for Integer(): \"x\"" (exit 1) |
No log line. Exits with a Ruby backtrace: record_accessor.rb:143:in `Integer': invalid value for Integer(): "x" (ArgumentError) (exit 1) |
$['a'][x] (bracket notation) |
The same ArgumentError |
The same backtrace, from line 183 |
$.[bad (for comparison) |
[error]: config error file="fluent.conf" error_class=Fluent::ConfigError error="'[' found but ']' not found. Invalid syntax: $.[bad" |
The same config error |
Expected behavior
Fluent::ConfigError, like the other syntax errors of a record_accessor key, so that Fluentd reports it as a config error with the file and the key, for example "array index must be an integer. Invalid syntax: $.a[x]".
Your Environment
- Fluentd version: master (af25743e1), 1.20.1 and 1.16.11
- Ruby version: 3.4.12 (master, 1.20.1), 3.2.11 (1.16.11)
- Operating system: Linux (Docker, ruby:3.4 and ruby:3.2)
Your Configuration
The configuration is in "To Reproduce" above.
Your Error Log
Fluentd 1.20.1 and master:
[info]: starting fluentd-1.20.1 as dry run mode ruby="3.4.12"
[error]: unexpected error error_class=ArgumentError error="invalid value for Integer(): \"x\""
Fluentd 1.16.11:
[info]: starting fluentd-1.16.11 as dry run mode ruby="3.2.11"
/usr/local/bundle/gems/fluentd-1.16.11/lib/fluent/plugin_helper/record_accessor.rb:143:in `Integer': invalid value for Integer(): "x" (ArgumentError)
For comparison, key $.[bad gives:
[error]: config error file="fluent.conf" error_class=Fluent::ConfigError error="'[' found but ']' not found. Invalid syntax: $.[bad"
Additional context
- I tried rescuing the
ArgumentErrorof the twoInteger(index_value)calls and raisingFluent::ConfigErroron master. The keys above then raiseFluent::ConfigError, and test/plugin_helper/test_record_accessor.rb passes (63 tests). Inparse_bracket_notation, the message should useorig_param, as the other errors there do, becauseparamis only the rest of the key at that point. - A related but different case: a key that ends with
[or.is accepted without an error, and the end is ignored.$.a[,$.a.,$.a..and$['a'][all read the key"a", on master, 1.20.1 and 1.16.11.$.a[1and$.[badraise "'[' found but ']' not found". Inparse_dot_array_op, the loop does not run when nothing follows[, andString#split('.')drops the empty strings at the end. These configurations start today, so making them an error could stop Fluentd after an update; a warning may fit better. I am not asking to change this here, but mention it, as it is next to the code above. - This was found in fluent/fluent-plugin-rewrite-tag-filter, which reports the broken settings of its rules together at startup. To report this key with the others, it would have to rescue this
ArgumentErrorby its message.
- Lingua principale
- Ruby
- Stelle
- 13.6k
- Fork
- 1.4k
- Merge medio
- 1g 1h
- PR unite (30g)
- 61
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di fluent/fluentd
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
in_tcp, in_syslog: a non-ASCII delimiter closes the connection with Encoding::CompatibilityErrorApertabug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 42/100
I maintainer di solito rispondono entro 1 giorno
-
bug enhancement
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
fluent/fluentd#5494 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
BufferChunkOverflowError inside @ERROR loops forever - no buffer parameter can stop itForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertabug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
fluent/fluentd#5462 · 8 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di fluent/fluentd
Issue simili
-
Visual COBOL: missing 11.0 and 12.0, and 9.0 date differs from Rocket Software's lifecycle pageAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
endoflife-date/endoflife.date#11561 ·
I maintainer di solito rispondono entro 1 giorno
-
internal
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
Kong/developer.konghq.com#7954 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Fresh comstockpostproc install fails on import: PyAthena 4.x requires SQLAlchemy 2 (AttributeError: sqlalchemy.types has no attribute DOUBLE)Forse già presa @JanghyunJK l’ha presa oggi. Apertapostprocessing
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
NatLabRockies/ComStock#473 ·
-
No Ruby in CIApertaarea: core area: devops lane: strong-agent priority: P2 roadmap size: S type: removal type: task
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
arminazimi/slipway#1216 ·
I maintainer di solito rispondono entro 1 giorno