-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Long lines are unexpectedly split into multiple OTEL Log records #35042
Comments
Pinging code owners:
See Adding Labels via Comments if you do not have permissions to add labels yourself. |
Although the buffer size is 16KB, the maximum log size is 1024KB. |
The bug still behaves the same when using different values for the flush time out. Although, I have not actually tested a value of |
Ok. Did another quick test and the issue is:
Adding a I'll start investigating why the |
Closing this issue, as |
I'm reopening this issue as I've stumbled onto the same behavior. To clarify, the issue occurs when a log is:
What happens is that the flush function kicks in and ejects the token. What I do not understand yet is why the buffer size does not increase up to max log size before the ejection occurs. If it did, then the ejected token would be the entire log (even though it is not explicitly terminated). |
…pen-telemetry#37596) Fixes open-telemetry#35042 (and open-telemetry#32100 again) The issue affected unterminated logs of particular lengths. Specifically, longer than our internal `scanner.DefaultBufferSize` (16kB) and shorter than `max_log_size`. The failure mode was described in open-telemetry#32100 but was apparently only fixed in some circumstances. I believe this is a more robust fix. I'll articulate the exact failure mode again here: 1. During a poll cycle, `reader.ReadToEnd` is called. Within this, a scanner is created which starts with a default buffer size. The buffer is filled, but no terminator is found. Therefore the scanner resizes the buffer to accommodate more data, hoping to find a terminator. Eventually, the buffer is large enough to contain all content until EOF, but still no terminator was found. At this time, the flush timer has not expired, so `reader.ReadToEnd` returns without emitting anything. 2. During the _next_ poll cycle, `reader.ReadToEnd` creates a new scanner, also with default buffer size. The first time is looks for a terminator, it of course doesn't find one, but at this time the flush timer has expired. Therefore, instead of resizing the buffer and continuing to look for a terminator, it just emits what it has. What should happen instead is the scanner continues to resize the buffer to find as much of the unterminated token as possible before emitting it. Therefore, this fix introduces a simple layer into the split func stack which allows us to reason about unterminated tokens more carefully. It captures the length of unterminated tokens and ensures that when we recreate a scanner, we will start with a buffer size that is appropriate to read the same content as last time, plus one additional byte. The extra byte allows us to check if new content has been added, in which case we will resume resizing. If no new content is found, the flusher will emit the entire unterminated token as one.
Component(s)
pkg/stanza/fileconsumer, receiver/filelog
What happened?
Description
When using the filelog receiver, any lines that are longer than the default buffer size (16KB) will be split into multiple log records instead of one single log record.
Steps to Reproduce
Expected Result
Lines longer than 16KB gets emitted as one single OTEL Log record
Actual Result
Lines longer than 16KB get emitted as multiple OTEL Log records, each record getting split at the 16KB boundary.
Collector version
v0.108.0
Environment information
Environment
OS: Archlinux
Compiler(if manually compiled): go 1.23.0
OpenTelemetry Collector configuration
Log output
No response
Additional context
No response
The text was updated successfully, but these errors were encountered: