Skip to content
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

Filelog receiver looses characters #31512

Closed
eloo-abi opened this issue Feb 29, 2024 · 16 comments
Closed

Filelog receiver looses characters #31512

eloo-abi opened this issue Feb 29, 2024 · 16 comments
Labels
bug Something isn't working receiver/filelog

Comments

@eloo-abi
Copy link

Component(s)

receiver/filelog

What happened?

Description

Hi,
we are using the file log receiver since a few weeks to collect our kubernetes pods logs (json) and push them into elasticsearch.
But recently we have found an issue that some characters are going to be lost for unknown reasons.

We have right now only observed this with huge log entries (~800kb)

Steps to Reproduce

Expected Result

Actual Result

Here is a snippet of our log which is outputted by the otel-collector

"relativeEol":"2028-07-01T06:00:00Z","filter":{"reasons":null,"isPurchasable":true},"level,"isCompatible":true,"isLifetime":false,

And as you can see the "level" has no ending quotes, no the json here got corrupted.
Also we are not sure if more characters here are lost.

We had seen a different example where around 20 characters where lost (manually compared from the console log to the output of otel collector)

We are not sure what could case this issue so far as it looks like the json in console looks good.

Our log entries are having the following structure in general. And the issues occur (at least only observed there) in the "short_message" field:

{
    "@timestamp": "...",
    "@version": "1",
    "short_message": " THIS IS THE LONG FIELD (700k characters) WITH THE LOST CHARACTERS",
    "logger_name": "...",
    "thread_name": "...",
    "level_name": "INFO",
    "level_value": 20000
    ...
}

We can right now not ensure that this missing characters issue is not present for smaller issues. 
So its hard to determine at the moment if the logs are reliable or not.

Is anyone else observing this? Or are there known limitations?

Thanks

### Collector version

0.95.0

### Environment information

## Environment
Running as DaemonSet in Kubernetes (EKS)


### OpenTelemetry Collector configuration

