-
Notifications
You must be signed in to change notification settings - Fork 5k
[Filebeat] Filestream running as Log input under Elastic Agent or feature flag #46587
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
base: main
Are you sure you want to change the base?
Conversation
🤖 GitHub commentsExpand to view the GitHub comments
Just comment with:
|
|
This pull request does not have a backport label.
To fixup this pull request, you need to add the backport labels for the needed
|
|
Pinging @elastic/elastic-agent-data-plane (Team:Elastic-Agent-Data-Plane) |
|
Have you tested this with the inputs when running as beats receivers? It is critically important that this change has no impact on that conversion right now.
Think of any cases where these changes could interact and make sure there is no impact. |
It should have no effect because the changes are at the input instantiation. Anyways, I'll create tests for those scenarios as well. |
AndersonQ
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I left a few questions
| **`log.file.device_id`** | ||
| : The device ID used for the log file, this is used by the 'native' file identity. | ||
|
|
||
| type: keyword | ||
|
|
||
| required: False | ||
|
|
||
|
|
||
| **`log.file.inode`** | ||
| : The inode of the log file, this is used by the 'native' file identity. | ||
|
|
||
| type: long | ||
|
|
||
| required: False | ||
|
|
||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Out of curiosity, is this related to this PR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some Python tests started failing because those fields were not in fields.yml, so I added them there, which auto-generates this documentation.
I'm debating whether I should just modify the test to ignore those fields 🤔
| // Only allow to run the Log input as Filestream if Filebeat | ||
| // is running under Elastic Agent. | ||
| if !management.UnderAgent() { | ||
| return false, nil | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't it be before the features.LogInputRunFilestream() or together, features.LogInputRunFilestream() && management.UnderAgent()?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Otherwise, it can run as filestream even if it isn't under agent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Otherwise, it can run as filestream even if it isn't under agent.
That's the whole point: the feature flag overwrites everything. This is required to have all the Log input tests to run with Filestream. It also gives us flexibility to test or even use it without Elastic Agent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then, you you mind explaining it a bit better? Perhaps add on the feature flag if it's set, it runs. Then, if it isn't set, it needs to be running under agent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Otherwise, it isn't clear if it was intentional or a mistake
filebeat/input/logv2/input.go
Outdated
| // PluginV2 returns a v2.Plugin with a manager that checks whether | ||
| // the config is from a Log input that should run as Filestream. | ||
| // If that is the case the Log input configuration is converted to | ||
| // Filestream and the Filestream input returned. | ||
| // Otherwise v2.ErrUnknownInput is returned. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems outdated, no error is returned
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's referring to the manager's behaviour. I'll clarify/re-write it.
filebeat/input/logv2/input.go
Outdated
| // When inputs are created, inputs V2 are tried first, so if we | ||
| // are supposed to run as the Log input, return v2.ErrUnknownInput |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm confused. Above you say the input v1 might return v2.ErrUnknownInput so filestream takes over. here you say v2 returns v2.ErrUnknownInput so it runs as the log input.
Is the doc outdated or did I miss something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see it can be confusing, I'll clarify the comments by not mentioning the expected behaviour of other parts of Filebeat.
Inputs V2 are tried first on a standalone Filebeat, but I believe I've seen the opposite happening. Regardless of that both, V1 and V2 inputs will always return v2.ErrUnknownInput if they should not start an input.
| # if the test file contains '.journal', later it will try to remove | ||
| # the '--once' flag and the journald input will be used, | ||
| # so there is nothing to do here. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, what do you mean? I didn't understand what you're trying to clarify here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This whole test is very complex :/
It can work with log files and journal files, for journal files there is some special code. The variable test_file contains the full name of the file the test is going to ingest, if it contains .journal in the name, we know it is trying to ingest a journal file and therefore the journald input will be used.
When adding the changes for the Log input running as Filestream, some of the special handling conflicted, so I added ".journal" not in test_file to this condition to avoid having problems with the cmd.remove("--once") that is done here and down below on L207-L208.
|
elastic/elastic-package#3012 should help testing this PR with Integrations. |
Proposed commit message
I have made corresponding changes to the documentationI have made corresponding change to the default configuration filesI have added an entry inCHANGELOG.next.asciidocorCHANGELOG-developer.next.asciidoc.## Disruptive User ImpactAuthor's Checklist
How to test this PR locally
Manual test
{ "log.level": "debug", "@timestamp": "2025-09-12T12:28:06.899-0400", "log.logger": "input.harvester", "log.origin": { "function": "github.com/elastic/beats/v7/filebeat/input/log.(*Log).Read", "file.name": "log/log.go", "file.line": 111 }, "message": "End of file reached: /tmp/flog.log; Backoff now.", "service.name": "filebeat", "input_id": "94a20b13-6927-4ff4-8f99-4f750469ed96", "source_file": "/tmp/flog.log", "state_id": "native::26052-40", "finished": false, "os_id": "26052-40", "harvester_id": "69128be5-d1f4-4493-935a-889d0461c95d", "ecs.version": "1.6.0" }features:section in the configuration{ "log.level": "debug", "@timestamp": "2025-09-12T12:31:07.586-0400", "log.logger": "input.filestream", "log.origin": { "function": "github.com/elastic/beats/v7/filebeat/input/filestream.(*logFile).Read", "file.name": "filestream/filestream.go", "file.line": 139 }, "message": "End of file reached: /tmp/flog.log; Backoff now.", "service.name": "filebeat", "id": "log-as-filestream", "source_file": "filestream::log-as-filestream::fingerprint::445d01af94a604742ab7bb9db8b5bceff4b780925c2f8c7729165076319fc016", "path": "/tmp/flog.log", "state-id": "fingerprint::445d01af94a604742ab7bb9db8b5bceff4b780925c2f8c7729165076319fc016", "ecs.version": "1.6.0" }Elastic Agent
Create a log file with some lines
docker run -it --rm mingrammer/flog -n 20 > /tmp/flog.logRun a standalone Elastic Agent with the following configuration (adjust the output settings as necessary)
elastic-agent.yml
Ensure all events have been ingested
Look at the logs, you will see Log input logs as described in the manual test
Stop the Elastic Agent
Uncomment
run_as_filestream: truefrom the configurationStart the Elastic Agent again
Ensure no more data is added to the output, no data duplication.
Look at the logs, you will see Filestream input logs as described in the manual test
You can also collect the diagnostics and look at the registry
components/log-defaulttar -xf registry.tar.gzcat registry/filebeat/log.json|jq -Sc{"id":3,"op":"set"} {"k":"filebeat::logs::native::16-50","v":{"FileStateOS":{"device":50,"inode":16},"id":"native::16-50","identifier_name":"native","offset":2113,"prev_id":"","source":"/tmp/flog.log","timestamp":[280186759520503,1762292780],"ttl": -1,"type":"log"}} {"id":4,"op":"set"} {"k":"filestream::your-log-stream-id::native::16-50","v":{"cursor":{"offset":2113},"meta":{"identifier_name":"native","source":"/tmp/flog.log"},"ttl":-1,"updated":[281470681743360,18446744011573954816]}} {"id":5,"op":"remove"} {"k":"filebeat::logs::native::16-50"} {"id":6,"op":"set"} {"k":"filestream::your-log-stream-id::native::16-50","v":{"cursor":{"offset":2113},"meta":{"identifier_name":"native","source":"/tmp/flog.log"},"ttl":-1,"updated":[281470681743360,18446744011573954816]}}Run the tests
Related issues
## Use cases## Screenshots## Logs