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

未关闭 适合新手
#5,602 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@lbarrosby 已经在做这个了。

开始于 2026年11月7日。

  • #5608 来自 @lbarrosby —— 未关闭

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
78/100
Issue 类型
功能
描述清晰度
描述清楚
活跃度
活跃
技术栈
ruby

调研方向

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.

由索引模型根据 Issue 内容生成。

描述

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.

主要语言
Ruby
星标
13.6k
派生
1.4k
平均合并
1 天 1 小时
30 天内合并 PR
61

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

fluent/fluentd 的其他 Issue

查看 fluent/fluentd 的全部 Issue

相似的 Issue

更多 Ruby Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。