```yaml
connectors:
  forward/...: {}
exporters:
  debug: {}
  logging:
    loglevel: info
extensions:
  health_check:
    endpoint: ${env:MY_POD_IP}:13133
processors:
  attributes/security-log:
    actions:
    - action: upsert
      key: tags
      value:
      - security_log
  batch: {}
  filter/namespace-abc:
    logs:
      exclude:
        match_type: regexp
        resource_attributes:
        - key: k8s.container.name
          value: (linkerd.+|mysql-jump-pod.+)
      include:
        match_type: strict
        resource_attributes:
        - key: k8s.namespace.name
          value: abc
  memory_limiter:
    check_interval: 5s
    limit_percentage: 80
    spike_limit_percentage: 25
  transform/json:
    error_mode: ignore
    log_statements:
    - context: log
      statements:
      - merge_maps(attributes, ParseJSON(body), \"upsert\") where IsMatch(body, \"^\\\\{.+\\\\}(\\\)?$\")
      - set(severity_text, attributes[\"level\"]) where attributes[\"level\"] != nil
      - set(body, \"\") where attributes[\"service\"] != nil
receivers:
  filelog:
    exclude: []
    include:
    - /var/log/pods/*/*/*.log
    include_file_name: false
    include_file_path: true
    operators:
    - id: get-format
      routes:
      - expr: body matches \"^\\\\{\"
        output: parser-docker
      - expr: body matches \"^[^ Z]+ \"
        output: parser-crio
      - expr: body matches \"^[^ Z]+Z\"
        output: parser-containerd
      type: router
    - id: parser-crio
      regex: ^(?P<time>[^ Z]+) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$
      timestamp:
        layout: 2006-01-02T15:04:05.999999999Z07:00
        layout_type: gotime
        parse_from: attributes.time
      type: regex_parser
    - combine_field: attributes.log
      combine_with: \"\"
      id: crio-recombine
      is_last_entry: attributes.logtag == 'F'
      max_log_size: 0
      output: extract_metadata_from_filepath
      source_identifier: attributes[\"log.file.path\"]
      type: recombine
    - id: parser-containerd
      regex: ^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$
      timestamp:
        layout: '%Y-%m-%dT%H:%M:%S.%LZ'
        parse_from: attributes.time
      type: regex_parser
    - combine_field: attributes.log
      combine_with: \"\"
      id: containerd-recombine
      is_last_entry: attributes.logtag == 'F'
      max_log_size: 0
      output: extract_metadata_from_filepath
      source_identifier: attributes[\"log.file.path\"]
      type: recombine
    - id: parser-docker
      output: extract_metadata_from_filepath
      timestamp:
        layout: '%Y-%m-%dT%H:%M:%S.%LZ'
        parse_from: attributes.time
      type: json_parser
    - id: extract_metadata_from_filepath
      parse_from: attributes[\"log.file.path\"]
      regex: ^.*\\/(?P<namespace>[^_]+)_(?P<pod_name>[^_]+)_(?P<uid>[a-f0-9\\-]+)\\/(?P<container_name>[^\\._]+)\\/(?P<restart_count>\\d+)\\.log$
      type: regex_parser
    - from: attributes.stream
      to: attributes[\"log.iostream\"]
      type: move
    - from: attributes.container_name
      to: resource[\"k8s.container.name\"]
      type: move
    - from: attributes.namespace
      to: resource[\"k8s.namespace.name\"]
      type: move
    - from: attributes.pod_name
      to: resource[\"k8s.pod.name\"]
      type: move
    - from: attributes.restart_count
      to: resource[\"k8s.container.restart_count\"]
      type: move
    - from: attributes.uid
      to: resource[\"k8s.pod.uid\"]
      type: move
    - from: attributes.log
      to: body
      type: move
    retry_on_failure:
      enabled: true
    start_at: end
service:
  extensions:
  - health_check
  - oidc
  pipelines:
    logs:
      exporters:
      - debug
      processors:
      - memory_limiter
      - batch
      receivers:
      - otlp
      - filelog
    logs/namespace-abc:
      exporters:
      - elasticsearch/abc
      processors:
      - filter/namespace-abc
      - transform/json
      - memory_limiter
      - batch
      receivers:
      - filelog

Log output

No response

Additional context

Maybe we should note that we have increase the max_log_size from the crio-recombine to 0

    - combine_field: attributes.log
      combine_with: \"\"
      id: crio-recombine
      is_last_entry: attributes.logtag == 'F'
      max_log_size: 0

We have done this because others wise our logs would be splitted up into multiple log entries (default of the helm chart was around 100k)

So with this settings we have improved the logs in general but now we run into the missing characters issues.

@eloo-abi eloo-abi added bug Something isn't working needs triage New item requiring triage labels Feb 29, 2024
Copy link
Contributor

Pinging code owners:

See Adding Labels via Comments if you do not have permissions to add labels yourself.

@djaglowski
Copy link
Member

Thanks for reporting @eloo-abi.

manually compared from the console log to the output of otel collector

Can you clarify whether you are tailing the log files and viewing them independently of the collector, vs comparing to output of the debug exporter?


In general, it would be helpful if we can reduce the complexity of the problem space.

Are you able to capture a log file which is not being parsed correctly and then read it through a simpler configuration? This would demonstrate whether the problem is indeed due to the filelog receiver, vs some parsing or other problem. For example, something like below:

exporters:
  debug: {}
receivers:
  filelog:
    include:
    - local/copy.log
    include_file_path: true
    # no operators
service:
  pipelines:
    logs:
      receivers:
      - filelog
      exporters:
      - debug

@JDMooreMN
Copy link

JDMooreMN commented Mar 19, 2024

I believe I am running into this issue too, my pipeline is very similar for extracting containerd logs from a k8s platform. I think it is related with the size of the message being sent to the regex_parser.

With some testing here is what I observed. When a log event is greater than 16385 characters, it seems another log event is sent to the regex-parser which basically is trimming those characters and sending them as a separate event.

Example Log Event with 16385 characters

2024-03-19T11:21:00.839338492-05:00 stdout P 2024-03-13 11:51:00,838 [scheduler-2] INFO  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

Example Logs events with 16431 characters

2024-03-19T11:21:00.839338492-05:00 stdout P 2024-03-13 11:51:00,838 [scheduler-2] INFO  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

Error in Log File

2024-03-19T16:21:52.232Z	error	helper/transformer.go:98	Failed to process entry	{"kind": "receiver", "name": "filelog/pod", "data_type": "logs", "operator_id": "parser-containerd", "operator_type": "regex_parser", "error": "regex pattern does not match", "action": "send", "entry": {"observed_timestamp":"2024-03-19T16:21:52.232389977Z","timestamp":"0001-01-01T00:00:00Z","body":"yfGWG8aXlbNNKW0iw2e5XVDb6RqBg7LLUAbDH5x8WM3OT2","attributes":{"container_name":"hello","log.file.path":"/var/log/pods/XXXXXXXXXXX/hello/0.log","namespace":"XXXXXX-testing","pod_name":"hello-app-68ffdb8cdc-7wlwp","restart_count":"0","uid":"cc7ff6c8-c5c4-494d-ab00-f67d42f17532"},"severity":0,"scope_name":""}}
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*TransformerOperator).HandleEntryError
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/transformer.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ParseWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/parser.go:140
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWithCallback
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/parser.go:112
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/parser.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex.(*Parser).Process
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/parser/regex/regex.go:99
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*WriterOperator).Write
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/writer.go:53
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWithCallback
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/parser.go:122
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/parser.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex.(*Parser).Process
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/parser/regex/regex.go:99
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*WriterOperator).Write
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/helper/writer.go:53
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/file.(*Input).emit
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/operator/input/file/file.go:52
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader.(*Reader).ReadToEnd
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/fileconsumer/internal/reader/reader.go:106
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer.(*Manager).consume.func1
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.89.0/fileconsumer/file.go:174

@djaglowski
Copy link
Member

The cutoff may be related to scanner.DefaultBufferSize but I don't see the mechanism. Maybe something @ChrsMark or @OverOrion could look into?

@OverOrion
Copy link
Contributor

OverOrion commented Mar 26, 2024

Hey @djaglowski, sure thing, I'll take a look at it 👀

@ChrsMark
Copy link
Member

ChrsMark commented Mar 26, 2024

I run some tests and it seems that there is indeed a problem with the regex_parser as @JDMooreMN mentioned. However I'm not sure if this is the cause of the originally reported issue.

So with the following config there is no error:

receivers:
  filelog:
    start_at: beginning
    include:
    - /var/log/busybox/long_files/xl_long_file.log

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    logs:
      receivers: [filelog]
      exporters: [debug]
      processors: []

While when I add a parser it fails:

receivers:
  filelog:
    start_at: beginning
    include:
    - /var/log/busybox/long_files/xl_long_file.log
    operators:
      - id: parser-containerd
        regex: ^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$
        timestamp:
          layout: '%Y-%m-%dT%H:%M:%S.%LZ'
          parse_from: attributes.time
        type: regex_parser

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    logs:
      receivers: [filelog]
      exporters: [debug]
      processors: []

The error I see is the same from #31512 (comment):

2024-03-26T11:46:26.227+0200	error	helper/transformer.go:98	Failed to process entry	{"kind": "receiver", "name": "filelog", "data_type": "logs", "operator_id": "parser-containerd", "operator_type": "regex_parser", "error": "regex pattern does not match", "action": "send"}
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*TransformerOperator).HandleEntryError
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/helper/transformer.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ParseWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/helper/parser.go:140
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWithCallback
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/helper/parser.go:112
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/helper/parser.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex.(*Parser).Process
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/parser/regex/regex.go:106
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*WriterOperator).Write
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/helper/writer.go:53
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/file.(*Input).emit
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/operator/input/file/file.go:52
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader.(*Reader).ReadToEnd
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/fileconsumer/internal/reader/reader.go:89
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer.(*Manager).consume.func1
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.96.0/fileconsumer/file.go:181

Note that the error is no fatal, and the record is logged in the console but apparently it's not properly parsed.

However, in my case it seems that it even fails for logs with less than 16385 characters like the /var/log/busybox/long_files/s_long_file.log 🤔 :

wc -c /var/log/busybox/long_files/*.log                                         
16385 /var/log/busybox/long_files/long_file.log
14698 /var/log/busybox/long_files/s_long_file.log
16431 /var/log/busybox/long_files/xl_long_file.log

@ChrsMark
Copy link
Member

ChrsMark commented Mar 26, 2024

It seems that a log line like 2024-03-19T11:21:00.839338492-05:00 stdout P 2024-03-13 11:51:00,838 [scheduler-2] INFO dLphJ63kHp cannot be parsed by the containerd regepx parser ^(?P<time>[^ ^Z]+Z) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$.

A proper containerd log looks like the following:

2021-06-22T10:27:25.813799277Z stdout F some log

regexp

It could be the timestamp 2024-03-19T11:21:00.839338492-05:00 part 🤔.

If I extend the proper containerd log to the size of 16527 it does not fail.

@JDMooreMN could you double check this please so as we can ensure if the problem you spotted is a valid regexp missmatch of it is related with the size of the log?@JDMooreMN could you double check this please so as we can ensure if the problem you spotted is a valid regexp missmatch of it is related with the size of the log?

@OverOrion
Copy link
Contributor

As @ChrsMark has already pointed out @JDMooreMN your problem is likely with the regexp:
^(?P<time>[^ ^Z]+Z) says that the timestamp field should end with the +Z sequence. But in your case it seems like it's ISO 8061 timestamp, so in order to support both you should use this one:
^(?P<time>[^ ]+(?:Z|[-+]\d{2}:\d{2})) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$


Nevertheless I believe we need a simpler reproducer for the original issue.

@JDMooreMN
Copy link

JDMooreMN commented Mar 26, 2024

@ChrsMark @OverOrion - I am using the below containerd-parser, please use this instead. I am not getting regex related error with the entire message, but like I stated in my initial comment it is seems to be chunked, and second chunk doesn't match because it is missing the expected format. I apologize for the confusion.

        - id: parser-containerd
          regex: ^(?P<time>.+) (?P<stream>stdout|stderr) (?P<logtag>\w) ?(?P<message>.*)
          timestamp:
            layout: '%Y-%m-%dT%H:%M:%S.%s%j'
            parse_from: attributes.time
          type: regex_parser

@ChrsMark
Copy link
Member

Thank's @JDMooreMN!

I'm still not able to reproduce the issue with a minimal setup. In my case the collector manages to parse the whole line successfully.

Here is the config I use:

receivers:
  filelog:
    start_at: beginning
    include:
    - /var/log/busybox/long_files/xl_GH_long_file.log
    operators:
      - id: parser-containerd
        regex: ^(?P<time>.+) (?P<stream>stdout|stderr) (?P<logtag>\w) ?(?P<message>.*)
        timestamp:
          layout: '%Y-%m-%dT%H:%M:%S.%s%j'
          parse_from: attributes.time
        type: regex_parser

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    logs:
      receivers: [filelog]
      exporters: [debug]
      processors: []

And the target file xl_GH_long_file.log:

2024-03-19T11:21:00.839338492-05:00 stdout P 2024-03-13 11:51:00,838 [scheduler-2] INFO  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

Where the log length is:

> wc -c /var/log/busybox/long_files/xl_GH_long_file.log
16436 /var/log/busybox/long_files/xl_GH_long_file.log

@JDMooreMN do I miss anything in the above scenario?

@JDMooreMN
Copy link

@ChrsMark - The only difference I am seeing, is as follows. Can you try start_at: end in your filelog receiver, and test by echoing the log event into the file. With 0.89.0 the error outputs the 2nd chunk it failing to parse, in 0.95.0 it just gives regex parsing error.

echo '<log_event>' >> xl_GH_long_file.log

2024-03-27T21:01:54.752Z	error	helper/transformer.go:98	Failed to process entry	{"kind": "receiver", "name": "filelog/pod", "data_type": "logs", "operator_id": "parser-containerd", "operator_type": "regex_parser", "error": "regex pattern does not match", "action": "send"}
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*TransformerOperator).HandleEntryError
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/transformer.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ParseWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/parser.go:140
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWithCallback
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/parser.go:112
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/parser.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex.(*Parser).Process
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/parser/regex/regex.go:106
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*WriterOperator).Write
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/writer.go:53
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWithCallback
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/parser.go:122
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*ParserOperator).ProcessWith
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/parser.go:98
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/parser/regex.(*Parser).Process
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/parser/regex/regex.go:106
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/helper.(*WriterOperator).Write
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/helper/writer.go:53
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/operator/input/file.(*Input).emit
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/operator/input/file/file.go:52
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer/internal/reader.(*Reader).ReadToEnd
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/fileconsumer/internal/reader/reader.go:81
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza/fileconsumer.(*Manager).consume.func1
	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza@v0.95.0/fileconsumer/file.go:182

@OverOrion
Copy link
Contributor

Hey @JDMooreMN

I was able to reproduce it, the key seems to be the start_at: end option, will investigate it!

It works fine with start_at: beginning (empty file, then echo ...), it only breaks when the it is set to end 👀

@ChrsMark
Copy link
Member

Thank's @JDMooreMN, +1 I can reproduce it as well with start_at: end.

The first part of the long line is properly parsed and then the left over fails to get parsed. The leftover looks like:

LogRecord #1
ObservedTimestamp: 2024-03-28 12:45:20.288996015 +0000 UTC
Timestamp: 1970-01-01 00:00:00 +0000 UTC
SeverityText: 
SeverityNumber: Unspecified(0)
Body: Str(yfGWG8aXlbNNKW0iw2e5XVDb6RqBg7LLUAbDH5x8WM3OT424242)
Attributes:
     -> log.file.name: Str(xl_GH_long_file.log)
Trace ID: 
Span ID: 
Flags: 0
	{"kind": "exporter", "data_type": "logs", "name": "debug"}

@OverOrion feel free to claim this one and let me know if I could help in any way :).

@OverOrion
Copy link
Contributor

Hey @JDMooreMN!

Just opened a PR that should solve this issue. Could you take a moment to test it out on your end as well? Thanks!

@atoulme atoulme removed the needs triage New item requiring triage label Apr 5, 2024
djaglowski added a commit that referenced this issue Apr 23, 2024
**Description:**
Flush could have sent partial input before EOF was reached, this PR
fixes it.

**Link to tracking Issue:** #31512, #32170

**Testing:** Added unit test `TestFlushPeriodEOF`

**Documentation:** Added a note to `force_flush_period` option

---------

Signed-off-by: Szilard Parrag <szilard.parrag@axoflow.com>
Co-authored-by: Daniel Jaglowski <jaglows3@gmail.com>
@ChrsMark
Copy link
Member

Since #32100 was merged it's likely that we have fixed that, right?

@crobert-1
Copy link
Member

Thanks for following up, @ChrsMark, and for confirming this has been resolved, @OverOrion!

Closing as resolved by #32100.

rimitchell pushed a commit to rimitchell/opentelemetry-collector-contrib that referenced this issue May 8, 2024
**Description:**
Flush could have sent partial input before EOF was reached, this PR
fixes it.

**Link to tracking Issue:** open-telemetry#31512, open-telemetry#32170

**Testing:** Added unit test `TestFlushPeriodEOF`

**Documentation:** Added a note to `force_flush_period` option

---------

Signed-off-by: Szilard Parrag <szilard.parrag@axoflow.com>
Co-authored-by: Daniel Jaglowski <jaglows3@gmail.com>
jlg-io pushed a commit to jlg-io/opentelemetry-collector-contrib that referenced this issue May 14, 2024
**Description:**
Flush could have sent partial input before EOF was reached, this PR
fixes it.

**Link to tracking Issue:** open-telemetry#31512, open-telemetry#32170

**Testing:** Added unit test `TestFlushPeriodEOF`

**Documentation:** Added a note to `force_flush_period` option

---------

Signed-off-by: Szilard Parrag <szilard.parrag@axoflow.com>
Co-authored-by: Daniel Jaglowski <jaglows3@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working receiver/filelog
Projects
None yet
Development

No branches or pull requests

7 participants