Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
7cf52f6
feat: add config example validation script and workflow
patrick-stephens Jul 17, 2026
b2275c9
fix: suppress known failures due to unrelated Fluent Bit issue 12113
patrick-stephens Jul 19, 2026
55d7bac
fix: resolve incorrect syntax in parsers configuration
patrick-stephens Jul 19, 2026
e7ddd72
fix: missing quote for dummy config in geoip filter
patrick-stephens Jul 19, 2026
b44504e
fix: incorrect comment format used in buffering examples
patrick-stephens Jul 19, 2026
fd07b27
fix: naming of parser files
patrick-stephens Jul 19, 2026
a767b5a
fix: incorrect format and quoting for dynatrace
patrick-stephens Jul 19, 2026
483d763
fix: remove redundant and incorrect parser definition for gelf output
patrick-stephens Jul 19, 2026
b134d71
fix: rename tab titles to match usage for containers
patrick-stephens Jul 19, 2026
e5c82b0
fix: use correct language block for legacy config in cpu-metrics input
patrick-stephens Jul 19, 2026
234fa5a
fix: remove tab for conditional processing YAML definition block
patrick-stephens Jul 19, 2026
2212cd4
fix: suppress known failures due to Windows kubelet config
patrick-stephens Jul 19, 2026
5eb82b9
feat: add multi-example validation
patrick-stephens Jul 19, 2026
4eb6302
fix: additional failures in tail examples
patrick-stephens Jul 19, 2026
f2e026a
fix: incorrect elasticsearch output name used in routing
patrick-stephens Jul 19, 2026
9bc87c3
fix: resolve routing examples
patrick-stephens Jul 19, 2026
6a0172b
fix: resolve loki examples
patrick-stephens Jul 19, 2026
14ec567
feat: remove common leading indentation to prevent spurious failures …
patrick-stephens Jul 19, 2026
a884bb8
feat: support configurable image
patrick-stephens Jul 19, 2026
25e3a3c
fix: resolve sql indentiation issue
patrick-stephens Jul 19, 2026
ca08d54
fix: resolve missing AVRO support in release FB for Kafka
patrick-stephens Jul 19, 2026
0bd5387
fix: resolve s3 examples
patrick-stephens Jul 19, 2026
71bac14
fix: resolve lua in kafka examples
patrick-stephens Jul 19, 2026
68d6a34
fix: resolve quoting for blob input
patrick-stephens Jul 19, 2026
838e395
fix: resolve examples for K8S filter
patrick-stephens Jul 19, 2026
be6a651
docs: fix Vale and markdownlint findings across PR files
eschabell Jul 31, 2026
d3b2c6d
docs: ci: fix example validation workflow and script defects
eschabell Aug 3, 2026
60ce9ed
Extract file change detection into standalone reusable scripts
patrick-stephens Aug 7, 2026
247205b
fix: resolve issue with incorrect ref used
patrick-stephens Aug 7, 2026
6061f81
fix: resolve parser filter failures due to invalid path
patrick-stephens Aug 7, 2026
63e4b49
docs: outputs: file: add log rotation support and configuration examp…
SagiROosto Aug 4, 2026
689d74a
docs: maintainers: Updated company references. (#2660)
eschabell Aug 4, 2026
5155832
docs: pipeline: filters: expect: document per-record batch behavior (…
eschabell Aug 5, 2026
7107de3
docs: installation: linux: document service restart on package upgrad…
eschabell Aug 5, 2026
68f6d92
docs: pipeline: outputs: gcs: add Google Cloud Storage output plugin …
eschabell Aug 5, 2026
c7e5120
docs: administration: document adaptive flush intervals and FIPS mode…
eschabell Aug 5, 2026
51daac5
docs: pipeline: inputs: tail: document windows.path_encoding (#2641)
eschabell Aug 5, 2026
6c17c1a
docs: pipeline: inputs: kubernetes-events: document kube_watch_timeou…
eschabell Aug 5, 2026
d103dd1
docs: pipeline: inputs: node-exporter-metrics: document powersupplycl…
eschabell Aug 5, 2026
4954163
docs: pipeline: filters: rewrite_tag: document emitter cycle rejectio…
eschabell Aug 5, 2026
91c292f
docs: administration: document pause behavior for HTTP-based inputs (…
eschabell Aug 5, 2026
2031f5b
docs: administration: yaml: document the extensions section (#2650)
eschabell Aug 5, 2026
a03a0fd
docs: document behavior changes for s3 log_key and HTTP server (#2649)
eschabell Aug 5, 2026
c23e995
docs: administration: transport-security: document certificate reload…
eschabell Aug 5, 2026
77579f9
docs: pipeline: outputs: elasticsearch: document the elasticsearch al…
eschabell Aug 5, 2026
6637e88
docs: administration: document logs tag records telemetry metrics (#2…
eschabell Aug 5, 2026
3b83d66
docs: pipeline: outputs: file: document dynamic destinations (#2639)
eschabell Aug 5, 2026
aba7dd0
docs: administration: http-proxy: document tls.proxy.* options (#2651)
antoniomrfranco Aug 6, 2026
077fd4b
release: update to v5.1.0 (#2662)
fluent-bot Aug 6, 2026
2b28e5e
docs: installation: consolidate what's new pages into a rolling v5 pa…
eschabell Aug 7, 2026
caf7b84
docs pipeline: outputs: syslog: document DTLS transport mode (#2643)
eschabell Aug 7, 2026
1ee3d0d
docs: fix broken and redirected links from link checker report (#2661)
eschabell Aug 7, 2026
9912da4
docs: pipeline: outputs: kafka: document schema registry support (#2640)
eschabell Aug 7, 2026
376f343
docs: installation: downloads: docker: document Windows Server 2025 a…
eschabell Aug 7, 2026
2b48db3
docs: pipeline: buffering: document input rate gate and rate window (…
eschabell Aug 7, 2026
b9df496
docs: pipeline: inputs: node-exporter-metrics: mark timex collector r…
eschabell Aug 7, 2026
bba8472
fix: resolve overuse of parser config
patrick-stephens Aug 7, 2026
a3ed4f5
docs: update contribution guide
patrick-stephens Aug 7, 2026
a283687
fix: resolve missing env var
patrick-stephens Aug 7, 2026
fdeb858
fix: unsupported Avro config
patrick-stephens Aug 7, 2026
433bdbe
fix: resolve overuse of parser config
patrick-stephens Aug 7, 2026
944156f
fix: ignore Windows specific tail config
patrick-stephens Aug 7, 2026
bed2564
fix: ignore Windows events plugin
patrick-stephens Aug 7, 2026
aba5558
fix: resolve lint failure
patrick-stephens Aug 7, 2026
029cff2
Merge branch 'master' into 2459_auto_validate_config_examples
patrick-stephens Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/workflows/pr-example-validation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Validate example configurations in PRs

on:
pull_request:
paths:
- '**/*.md'

permissions: {}

# Avoid multiple commits on the same PR racing to update the comment.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
validate-configs:
name: Validate example configurations in changed Markdown files
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Check out code
uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false

- name: Validate example configurations in changed files
run: |
./scripts/validate-changed-files.sh "${{ github.event.pull_request.base.sha }}" HEAD
shell: bash
Comment thread
eschabell marked this conversation as resolved.
4 changes: 4 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,10 @@ Every plugin page should include both a YAML and a classic configuration example
{% endtabs %}
```

We have some checks in CI to validate these examples so ensure the `scripts/validate-changed-files.sh` script passes for your branch vs the origin.
This uses the Fluent Bit linux container so may not always pass, e.g. for Windows plugins.
Suppressions can be defined in the `scripts/test-config.sh` script with a comment explaining why.

### Key casing in examples

Key casing differs between the two configuration formats:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ parsers:
1. Update the `parsers_file` parameter in the `service` section of your YAML configuration file:

{% tabs %}
{% tab title="fluent-bit.yaml" %}
{% tab title="custom-parsers-fluent-bit.yaml" %}

```yaml
service:
Expand Down
6 changes: 3 additions & 3 deletions installation/downloads/docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ docker run -ti cr.fluentbit.io/fluent/fluent-bit
Use the following command to start Fluent Bit while using a configuration file:

{% tabs %}
{% tab title="fluent-bit.conf" %}
{% tab title="Legacy Configuration: fluent-bit.conf" %}

```shell
docker run -ti -v ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf \
Expand All @@ -24,7 +24,7 @@ docker run -ti -v ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf \

{% endtab %}

{% tab title="fluent-bit.yaml" %}
{% tab title="YAML configuration: fluent-bit.yaml" %}

```shell
docker run -ti -v ./fluent-bit.yaml:/fluent-bit/etc/fluent-bit.yaml \
Expand Down Expand Up @@ -317,7 +317,7 @@ The reasons for using distroless are well covered in
- Reduces false positives on scans (and reduces resources required for scanning).
- Reduces supply chain security requirements to only what you need.
- Helps prevent unauthorised processes or users interacting with the container.
- Less need to harden the container (and container runtime, K8s, and so on).
- Less need to harden the container (and container runtime, Kubernetes, and so on).
- Faster CI/CD processes.

With any choice, there are downsides:
Expand Down
4 changes: 0 additions & 4 deletions local-testing/validating-your-data-and-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ The following is the Fluent Bit YAML configuration file:
service:
flush: 1
log_level: info
parsers_file: parsers.yaml

pipeline:
inputs:
Expand Down Expand Up @@ -128,7 +127,6 @@ The following is the Fluent Bit classic configuration file:
[SERVICE]
flush 1
log_level info
parsers_file parsers.conf

[INPUT]
name tail
Expand Down Expand Up @@ -177,7 +175,6 @@ The following is the Fluent Bit YAML configuration file:
service:
flush: 1
log_level: info
parsers_file: parsers.yaml

pipeline:
inputs:
Expand Down Expand Up @@ -230,7 +227,6 @@ pipeline:
[SERVICE]
flush 1
log_level info
parsers_file parsers.conf

[INPUT]
name tail
Expand Down
6 changes: 4 additions & 2 deletions pipeline/buffering.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ pipeline:
# Inherits storage.type: filesystem from service

- name: mem
storage.type: memory # Overrides the inherited default
# Overrides the inherited default
storage.type: memory
```

{% endtab %}
Expand All @@ -124,7 +125,8 @@ pipeline:

[INPUT]
Name mem
Storage.Type memory # Overrides the inherited default
# Overrides the inherited default
Storage.Type memory
```

{% endtab %}
Expand Down
2 changes: 1 addition & 1 deletion pipeline/filters/geoip2-filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ The following configuration processes the incoming `remote_addr` and appends cou
pipeline:
inputs:
- name: dummy
dummy: {"remote_addr": "8.8.8.8"}
dummy: '{"remote_addr": "8.8.8.8"}'

filters:
- name: geoip2
Expand Down
6 changes: 0 additions & 6 deletions pipeline/filters/grep.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,6 @@ fluent-bit -i tail -p 'path=lines.txt' -F grep -p 'regex=log aa' -m '*' -o stdou
{% tab title="fluent-bit.yaml" %}

```yaml
service:
parsers_file: /path/to/parsers.conf

pipeline:
inputs:
- name: tail
Expand All @@ -78,9 +75,6 @@ pipeline:
{% tab title="fluent-bit.conf" %}

```text
[SERVICE]
Parsers_File /path/to/parsers.conf

[INPUT]
Name tail
Path lines.txt
Expand Down
11 changes: 6 additions & 5 deletions pipeline/filters/kubernetes.md
Original file line number Diff line number Diff line change
Expand Up @@ -360,10 +360,11 @@ pipeline:
{% tab title="fluent-bit.conf" %}

```text
[PARSER]
Name custom-tag
Format regex
Regex ^(?<namespace_name>[^_]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>.+)\.(?<container_id>[a-z0-9]{64})
# Ensure this is added to parsers_file loaded in the SERVICE section
# [PARSER]
# Name custom-tag
# Format regex
# Regex ^(?<namespace_name>[^_]+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<container_name>.+)\.(?<container_id>[a-z0-9]{64})

[INPUT]
Name tail
Expand Down Expand Up @@ -488,7 +489,7 @@ pipeline:
parser: docker
docker_mode: on
mem_buf_limit: 50MB
skip_login_lines: on
skip_long_lines: on
refresh_interval: 10

filters:
Expand Down
6 changes: 4 additions & 2 deletions pipeline/filters/multiline-stacktrace.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ This is the primary Fluent Bit YAML configuration file. It includes the `parsers
service:
flush: 1
log_level: info
parsers_file: parsers_multiline.yaml
# Configure this to load your custom parser if required
# parsers_file: parsers_multiline.yaml
Comment thread
patrick-stephens marked this conversation as resolved.

pipeline:
inputs:
Expand Down Expand Up @@ -100,7 +101,8 @@ This is the primary Fluent Bit classic configuration file. It includes the `pars
[SERVICE]
Flush 1
Log_Level info
Parsers_File parsers_multiline.conf
# Configure this to load your custom parser if required
# Parsers_File parsers_multiline.conf

[INPUT]
Name tail
Expand Down
27 changes: 15 additions & 12 deletions pipeline/filters/parser.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ The plugin supports the following configuration parameters:
| `parser` | Specify the parser name to interpret the field. Multiple parser entries are allowed (one per line). | _none_ |
| `preserve_key` | Keep the original `key_name` field in the parsed result. If false, the field will be removed. | `false` |
| `reserve_data` | Keep all other original fields in the parsed result. If false, all other original fields will be removed. | `false` |
| `Unescape_key` | Deprecated. This option is retained only for backward compatibility and should not be used in new configurations. | _deprecated_ |
| `Unescape_key` | Deprecated. This option is retained only for backward compatibility and shouldn't be used in new configurations. | _deprecated_ |

## Get started

Expand All @@ -27,7 +27,7 @@ The plugin needs a parser file which defines how to parse each field.
This is an example of parsing a record `{"data":"100 0.5 true This is example"}`.

{% tabs %}
{% tab title="fluent-bit.yaml" %}
{% tab title="parser.yaml" %}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

```yaml
parsers:
Expand All @@ -37,7 +37,7 @@ parsers:
```

{% endtab %}
{% tab title="fluent-bit.conf" %}
{% tab title="parser.conf" %}

```text
[PARSER]
Expand All @@ -55,8 +55,9 @@ The path of the parser file should be written in configuration file under the `[
{% tab title="fluent-bit.yaml" %}

```yaml
service:
parsers_file: /path/to/parsers.yaml
# service:
# Provide the actual path here
# parsers_file: /path/to/parsers.yaml
Comment thread
patrick-stephens marked this conversation as resolved.

pipeline:
inputs:
Expand All @@ -80,7 +81,7 @@ pipeline:

```text
[SERVICE]
Parsers_File /path/to/parsers.conf
# Parsers_File /path/to/parsers.conf

[INPUT]
Name dummy
Expand Down Expand Up @@ -154,8 +155,9 @@ Now add `reserve_data` to the filter section of the corresponding configuration
{% tab title="fluent-bit.yaml" %}

```yaml
service:
parsers_file: /path/to/parsers.yaml
# service:
# Provide the actual path here
# parsers_file: /path/to/parsers.yaml

pipeline:
inputs:
Expand All @@ -180,7 +182,7 @@ pipeline:

```text
[SERVICE]
Parsers_File /path/to/parsers.conf
# Parsers_File /path/to/parsers.conf

[INPUT]
Name dummy
Expand Down Expand Up @@ -248,8 +250,9 @@ Now add `reserve_data` and `preserve_key` to the filter section of the correspon
{% tab title="fluent-bit.yaml" %}

```yaml
service:
parsers_file: /path/to/parsers.yaml
# service:
# Provide the actual path here
# parsers_file: /path/to/parsers.yaml

pipeline:
inputs:
Expand All @@ -275,7 +278,7 @@ pipeline:

```text
[SERVICE]
Parsers_File /path/to/parsers.conf
# Parsers_File /path/to/parsers.conf

[INPUT]
Name dummy
Expand Down
4 changes: 2 additions & 2 deletions pipeline/inputs/blob.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ This example excludes certain file patterns and uses filesystem storage for bett
pipeline:
inputs:
- name: blob
path: /data/artifacts/**/*
exclude_pattern: *.tmp,*.bak,*.old
path: '/data/artifacts/**/*'
exclude_pattern: '*.tmp,*.bak,*.old'
storage.type: filesystem
storage.pause_on_chunks_overlimit: true
mem_buf_limit: 50M
Expand Down
2 changes: 1 addition & 1 deletion pipeline/inputs/cpu-metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pipeline:
{% endtab %}
{% tab title="fluent-bit.conf" %}

```shell
```text
[INPUT]
Name cpu
Tag my_cpu
Expand Down
6 changes: 4 additions & 2 deletions pipeline/inputs/exec-wasi.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ Then, you can specify the `parsers.conf` in the main Fluent Bit configuration:
service:
flush: 1
daemon: off
parsers_file: parsers.yaml
# Configure this to load your custom parser if required
# parsers_file: parsers.yaml
log_level: info
http_server: off
http_listen: 0.0.0.0
Expand All @@ -94,7 +95,8 @@ pipeline:
[SERVICE]
Flush 1
Daemon Off
Parsers_File parsers.conf
# Configure this to load your custom parser if required
# Parsers_File parsers.conf
Log_Level info
HTTP_Server Off
HTTP_Listen 0.0.0.0
Expand Down
25 changes: 22 additions & 3 deletions pipeline/inputs/kafka.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,16 @@ pipeline:
filters:
- name: lua
match: '*'
script: kafka.lua
call: modify_kafka_message
code: |
local count = 0
function modify_kafka_message(tag, timestamp, record)
count = count + 1
local payload = record.payload
payload.topic = record.topic
payload.status = 'processed by fluent-bit, total records: '..tostring(count)
return 1, timestamp, payload
end

outputs:
- name: kafka
Expand All @@ -118,8 +126,8 @@ pipeline:
[FILTER]
Name lua
Match *
Script kafka.lua
Call modify_kafka_message
Code local count = 0 function modify_kafka_message(tag, timestamp, record) count = count + 1 local payload = record.payload payload.topic = record.topic payload.status = 'processed by fluent-bit, total records: '..tostring(count) return 1, timestamp, payload end

[OUTPUT]
Name kafka
Expand All @@ -134,7 +142,18 @@ The previous example will connect to the broker listening on `kafka-broker:9092`

Since the payload will be in JSON format, the plugin is configured to parse the payload with `format json`.

Every message received is then processed with `kafka.lua` and sent back to the `fb-sink` topic of the same broker.
Every message received is then processed with `kafka.lua` and sent back to the `fb-sink` topic of the same broker, this is shown inline for each configuration but is as follows:

```lua
local count = 0
function modify_kafka_message(tag, timestamp, record)
count = count + 1
local payload = record.payload
payload.topic = record.topic
payload.status = 'processed by fluent-bit, total records: '..tostring(count)
return 1, timestamp, payload
end
```
Comment thread
patrick-stephens marked this conversation as resolved.

The example can be executed locally with `make start` in the `examples/kafka_filter` directory (`docker/compose` is used).

Expand Down
Loading