in_tcp: skip emitting an empty event stream when a read has no complete message

Aperta Adatta ai principianti
#5,602 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
78/100
Tipo di issue
Funzionalità
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
ruby

Direzione di ricerca

Read the in_tcp input path and compare its handling with the existing <extract> path, which the issue says already avoids emitting for an empty stream. Check the relevant input tests and add or adjust coverage for a read that completes no message. Done means router.emit_stream is skipped for an empty event stream while completed messages still reach the router.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement
Is your feature request related to a problem? Please describe.

Without <extract>, in_tcp calls router.emit_stream(@tag, es) after every read. It does this even when the read did not complete any message and es is empty. A long message arrives in many reads, so the router, the filters and the output are called many times with an empty stream. The output's emit_count counts these calls too.

With the configuration below, I sent one 1 MiB line in 64 writes of 16 KiB:

ruby -rsocket -e 's = TCPSocket.new("127.0.0.1", 5170); 64.times { s.write("x" * 16384); sleep 0.02 }; s.write("\n"); sleep 1'

monitor_agent then shows:

{"plugin_id":"in_tcp","emit_records":1}
{"plugin_id":"out_null","emit_records":1,"emit_count":66}
<source>
  @type monitor_agent
  bind 127.0.0.1
  port 24220
</source>

<source>
  @type tcp
  @id in_tcp
  tag test
  port 5170
  bind 127.0.0.1
  <parse>
    @type none
  </parse>
</source>

<match test>
  @type null
  @id out_null
</match>
Describe the solution you'd like

Call router.emit_stream only when es is not empty. The <extract> code path already emits nothing for such a read.

Describe alternatives you've considered

Keep the current behavior. The empty streams do not create buffer chunks, because Buffer#write_once returns early for empty data. The cost is the extra calls and the larger emit_count.

Additional context

Tested with Fluentd 1.20.1 (master at 1d6b1129) and Ruby 4.0.9 on Linux.

Lingua principale
Ruby
Stelle
13.6k
Fork
1.4k
Merge medio
1g 1h
PR unite (30g)
61

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di fluent/fluentd

Tutte le issue di fluent/fluentd

Issue simili

Altre issue su Ruby

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.